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:     // Parabolica
                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:
                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 != 2 &&
                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 | cbOperacion.SelectedIndex == 4)
            {
                switch (cbTipoSeñal_2.SelectedIndex)
                {
                case 0:     // Parabolica
                    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:
                    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();
                    txtFrecuenciaMuestreo.Text =
                        segundaSeñal.FrecuenciaMuestreo.ToString();
                    break;

                default:
                    segundaSeñal = null;
                    break;
                }
                if (cbTipoSeñal_2.SelectedIndex != 2 && 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(
                        ((OperacionEscalaAmplitud)
                         (panelConfiguracionOperacion.
                          Children[0])).txtFactorEscala
                        .Text);
                señalResultante =
                    Señal.escalarAmplitud(señal,
                                          factorEscala);
                break;

            case 1:
                double factorDesplazamiento =
                    double.Parse(((DesplazamientoAmplitud)(panelConfiguracionOperacion.Children[0]))
                                 .txtFactorDesplazamiento.Text);
                señalResultante = Señal.desAmplitud(señal, factorDesplazamiento);
                break;

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

                break;

            case 3:
                double factorExponencial =
                    double.Parse(((OperacionEscalaExponencial)(panelConfiguracionOperacion.Children[0]))
                                 .txtFactorExponente.Text);
                señalResultante = Señal.escalaExponencial(señal, factorExponencial);
                break;

            case 4:
                señalResultante = Señal.adicionarSeñales(señal, segundaSeñal);
                break;

            case 5:    //Transf. de Fourier
                señalResultante = Señal.transformadaFourier(señal);
                break;

            default:
                señalResultante = null;
                break;
            }
            /////AQUI ME QUEDE



            //Operador ternario
            //Evalua condicion. Si si y Si no
            //Elige entre la primera y la resultante
            double amplitudMaxima =
                (señal.AmplitudMaxima >= señalResultante.AmplitudMaxima) ?
                señal.AmplitudMaxima : señalResultante.AmplitudMaxima;

            //Elige entre la mas grande de la 1ra y resultante y la segunda
            if (segundaSeñal != null)
            {
                amplitudMaxima = (amplitudMaxima > segundaSeñal.AmplitudMaxima) ?
                                 amplitudMaxima : segundaSeñal.AmplitudMaxima;
            }



            plnGrafica.Points.Clear();
            plnGraficaResultante.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)
                    );
            }

            if (cbOperacion.SelectedIndex == 5)
            {
                int indeceMaximo = 0;
                for (int i = 0; i < (señalResultante.Muestras.Count / 2); i++)
                {
                    if (señalResultante.Muestras[i].Y > señalResultante.Muestras[indeceMaximo].Y)
                    {
                        indeceMaximo = i;
                    }
                }
                lblHertz.Text = ((indeceMaximo * frecuenciaMuestreo) / (señal.Muestras.Count)).ToString("N") + "Hz";
            }

            lblLimiteSuperior.Text =
                amplitudMaxima.ToString("F");
            lblLimiteInferior.Text =
                "-" + amplitudMaxima.ToString("F");

            lblLimiteSuperiorResultante.Text =
                amplitudMaxima.ToString("F");
            lblLimiteInferiorResultante.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)
                );
            //Resultado
            plnEjeXResultante.Points.Clear();
            plnEjeXResultante.Points.Add((
                                             adaptarCoordenadas(tiempoInicial, 0.0,
                                                                tiempoInicial, amplitudMaxima)));
            plnEjeXResultante.Points.Add(
                adaptarCoordenadas(tiempoFinal, 0.0,
                                   tiempoInicial, amplitudMaxima));
            //ver el cambio de como afecto la escala de la grafica

            //Original
            plnEjeY.Points.Clear();
            plnEjeY.Points.Add(
                adaptarCoordenadas(0.0, amplitudMaxima,
                                   tiempoInicial, amplitudMaxima));
            plnEjeY.Points.Add(
                adaptarCoordenadas(0.0, amplitudMaxima * -1,
                                   tiempoInicial, amplitudMaxima));

            //Resultado
            plnEjeYResultante.Points.Clear();
            plnEjeYResultante.Points.Add(
                adaptarCoordenadas(0.0, amplitudMaxima,
                                   tiempoInicial, amplitudMaxima)
                );
            plnEjeYResultante.Points.Add(
                adaptarCoordenadas(0.0, amplitudMaxima * -1,
                                   tiempoInicial, amplitudMaxima)
                );
        }