Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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));
        }
Example #7
0
        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);
            }
        }