private void btnRealizarOperacion_Click(object sender, RoutedEventArgs e) { senalResultado = null; switch (cbTipoOperacion.SelectedIndex) { case 0: //Suma //los metodos estaticos no necesitan una instancia senalResultado = Senal.sumar(senal, senal2); break; case 1: //Multiplicación senalResultado = Senal.multiplicar(senal, senal2); break; case 2: //Convolución senalResultado = Senal.convolucionar(senal, senal2); break; case 3: //Correlación senalResultado = Senal.correlacionar(senal, senal2); break; default: break; } //se actualiza la amplitud maxima del resultado senalResultado.actualizarAmplitudMaxima(); plnGraficaResultado.Points.Clear(); //cambia los valores de la etiqueta //La F es que da el formato para redondear a 2 decimales, la funcion ToString puede recibir un parametro que es el que va a decidir en que formato va a estar,existen varios parametros lblAmplitudMaximaY_Copy.Text = senalResultado.amplitudMaxima.ToString("F"); lblAmplitudMaximaY_Negativa_Copy.Text = "-" + senalResultado.amplitudMaxima.ToString("F"); //hacerlo si la señal no es nula if (senalResultado != null) { //recorrer una coleccion o arreglo //muestra toma el valor de señal.muestra en cada recorrido del ciclo foreach (Muestra muestra in senalResultado.Muestras) { //se evalua la señal, luego se ajusta y de ahi se agrega el punto plnGraficaResultado.Points.Add(new Point((muestra.x - senalResultado.TiempoInicial) * scrResultadoOperacion.Width, (muestra.y / senalResultado.amplitudMaxima * ((scrResultadoOperacion.Height / 2) - 30) * -1) + (scrResultadoOperacion.Height / 2))); } } //Graficando el eje de X plnEjeXResultado.Points.Clear(); //Punto de inicio. plnEjeXResultado.Points.Add(new Point(0, (scrResultadoOperacion.Height / 2))); //Punto de fin. plnEjeXResultado.Points.Add(new Point((senalResultado.TiempoFinal - senalResultado.TiempoInicial) * scrResultadoOperacion.Width, (scrResultadoOperacion.Height / 2))); //Graficando el eje de Y plnEjeYResultado.Points.Clear(); //Punto de inicio. plnEjeYResultado.Points.Add(new Point(0 - senalResultado.TiempoInicial * scrResultadoOperacion.Width, scrResultadoOperacion.Height)); //Punto de fin. plnEjeYResultado.Points.Add(new Point(0 - senalResultado.TiempoInicial * scrResultadoOperacion.Width, scrResultadoOperacion.Height * -1)); }
private void btnGraficar_Click(object sender, RoutedEventArgs e) { AudioFileReader reader = new AudioFileReader(txtRutaArchivo.Text); double tiempoInicial = 0; double tiempoFinal = reader.TotalTime.TotalSeconds; double frecMuestreo = reader.WaveFormat.SampleRate; txtFrecMuestreo.Text = frecMuestreo.ToString(); txtTiempoInicial.Text = "0"; txtTiempoFinal.Text = tiempoFinal.ToString(); senal = new SenalPersonalizada(); senal.TiempoInicial = tiempoInicial; senal.TiempoFinal = tiempoFinal; senal.FrecMuestreo = frecMuestreo; //Construye nuestra señal a través del archivo de audio. var bufferLectura = new float[reader.WaveFormat.Channels]; int muestrasLeidas = 1; double instanteActual = 0; double intervaloMuestra = 1.0 / frecMuestreo; do { muestrasLeidas = reader.Read(bufferLectura, 0, reader.WaveFormat.Channels); if (muestrasLeidas > 0) { double max = bufferLectura.Take(muestrasLeidas).Max(); senal.Muestras.Add(new Muestra(instanteActual, max)); } instanteActual += intervaloMuestra; } while (muestrasLeidas > 0); //Establecer amplitud máxima. senal.actualizarAmplitudMaxima(); amplitudMaxima = senal.amplitudMaxima; //Limpia las gráficas. plnGrafica.Points.Clear(); lblAmplitudMaximaY.Text = amplitudMaxima.ToString("F"); lblAmplitudMaximaY_Negativa.Text = "-" + amplitudMaxima.ToString("F"); //Graficando PRIMERA señal. if (senal != null) { //Recorrer una colección o arreglo. foreach (Muestra muestra in senal.Muestras) { plnGrafica.Points.Add(new Point((muestra.x - tiempoInicial) * scrContenedor.Width, (muestra.y / amplitudMaxima) * ((scrContenedor.Height / 2.0) - 30) * -1 + (scrContenedor.Height / 2))); } } //Graficando el eje de X plnEjeX.Points.Clear(); //Punto de inicio. plnEjeX.Points.Add(new Point(0, (scrContenedor.Height / 2))); //Punto de fin. plnEjeX.Points.Add(new Point((tiempoFinal - tiempoInicial) * scrContenedor.Width, (scrContenedor.Height / 2))); //Graficando el eje de Y plnEjeY.Points.Clear(); //Punto de inicio. plnEjeY.Points.Add(new Point(0 - tiempoInicial * scrContenedor.Width, scrContenedor.Height)); //Punto de fin. plnEjeY.Points.Add(new Point(0 - tiempoInicial * scrContenedor.Width, scrContenedor.Height * -1)); }
private void btnFourier_Click(object sender, RoutedEventArgs e) { Senal transformada = Senal.transformar(senal); transformada.actualizarAmplitudMaxima(); //Limpia las gráficas. plnGraficaResultado.Points.Clear(); lblAmplitudMaximaY_Copy.Text = transformada.amplitudMaxima.ToString("F"); lblAmplitudMaximaY_Negativa_Copy.Text = "-" + transformada.amplitudMaxima.ToString("F"); //Graficando PRIMERA señal. if (transformada != null) { //Recorrer una colección o arreglo. foreach (Muestra muestra in transformada.Muestras) { //Se va graficando la transformada. plnGraficaResultado.Points.Add(new Point((muestra.x - transformada.TiempoInicial) * scrResultadoOperacion.Width, (muestra.y / transformada.amplitudMaxima) * ((scrResultadoOperacion.Height / 2.0) - 30) * -1 + (scrResultadoOperacion.Height / 2))); } double valorMaximo = 0; int indiceMaximo = 0; int indiceActual = 0; //Recorrer una colección o arreglo. foreach (Muestra muestra in transformada.Muestras) { //Buscamos el valor máximo y el indice actual. if (muestra.y > valorMaximo) { valorMaximo = muestra.y; indiceMaximo = indiceActual; } indiceActual++; //Evaluamos en la primera mitad de la gráfica de la transformada. if (indiceActual > (double)transformada.Muestras.Count / 2.0) { break; } } double frecuenciaFundamental = (double)indiceMaximo * senal.FrecMuestreo / (double)transformada.Muestras.Count; lblHz.Text = frecuenciaFundamental.ToString() + " Hz"; } //Graficando el eje de X plnEjeXResultado.Points.Clear(); //Punto de inicio. plnEjeXResultado.Points.Add(new Point(0, (scrResultadoOperacion.Height / 2))); //Punto de fin. plnEjeXResultado.Points.Add(new Point((transformada.TiempoFinal - transformada.TiempoInicial) * scrResultadoOperacion.Width, (scrResultadoOperacion.Height / 2))); //Graficando el eje de Y plnEjeYResultado.Points.Clear(); //Punto de inicio. plnEjeYResultado.Points.Add(new Point(0 - transformada.TiempoInicial * scrResultadoOperacion.Width, scrResultadoOperacion.Height)); //Punto de fin. plnEjeYResultado.Points.Add(new Point(0 - transformada.TiempoInicial * scrResultadoOperacion.Width, scrResultadoOperacion.Height * -1)); }
private void btnGraficar_Click(object sender, RoutedEventArgs e) { double tiempoInicial = double.Parse(txtTiempoInicial.Text); double tiempoFinal = double.Parse(txtTiempoFinal.Text); double frecMuestreo = double.Parse(txtFrecMuestreo.Text); //Primer señal. switch (cbTipoSenal.SelectedIndex) { case 0: //Senoidal. double amplitud = double.Parse(((ConfiguracionSenoidal)(panelConfiguracion.Children[0])).txtAmplitud.Text); double fase = double.Parse(((ConfiguracionSenoidal)(panelConfiguracion.Children[0])).txtFase.Text); double frecuencia = double.Parse(((ConfiguracionSenoidal)(panelConfiguracion.Children[0])).txtFrecuencia.Text); senal = new SenalSenoidal(amplitud, fase, frecuencia); break; case 1: //Rampa. senal = new SenalRampa(); break; case 2: //Exponencial. double alfa = double.Parse(((ConfiguracionExponencial)(panelConfiguracion.Children[0])).txtAlfa.Text); senal = new SenalExponencial(alfa); break; case 3: //Rectangular senal = new SenalRectangular(); break; default: senal = null; break; } senal.TiempoInicial = tiempoInicial; senal.TiempoFinal = tiempoFinal; senal.FrecMuestreo = frecMuestreo; //Segunda señal. switch (cbTipoSenal_2.SelectedIndex) { case 0: //Senoidal. double amplitud = double.Parse(((ConfiguracionSenoidal)(panelConfiguracion_2.Children[0])).txtAmplitud.Text); double fase = double.Parse(((ConfiguracionSenoidal)(panelConfiguracion_2.Children[0])).txtFase.Text); double frecuencia = double.Parse(((ConfiguracionSenoidal)(panelConfiguracion_2.Children[0])).txtFrecuencia.Text); senal2 = new SenalSenoidal(amplitud, fase, frecuencia); break; case 1: //Rampa. senal2 = new SenalRampa(); break; case 2: //Exponencial. double alfa = double.Parse(((ConfiguracionExponencial)(panelConfiguracion_2.Children[0])).txtAlfa.Text); senal2 = new SenalExponencial(alfa); break; case 3: //Rectangular senal2 = new SenalRectangular(); break; default: senal2 = null; break; } senal2.TiempoInicial = tiempoInicial; senal2.TiempoFinal = tiempoFinal; senal2.FrecMuestreo = frecMuestreo; //Construye señal senal.construirSenalDigital(); senal2.construirSenalDigital(); //Escalar PRIMERA SEÑAL. double factorEscala = double.Parse(txtFactorEscalaAmplitud.Text); senal.escalar(factorEscala); //Desplazar PRIMERA SEÑAL. double factorDesplazar = double.Parse(txtFactorDesplazamiento.Text); senal.desplazar(factorDesplazar); senal.actualizarAmplitudMaxima(); //Truncar PRIMERA SEÑAL. /* double factorTruncar = double.Parse(txtUmbral.Text); * senal.truncar(factorTruncar); */ //Escalar SEGUNDA SEÑAL. double factorEscala2 = double.Parse(txtFactorEscalaAmplitud_2.Text); senal2.escalar(factorEscala2); //Desplazar SEGUNDA SEÑAL. double factorDesplazar2 = double.Parse(txtFactorDesplazamiento_2.Text); senal2.desplazar(factorDesplazar2); senal2.actualizarAmplitudMaxima(); //Truncar SEGUNDA SEÑAL. /* double factorTruncar2 = double.Parse(txtUmbral_2.Text); * senal2.truncar(factorTruncar2); */ //Establecer amplitud máxima comparando con AMBAS señales. senal.actualizarAmplitudMaxima(); senal2.actualizarAmplitudMaxima(); //Definimos la amplitud máxima con la primer señal por default y comparamos con la segunda en caso de ser mayor. senal.actualizarAmplitudMaxima(); senal2.actualizarAmplitudMaxima(); amplitudMaxima = senal.amplitudMaxima; if (senal2.amplitudMaxima > amplitudMaxima) { amplitudMaxima = senal2.amplitudMaxima; } //Limpia las gráficas. plnGrafica.Points.Clear(); plnGrafica_2.Points.Clear(); lblAmplitudMaximaY.Text = amplitudMaxima.ToString("F"); lblAmplitudMaximaY_Negativa.Text = "-" + amplitudMaxima.ToString("F"); //Graficando PRIMERA señal. if (senal != null) { //Recorrer una colección o arreglo. foreach (Muestra muestra in senal.Muestras) { plnGrafica.Points.Add(new Point((muestra.x - tiempoInicial) * scrContenedor.Width, (muestra.y / amplitudMaxima) * ((scrContenedor.Height / 2.0) - 30) * -1 + (scrContenedor.Height / 2))); } } //Graficando SEGUNDA señal. if (senal2 != null) { //Recorrer una colección o arreglo. foreach (Muestra muestra in senal2.Muestras) { plnGrafica_2.Points.Add(new Point((muestra.x - tiempoInicial) * scrContenedor.Width, (muestra.y / amplitudMaxima) * ((scrContenedor.Height / 2.0) - 30) * -1 + (scrContenedor.Height / 2))); } } //Graficando el eje de X plnEjeX.Points.Clear(); //Punto de inicio. plnEjeX.Points.Add(new Point(0, (scrContenedor.Height / 2))); //Punto de fin. plnEjeX.Points.Add(new Point((tiempoFinal - tiempoInicial) * scrContenedor.Width, (scrContenedor.Height / 2))); //Graficando el eje de Y plnEjeY.Points.Clear(); //Punto de inicio. plnEjeY.Points.Add(new Point(0 - tiempoInicial * scrContenedor.Width, scrContenedor.Height)); //Punto de fin. plnEjeY.Points.Add(new Point(0 - tiempoInicial * scrContenedor.Width, scrContenedor.Height * -1)); }