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
                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:     //función signo
                señal = new FuncionSigno();
                break;

            case 3:     //exponencial alfa
                double alfa = double.Parse(((ConfiguracionSeñalExponencialAlfa)(panelConfiguracion.Children[0])).txtAlfa.Text);
                señal = new Exponencial_Alfa(alfa);

                break;

            case 4:     //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();
                txtFrecuenciaMuestreo.Text = señal.FrecuenciaMuestreo.ToString();

                break;

            default:
                señal = null;

                break;
            }

            if (cbTipoSeñal.SelectedIndex != 4 && señal != null)
            {
                señal.TiempoFinal        = tiempoFinal;
                señal.TiempoInicial      = tiempoInicial;
                señal.FrecuenciaMuestreo = frecuenciaMuestreo;

                señal.construirSeñal();
            }

            //construir segunda señal
            if (cbOperacion.SelectedIndex == 2 || cbOperacion.SelectedIndex == 4)
            {
                switch (cbTipoSeñal2.SelectedIndex)
                {
                case 0:     //Parabolica
                    segundaSeñal = new SeñalParabolica();

                    break;

                case 1:     //senoidal
                    double amplitud   = double.Parse(((ConfiguracionSeñalSenoidal)(panelConfiguracion2.Children[0])).txtAmplitud.Text);
                    double fase       = double.Parse(((ConfiguracionSeñalSenoidal)(panelConfiguracion2.Children[0])).txtFase.Text);
                    double frecuencia = double.Parse(((ConfiguracionSeñalSenoidal)(panelConfiguracion2.Children[0])).txtFrecuencia.Text);

                    segundaSeñal = new SeñalSenoidal(amplitud, fase, frecuencia);

                    break;

                case 2:     //función signo
                    segundaSeñal = new FuncionSigno();

                    break;

                case 3:     //Exponencial
                    double alfa = double.Parse(((ConfiguracionSeñalExponencialAlfa)(panelConfiguracion2.Children[0])).txtAlfa.Text);
                    segundaSeñal = new Exponencial_Alfa(alfa);

                    break;

                case 4:     //Audio
                    string rutaArchivo = ((ConfiguracionAudio)(panelConfiguracion2.Children[0])).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 (cbTipoSeñal2.SelectedIndex != 4 && 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
                double factorEscala = double.Parse(((ConfiguracionOperacionEscalaAmplitud)(panelConfiguracionOperacion.Children[0])).txtFactorEscala.Text);
                señalResultante = Señal.escalarAmplitud(señal, factorEscala);

                break;

            case 1:     //desplazamiento
                double cantidadDesplazamiento = double.Parse(((ConfiguracionOperacionDesplazamiento)(panelConfiguracionOperacion.Children[0])).txtCantidadDesplazamiento.Text);
                señalResultante = Señal.desplazamientoAmplitud(señal, cantidadDesplazamiento);

                break;

            case 2:     //multiplicacion
                señalResultante = Señal.multiplicarSeñales(señal, segundaSeñal);

                break;

            case 3:     //escala exponencial
                double exponente = double.Parse(((ConfiguracionOperacionEscalaExponencial)(panelConfiguracionOperacion).Children[0]).txtExponente.Text);
                señalResultante = Señal.escalaExponenecial(señal, exponente);

                break;

            case 4:     //limite superior
                señalResultante = Señal.limiteSuperior(señal, segundaSeñal);
                break;

            default:
                señalResultante = null;

                break;
            }

            //Elige entre la primera 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;
            }

            plnGrafica.Points.Clear();
            plnGraficaResultante.Points.Clear();


            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));
            }

            lblAmplitudSuperior.Text = amplitudMaxima.ToString("F");
            lblAmplitudInferior.Text = "-" + amplitudMaxima.ToString("F");

            lblAmplitudResultanteSuperior.Text = amplitudMaxima.ToString("F");
            lblAmplitudResultanteInferior.Text = "-" + amplitudMaxima.ToString("F");

            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));

            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));
        }
        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
                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:     //función signo
                señal = new FuncionSigno();
                break;

            case 3:     //exponencial alfa
                double alfa = double.Parse(((ConfiguracionSeñalExponencialAlfa)(panelConfiguracion.Children[0])).txtAlfa.Text);
                señal = new Exponencial_Alfa(alfa);

                break;

            case 4:     //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();
                txtFrecuenciaMuestreo.Text = señal.FrecuenciaMuestreo.ToString();

                break;

            default:
                señal = null;

                break;
            }

            if (cbTipoSeñal.SelectedIndex != 4 && señal != null)
            {
                señal.TiempoFinal        = tiempoFinal;
                señal.TiempoInicial      = tiempoInicial;
                señal.FrecuenciaMuestreo = frecuenciaMuestreo;

                señal.construirSeñal();
            }

            //construir segunda señal
            if (cbOperacion.SelectedIndex == 2)
            {
                switch (cbTipoSeñal2.SelectedIndex)
                {
                case 0:     //Parabolica
                    segundaSeñal = new SeñalParabolica();

                    break;

                case 1:     //senoidal
                    double amplitud   = double.Parse(((ConfiguracionSeñalSenoidal)(panelConfiguracion2.Children[0])).txtAmplitud.Text);
                    double fase       = double.Parse(((ConfiguracionSeñalSenoidal)(panelConfiguracion2.Children[0])).txtFase.Text);
                    double frecuencia = double.Parse(((ConfiguracionSeñalSenoidal)(panelConfiguracion2.Children[0])).txtFrecuencia.Text);

                    segundaSeñal = new SeñalSenoidal(amplitud, fase, frecuencia);

                    break;

                case 2:     //función signo
                    segundaSeñal = new FuncionSigno();

                    break;

                case 3:     //Exponencial
                    double alfa = double.Parse(((ConfiguracionSeñalExponencialAlfa)(panelConfiguracion2.Children[0])).txtAlfa.Text);
                    segundaSeñal = new Exponencial_Alfa(alfa);

                    break;

                case 4:     //Audio
                    string rutaArchivo = ((ConfiguracionAudio)(panelConfiguracion2.Children[0])).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 (cbTipoSeñal2.SelectedIndex != 4 && 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
                double factorEscala = double.Parse(((ConfiguracionOperacionEscalaAmplitud)(panelConfiguracionOperacion.Children[0])).txtFactorEscala.Text);
                señalResultante = Señal.escalarAmplitud(señal, factorEscala);

                break;

            case 1:     //desplazamiento
                double cantidadDesplazamiento = double.Parse(((ConfiguracionOperacionDesplazamiento)(panelConfiguracionOperacion.Children[0])).txtCantidadDesplazamiento.Text);
                señalResultante = Señal.desplazamientoAmplitud(señal, cantidadDesplazamiento);

                break;

            case 2:     //multiplicacion
                señalResultante = Señal.multiplicarSeñales(señal, segundaSeñal);

                break;

            case 3:     //escala exponencial
                double exponente = double.Parse(((ConfiguracionOperacionEscalaExponencial)(panelConfiguracionOperacion).Children[0]).txtExponente.Text);
                señalResultante = Señal.escalaExponenecial(señal, exponente);

                break;

            case 4:     //transformada de Fourier
                señalResultante = Señal.transformadaFourier(señal);

                break;

            default:
                señalResultante = null;

                break;
            }

            //Elige entre la primera 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;
            }

            plnGrafica.Points.Clear();
            plnGraficaResultante.Points.Clear();
            plnGrafica2.Points.Clear();

            if (segundaSeñal != null)
            {
                foreach (var muestra in segundaSeñal.Muestras)
                {
                    plnGrafica2.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));
            }

            if (cbOperacion.SelectedIndex == 4)
            {
                int indiceMaximo1 = 0;
                int indiceMaximo2 = 0;
                //indices para recorrer la frecuencia baja
                int indiceInicial = (int)(690.0 * (double)(señal.Muestras.Count) / señalResultante.FrecuenciaMuestreo);
                int indiceFinal   = (int)(950.0 * (double)(señal.Muestras.Count) / señalResultante.FrecuenciaMuestreo);

                int indiceAltaInicial = (int)(1200.0 * (double)(señal.Muestras.Count) / señalResultante.FrecuenciaMuestreo);
                int indiceAltaFinal   = (int)(1482.0 * (double)(señal.Muestras.Count) / señalResultante.FrecuenciaMuestreo);

                for (int i = indiceInicial; i <= indiceFinal; i++)
                {
                    if (señalResultante.Muestras[i].Y > señalResultante.Muestras[indiceMaximo1].Y)
                    {
                        indiceMaximo1 = i;
                    }
                }

                for (int j = indiceAltaInicial; j <= indiceAltaFinal; j++)
                {
                    if (señalResultante.Muestras[j].Y > señalResultante.Muestras[indiceMaximo2].Y)
                    {
                        indiceMaximo2 = j;
                    }
                }
                double frecuencia  = (double)(indiceMaximo1 * señal.FrecuenciaMuestreo / señalResultante.Muestras.Count);
                double frecuencia2 = (double)(indiceMaximo2 * señal.FrecuenciaMuestreo / señalResultante.Muestras.Count);
                lblHertzBaja.Text = frecuencia.ToString("N") + " Hz";
                lblHertzAlta.Text = frecuencia2.ToString("N") + " Hz";
                //imprimir la tecla
                if (frecuencia >= 695 && frecuencia <= 698)
                {
                    if (frecuencia2 >= 1207 && frecuencia2 <= 1210)
                    {
                        lblTecla.Text = "1";
                    }
                    else if (frecuencia2 >= 1335 && frecuencia2 <= 1338)
                    {
                        lblTecla.Text = "2";
                    }
                    else if (frecuencia2 >= 1475 && frecuencia2 <= 1480)
                    {
                        lblTecla.Text = "3";
                    }
                }
                else if (frecuencia >= 768 && frecuencia <= 775)
                {
                    if (frecuencia2 >= 1207 && frecuencia2 <= 1210)
                    {
                        lblTecla.Text = "4";
                    }
                    else if (frecuencia2 >= 1335 && frecuencia2 <= 1338)
                    {
                        lblTecla.Text = "5";
                    }
                    else if (frecuencia2 >= 1475 && frecuencia2 <= 1480)
                    {
                        lblTecla.Text = "6";
                    }
                }
                else if (frecuencia >= 849 && frecuencia <= 855)
                {
                    if (frecuencia2 >= 1207 && frecuencia2 <= 1210)
                    {
                        lblTecla.Text = "7";
                    }
                    else if (frecuencia2 >= 1335 && frecuencia2 <= 1338)
                    {
                        lblTecla.Text = "8";
                    }
                    else if (frecuencia2 >= 1475 && frecuencia2 <= 1480)
                    {
                        lblTecla.Text = "9";
                    }
                }
                else if (frecuencia >= 938 && frecuencia <= 945)
                {
                    if (frecuencia2 >= 1207 && frecuencia2 <= 1210)
                    {
                        lblTecla.Text = "*";
                    }
                    else if (frecuencia2 >= 1335 && frecuencia2 <= 1338)
                    {
                        lblTecla.Text = "0";
                    }
                    else if (frecuencia2 >= 1475 && frecuencia2 <= 1480)
                    {
                        lblTecla.Text = "#";
                    }
                }
            }

            lblAmplitudSuperior.Text = amplitudMaxima.ToString("F");
            lblAmplitudInferior.Text = "-" + amplitudMaxima.ToString("F");

            lblAmplitudResultanteSuperior.Text = amplitudMaxima.ToString("F");
            lblAmplitudResultanteInferior.Text = "-" + amplitudMaxima.ToString("F");

            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));

            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));
        }