public static Señal desplazarAmplitud(Señal señalOriginal, double cantidadDesplazamiento) { SeñalResultante resultado = new SeñalResultante(); foreach (var muestra in señalOriginal.Muestras) { double nuevoValor = muestra.Y + cantidadDesplazamiento; resultado.Muestras.Add(new Muestra(muestra.X, nuevoValor)); if (Math.Abs(nuevoValor) > resultado.AmplitudMaxima) { resultado.AmplitudMaxima = Math.Abs(nuevoValor); } } return(resultado); }
public static Señal limiteInferior( Señal señal1, Señal señal2) { SeñalResultante resultado = new SeñalResultante(); resultado.TiempoInicial = señal1.TiempoInicial; resultado.TiempoFinal = señal1.TiempoFinal; resultado.FrecuenciaDeMuestreo = señal1.FrecuenciaDeMuestreo; int indice = 0; foreach (var muestra in señal1.Muestras) { double valor1 = muestra.Y; double valor2 = señal2.Muestras[indice].Y; double nuevoValor = (muestra.Y + señal2.Muestras[indice].Y) / 2.0; if (valor1 < valor2) { nuevoValor = valor1; } else { nuevoValor = valor2; } resultado.Muestras.Add( new Muestra(muestra.X, nuevoValor)); if (Math.Abs(nuevoValor) > resultado.AmplitudMaxima) { resultado.AmplitudMaxima = Math.Abs(nuevoValor); } indice++; } return(resultado); }
public static Señal escalarAmplitud(Señal señalOriginal, double factorEscala) { SeñalResultante resultado = new SeñalResultante(); resultado.TiempoInicial = señalOriginal.TiempoInicial; resultado.TiempoFinal = señalOriginal.TiempoFinal; resultado.FrecuenciaDeMuestreo = señalOriginal.FrecuenciaDeMuestreo; foreach (var muestra in señalOriginal.Muestras) { double nuevoValor = muestra.Y * factorEscala; resultado.Muestras.Add(new Muestra(muestra.X, nuevoValor)); if (Math.Abs(nuevoValor) > resultado.AmplitudMaxima) { resultado.AmplitudMaxima = Math.Abs(nuevoValor); } } return(resultado); }
public static Señal LimiteSuperior(Señal señal1, Señal señal2) { SeñalResultante resultado = new SeñalResultante { TiempoInicial = señal1.TiempoInicial, TiempoFinal = señal1.TiempoFinal, FrecuenciaMuestreo = señal1.FrecuenciaMuestreo }; int indice = 0; foreach (var muestra in señal1.Muestras) { double nuevoValor = 0; if (muestra.Y >= señal2.Muestras[indice].Y) { nuevoValor = muestra.Y; } else if (muestra.Y < señal2.Muestras[indice].Y) { nuevoValor = señal2.Muestras[indice].Y; } resultado.Muestras.Add(new Muestra( muestra.X, nuevoValor )); if (Math.Abs(nuevoValor) > resultado.AmplitudMaxima) { resultado.AmplitudMaxima = Math.Abs(nuevoValor); } indice++; } return(resultado); }
public static Señal transformadaFourier(Señal señal) { SeñalResultante resultado = new SeñalResultante(); resultado.TiempoInicial = señal.TiempoInicial; resultado.TiempoFinal = señal.TiempoFinal; resultado.FrecuenciaMuestreo = señal.FrecuenciaMuestreo; resultado.IndiceFourier = 0.0; for (int k = 0; k < señal.Muestras.Count; k++) { Complex muestra = 0; // 0 + 0i for (int n = 0; n < señal.Muestras.Count; n++) { muestra += señal.Muestras[n].Y * Complex.Exp((-2 * Math.PI * Complex.ImaginaryOne * k * n) / señal.Muestras.Count); } resultado.Muestras.Add(new Muestra(señal.Muestras[k].X, muestra.Magnitude)); if (Math.Abs(muestra.Magnitude) > resultado.AmplitudMaxima) { resultado.AmplitudMaxima = Math.Abs(muestra.Magnitude); } if (k <= (señal.Muestras.Count / 2)) { double yMuestra = resultado.Muestras[k].Y; if (yMuestra > resultado.IndiceFourier) { resultado.IndiceFourier = k; } } } return(resultado); }
private void BtnGraficar_Click(object sender, RoutedEventArgs e) { /*double amplitud = double.Parse(txtAmplitud.Text); * double fase = double.Parse(txtFase.Text); * double frecuencia = double.Parse(txtFrecuencia.Text);*/ double tiempoInicial = double.Parse(txtTiempoInicial.Text); double tiempoFinal = double.Parse(txtTiempoFinal.Text); double frecuenciaDeMuestreo = double.Parse(txtFrecuenciaDeMuestreo.Text); Señal señal; Señal segundaSeñal = null; Señal señalResultante; switch (cbTipoSeñal.SelectedIndex) { case 0: // Parabólica señal = new SeñalParabolica(); break; case 1: // Senoidal double amplitud = double.Parse(((ConfiguracionSeñalSenoidal)(panelConfiguracion.Children[0])).txtAmplitud.Text); double fase = double.Parse(((ConfiguracionSeñalSenoidal)(panelConfiguracion.Children[0])).txtFase.Text); double frecuencia = double.Parse(((ConfiguracionSeñalSenoidal)(panelConfiguracion.Children[0])).txtFrecuencia.Text); señal = new SeñalSenoidal(amplitud, fase, frecuencia); break; case 2: // Exponencial double alfa = double.Parse(((ConfiguracionSeñalExponencial)(panelConfiguracion.Children[0])).txtAlfa.Text); señal = new SeñalExponencial(alfa); break; case 3: // Audio string rutaArchivo = ((ConfiguracionAudio)(panelConfiguracion.Children[0])).txtRutaArchivo.Text; señal = new SeñalAudio(rutaArchivo); txtTiempoInicial.Text = señal.TiempoInicial.ToString(); txtTiempoFinal.Text = señal.TiempoFinal.ToString(); txtFrecuenciaDeMuestreo.Text = señal.FrecuenciaDeMuestreo.ToString(); break; default: señal = null; break; } if (cbTipoSeñal.SelectedIndex != 3 && señal != null) { señal.TiempoInicial = tiempoInicial; señal.TiempoFinal = tiempoFinal; señal.FrecuenciaDeMuestreo = frecuenciaDeMuestreo; señal.construirSeñal(); } //Construir segunda señal si es necesario if (cbOperacion.SelectedIndex == 2 || cbOperacion.SelectedIndex == 4) { switch (cbTipoSeñal_2.SelectedIndex) { case 0: // Parabólica segundaSeñal = new SeñalParabolica(); break; case 1: // Senoidal double amplitud = double.Parse(((ConfiguracionSeñalSenoidal)(panelConfiguracion_2.Children[0])).txtAmplitud.Text); double fase = double.Parse(((ConfiguracionSeñalSenoidal)(panelConfiguracion_2.Children[0])).txtFase.Text); double frecuencia = double.Parse(((ConfiguracionSeñalSenoidal)(panelConfiguracion_2.Children[0])).txtFrecuencia.Text); segundaSeñal = new SeñalSenoidal(amplitud, fase, frecuencia); break; case 2: // Exponencial double alfa = double.Parse(((ConfiguracionSeñalExponencial)(panelConfiguracion_2.Children[0])).txtAlfa.Text); segundaSeñal = new SeñalExponencial(alfa); break; case 3: // Audio string rutaArchivo = ((ConfiguracionAudio)(panelConfiguracion_2.Children[0])).txtRutaArchivo.Text; segundaSeñal = new SeñalAudio(rutaArchivo); txtTiempoInicial.Text = segundaSeñal.TiempoInicial.ToString(); txtTiempoFinal.Text = segundaSeñal.TiempoFinal.ToString(); txtFrecuenciaDeMuestreo.Text = segundaSeñal.FrecuenciaDeMuestreo.ToString(); break; default: segundaSeñal = null; break; } if (cbTipoSeñal_2.SelectedIndex != 3 && señal != null) { segundaSeñal.TiempoInicial = tiempoInicial; segundaSeñal.TiempoFinal = tiempoFinal; segundaSeñal.FrecuenciaDeMuestreo = frecuenciaDeMuestreo; segundaSeñal.construirSeñal(); } } switch (cbOperacion.SelectedIndex) { case 0: //Escala de amplitud double factorEscala = double.Parse(((OperacionEscalaAmplitud)(panelConfiguracionOperacion.Children[0])).txtFactorEscala.Text); señalResultante = Señal.escalarAmplitud(señal, factorEscala); break; case 1: //Desplazamiento de amplitud double cantidadDesplazamiento = double.Parse(((OperacionDesplazamientoAmplitud)(panelConfiguracionOperacion.Children[0])).txtCantidadDesplazamiento.Text); señalResultante = Señal.desplazarAmplitud(señal, cantidadDesplazamiento); break; case 2: //Multiplicación señalResultante = Señal.multiplicarSeñales(señal, segundaSeñal); break; case 3: //Escala Exponencial double exponente = double.Parse(((OperacionEscalaEsponencial)(panelConfiguracionOperacion.Children[0])).txtExponente.Text); señalResultante = Señal.escalaExponencial(señal, exponente); break; case 4: //Límite Superior señalResultante = Señal.limiteSuperior(señal, segundaSeñal); break; default: señalResultante = null; break; } //Elige entre la 1ra y la resultante double amplitudMaxima = (señal.AmplitudMaxima >= señalResultante.AmplitudMaxima) ? señal.AmplitudMaxima : señalResultante.AmplitudMaxima; if (segundaSeñal != null) { //Elige entre la mas grande de la 1ra y resultante y la segunda amplitudMaxima = (amplitudMaxima >= segundaSeñal.AmplitudMaxima) ? amplitudMaxima : segundaSeñal.AmplitudMaxima; } plnGraficaResultante.Points.Clear(); plnGrafica.Points.Clear(); plnGrafica_2.Points.Clear(); if (segundaSeñal != null) { foreach (var muestra in segundaSeñal.Muestras) { plnGrafica_2.Points.Add(adaptarCoordenadas(muestra.X, muestra.Y, tiempoInicial, amplitudMaxima)); } } foreach (Muestra muestra in señal.Muestras) { plnGrafica.Points.Add(adaptarCoordenadas(muestra.X, muestra.Y, tiempoInicial, amplitudMaxima)); } foreach (Muestra muestra in señalResultante.Muestras) { plnGraficaResultante.Points.Add(adaptarCoordenadas(muestra.X, muestra.Y, tiempoInicial, amplitudMaxima)); } lblLimiteSuperior.Text = amplitudMaxima.ToString("F"); lblLimiteInferior.Text = "-" + amplitudMaxima.ToString("F"); lblLimiteInferiorResultante.Text = "-" + amplitudMaxima.ToString("F"); lblLimiteSuperiorResultante.Text = amplitudMaxima.ToString("F"); //Original plnEjeX.Points.Clear(); plnEjeX.Points.Add( adaptarCoordenadas(tiempoInicial, 0.0, tiempoInicial, amplitudMaxima) ); plnEjeX.Points.Add( adaptarCoordenadas(tiempoFinal, 0.0, tiempoInicial, amplitudMaxima) ); plnEjeY.Points.Clear(); plnEjeY.Points.Add(adaptarCoordenadas(0.0, -amplitudMaxima, tiempoInicial, amplitudMaxima)); plnEjeY.Points.Add(adaptarCoordenadas(0.0, amplitudMaxima, tiempoInicial, amplitudMaxima)); //Resultado plnEjeXResultante.Points.Clear(); plnEjeXResultante.Points.Add(adaptarCoordenadas(tiempoInicial, 0.0, tiempoInicial, amplitudMaxima)); plnEjeXResultante.Points.Add(adaptarCoordenadas(tiempoFinal, 0.0, tiempoInicial, amplitudMaxima)); plnEjeYResultante.Points.Clear(); plnEjeYResultante.Points.Add(adaptarCoordenadas(0.0, amplitudMaxima, tiempoInicial, amplitudMaxima)); plnEjeYResultante.Points.Add(adaptarCoordenadas(0.0, -amplitudMaxima, tiempoInicial, amplitudMaxima)); }
public static Señal transformadaFourier(Señal señal) { SeñalResultante resultado = new SeñalResultante(); resultado.TiempoInicial = señal.TiempoInicial; resultado.TiempoFinal = señal.TiempoFinal; resultado.FrecuenciaMuestreo = señal.FrecuenciaMuestreo; resultado.FrecuenciasHz = new List <double>(); double indiceFourier = 0.0; for (int k = 0; k < señal.Muestras.Count; k++) { Complex muestra = 0; // 0 + 0i for (int n = 0; n < señal.Muestras.Count; n++) { muestra += señal.Muestras[n].Y * Complex.Exp((-2 * Math.PI * Complex.ImaginaryOne * k * n) / señal.Muestras.Count); } resultado.Muestras.Add(new Muestra(señal.Muestras[k].X, muestra.Magnitude)); if (Math.Abs(muestra.Magnitude) > resultado.AmplitudMaxima) { resultado.AmplitudMaxima = Math.Abs(muestra.Magnitude); } if (k <= (señal.Muestras.Count / 2)) { double yMuestra = resultado.Muestras[k].Y; if (yMuestra > indiceFourier) { indiceFourier = k; double frecuenciaHz = (indiceFourier * resultado.FrecuenciaMuestreo) / señal.Muestras.Count; resultado.FrecuenciasHz.Add(frecuenciaHz); } } } double primeraFrecuencia = 0.0; double segundaFrecuencia = 0.0; foreach (double frecuenciaHz in resultado.FrecuenciasHz) { if (frecuenciaHz < 1000) { if (primeraFrecuencia < frecuenciaHz) { primeraFrecuencia = frecuenciaHz; } } else { if (segundaFrecuencia < frecuenciaHz) { segundaFrecuencia = frecuenciaHz; } } } resultado.FrecuenciasHz.Clear(); resultado.FrecuenciasHz.Add(primeraFrecuencia); resultado.FrecuenciasHz.Add(segundaFrecuencia); return(resultado); }
private void BtnGraficar_Click(object sender, RoutedEventArgs e) { double tiempoInicial = double.Parse(txtTiempoInicial.Text); double tiempoFinal = double.Parse(txtTiempoFinal.Text); double frecuenciaMuestreo = double.Parse(txtFrecuenciaMuestreo.Text); Señal señal; Señal segundaSeñal = null; Señal señalResultante; switch (cbTipoSeñal.SelectedIndex) { case 0: // Parabólica señal = new SeñalParabolica(); break; case 1: // Senoidal SeñalSenoidalUC señalSenoidalUC = (SeñalSenoidalUC)panelConfiguracion.Children[0]; double amplitud = double.Parse(señalSenoidalUC.txtAmplitud.Text); double fase = double.Parse(señalSenoidalUC.txtFase.Text); double frecuencia = double.Parse(señalSenoidalUC.txtFrecuencia.Text); señal = new SeñalSenoidal(amplitud, fase, frecuencia); break; case 2: SeñalExponencialUC señalExponencialUC = (SeñalExponencialUC)panelConfiguracion.Children[0]; double alpha = double.Parse(señalExponencialUC.txtAlpha.Text); señal = new SeñalExponencial(alpha); break; case 3: AudioUC audioUC = (AudioUC)panelConfiguracion.Children[0]; string rutaArchivo = audioUC.txtRutaArchivo.Text; señal = new SeñalAudio(rutaArchivo); txtTiempoInicial.Text = señal.TiempoInicial.ToString(); txtTiempoFinal.Text = señal.TiempoFinal.ToString(); txtFrecuenciaMuestreo.Text = señal.FrecuenciaMuestreo.ToString(); break; default: señal = null; break; } if (cbTipoSeñal.SelectedIndex != 3 && señal != null) { señal.TiempoInicial = tiempoInicial; señal.TiempoFinal = tiempoFinal; señal.FrecuenciaMuestreo = frecuenciaMuestreo; señal.construirSeñal(); } // Construir segunda señal si es necesario if (cbOperacion.SelectedIndex == 2) { switch (cbTipoSeñal_2.SelectedIndex) { case 0: // Parabólica segundaSeñal = new SeñalParabolica(); break; case 1: // Senoidal SeñalSenoidalUC señalSenoidalUC = (SeñalSenoidalUC)panelConfiguracion_2.Children[0]; double amplitud = double.Parse(señalSenoidalUC.txtAmplitud.Text); double fase = double.Parse(señalSenoidalUC.txtFase.Text); double frecuencia = double.Parse(señalSenoidalUC.txtFrecuencia.Text); segundaSeñal = new SeñalSenoidal(amplitud, fase, frecuencia); break; case 2: SeñalExponencialUC señalExponencialUC = (SeñalExponencialUC)panelConfiguracion_2.Children[0]; double alpha = double.Parse(señalExponencialUC.txtAlpha.Text); segundaSeñal = new SeñalExponencial(alpha); break; case 3: AudioUC audioUC = (AudioUC)panelConfiguracion_2.Children[0]; string rutaArchivo = audioUC.txtRutaArchivo.Text; segundaSeñal = new SeñalAudio(rutaArchivo); txtTiempoInicial.Text = segundaSeñal.TiempoInicial.ToString(); txtTiempoFinal.Text = segundaSeñal.TiempoFinal.ToString(); txtFrecuenciaMuestreo.Text = segundaSeñal.FrecuenciaMuestreo.ToString(); break; default: segundaSeñal = null; break; } if (segundaSeñal != null) { segundaSeñal.TiempoInicial = tiempoInicial; segundaSeñal.TiempoFinal = tiempoFinal; segundaSeñal.FrecuenciaMuestreo = frecuenciaMuestreo; segundaSeñal.construirSeñal(); } } switch (cbOperacion.SelectedIndex) { case 0: // Escala de amplitud OperacionEscalaAmplitudUC operacionEscalaUC = (OperacionEscalaAmplitudUC)panelConfiguracionOperacion.Children[0]; double factorEscala = double.Parse(operacionEscalaUC.txtFactorEscala.Text); señalResultante = Señal.escalarAmplitud(señal, factorEscala); break; case 1: // Desplazamiento de amplitud OperacionDesplazarAmplitudUC operacionDesplazarUC = (OperacionDesplazarAmplitudUC)panelConfiguracionOperacion.Children[0]; double cantidadDesplazaminto = double.Parse(operacionDesplazarUC.txtCantidadDesplazamiento.Text); señalResultante = Señal.desplazarAmplitud(señal, cantidadDesplazaminto); break; case 2: // Multiplicación de señales señalResultante = Señal.multiplicarSeñales(señal, segundaSeñal); break; case 3: // Escala exponencial OperacionEscalaExponencialUC operacionEscalaExponencialUC = (OperacionEscalaExponencialUC)panelConfiguracionOperacion.Children[0]; double exponenteEscala = double.Parse(operacionEscalaExponencialUC.txtExponente.Text); señalResultante = Señal.escalaExponencial(señal, exponenteEscala); break; case 4: // Transformada de Fourier señalResultante = Señal.transformadaFourier(señal); double indice = señalResultante.IndiceFourier; double numeroMuestras = señalResultante.Muestras.Count; double frecuenciaResultante = señalResultante.FrecuenciaMuestreo; double frecuenciaHz = (indice * frecuenciaResultante) / numeroMuestras; double frecuenciaHzRedondeada = Math.Round(frecuenciaHz, 2); lblHz.Text = frecuenciaHzRedondeada.ToString() + " Hz"; break; default: señalResultante = null; break; } double amplitudMaxima = señal.AmplitudMaxima; plnGrafica.Points.Clear(); plnGraficaResultante.Points.Clear(); plnGrafica_2.Points.Clear(); graficar(señal, tiempoInicial, tiempoFinal, amplitudMaxima, plnGrafica, plnEjeX, plnEjeY, lblLimiteSuperior, lblLimiteInferior); if (señalResultante != null) { double amplitudMaximaResultado = señalResultante.AmplitudMaxima; if (amplitudMaxima > amplitudMaximaResultado) { amplitudMaximaResultado = amplitudMaxima; } else { amplitudMaxima = amplitudMaximaResultado; graficar(señal, tiempoInicial, tiempoFinal, amplitudMaxima, plnGrafica, plnEjeX, plnEjeY, lblLimiteSuperior, lblLimiteInferior); } if (segundaSeñal != null) { double amplitudMaximaSegunda = segundaSeñal.AmplitudMaxima; if (amplitudMaxima > amplitudMaximaSegunda) { amplitudMaximaSegunda = amplitudMaxima; } else { amplitudMaxima = amplitudMaximaSegunda; } graficar(segundaSeñal, tiempoInicial, tiempoFinal, amplitudMaxima, plnGrafica_2, plnEjeX, plnEjeY, lblLimiteSuperior, lblLimiteInferior); } graficar(señalResultante, tiempoInicial, tiempoFinal, amplitudMaximaResultado, plnGraficaResultante, plnEjeXResultante, plnEjeYResultante, lblLimiteSuperiorResultante, lblLimiteInferiorResultante); } }