public SeñalPersonalizada correlacionar(Señal operando)
        {
            //Inicializar resultado
            SeñalPersonalizada resultado =
                new SeñalPersonalizada();

            //this es la A , operando es la B
            resultado.TiempoInicial =
                this.TiempoInicial -
                (operando.TiempoFinal - operando.TiempoInicial);
            resultado.TiempoFinal =
                this.TiempoFinal;
            resultado.FrecuenciaMuestreo =
                this.FrecuenciaMuestreo;
            resultado.señal = new PointCollection();
            double tiempoTotal =
                resultado.TiempoFinal - resultado.TiempoInicial;
            double numeroMuestras =
                tiempoTotal * resultado.FrecuenciaMuestreo;
            double xActual = resultado.TiempoInicial;

            for (int n = 0; n < numeroMuestras; n++)
            {
                double muestra = 0;
                for (int k = 0; k < operando.señal.Count; k++)
                {
                    if (n >= 0 && n < this.señal.Count &&
                        (n - k) >= 0 && (n - k) < operando.señal.Count)
                    {
                        muestra +=
                            (this.señal[n].Y * operando.señal[n - k].Y) * //altura
                            (1.0 / resultado.FrecuenciaMuestreo);         //base
                    }
                }
                resultado.señal.Add(new Point(xActual, muestra));
                xActual += 1.0 / resultado.FrecuenciaMuestreo;
            }

            return(resultado);
        }
        //Ahora es el analizar
        private void btnGraficar_Click(object sender, RoutedEventArgs e)
        {
            resultado = null;
            //Borra todos los puntos de la gráfica de la señal
            plnLineaGrafica.Points.Clear();
            plnLineaGrafica2.Points.Clear();



            //Aquí se va a construir la señal
            //(Leer el audio)
            var             ruta   = txtAudio.Text;
            AudioFileReader reader = new AudioFileReader(ruta);

            double tiempoInicial      = 0;
            double tiempoFinal        = reader.TotalTime.Milliseconds / 1000.0;
            double frecuenciaMuestreo = reader.WaveFormat.SampleRate;

            txtTiempoInicial.Text      = tiempoInicial.ToString();
            txtTiempoFinal.Text        = tiempoFinal.ToString();
            txtFrecuenciaMuestreo.Text = frecuenciaMuestreo.ToString();

            double duracion =
                tiempoFinal - tiempoInicial;

            señal                    = new SeñalPersonalizada();
            señal.señal              = new PointCollection();
            señal.TiempoInicial      = tiempoInicial;
            señal.TiempoFinal        = tiempoFinal;
            señal.FrecuenciaMuestreo = frecuenciaMuestreo;

            var    readBuffer        = new float[reader.WaveFormat.Channels];
            int    muestrasLeidas    = 1;
            double intervaloMuestreo = 1 / frecuenciaMuestreo;
            double tiempoActual      = tiempoInicial;

            do
            {
                muestrasLeidas =
                    reader.Read(readBuffer, 0, reader.WaveFormat.Channels);
                if (muestrasLeidas > 0)
                {
                    double max = readBuffer.Take(muestrasLeidas).Max();
                    señal.señal.Add(new Point(tiempoActual, max));
                }
                tiempoActual += intervaloMuestreo;
            } while (muestrasLeidas > 0);

            plnLineaGrafica.Points =
                convertirSeñalAGrafica(señal.señal, duracion, tiempoInicial);

            //Graficar ejes
            plnEjeX.Points.Clear();
            plnEjeX.Points.Add(new Point(tiempoInicial, 0));
            plnEjeX.Points.Add(new Point(tiempoFinal, 0));

            plnEjeY.Points.Clear();
            plnEjeY.Points.Add(new Point(0, amplitudMaxima));
            plnEjeY.Points.Add(new Point(0, -amplitudMaxima));


            var ejeX = convertirSeñalAGrafica(plnEjeX.Points, duracion, tiempoInicial);
            var ejeY = convertirSeñalAGrafica(plnEjeY.Points, duracion, tiempoInicial);

            plnEjeX.Points = ejeX;
            plnEjeY.Points = ejeY;

            //plnEjeX1.Points = ejeX;
            //plnEjeY1.Points = ejeY;

            grdEtiquetas.Children.Clear();
            for (int i = Convert.ToInt32(tiempoInicial); i <= tiempoFinal; i++)
            {
                var etiqueta = new TextBlock();
                var posicion = new PointCollection();
                posicion.Add(new Point(i, 0));
                posicion         = convertirSeñalAGrafica(posicion, duracion, tiempoInicial);
                etiqueta.Text    = i.ToString();
                etiqueta.Margin  = new Thickness(posicion[0].X, posicion[0].Y, 0, 0);
                etiqueta.Opacity = 0.5;
                grdEtiquetas.Children.Add(etiqueta);
            }

            transformar();
        }
        private void btnGraficar_Click(object sender, RoutedEventArgs e)
        {
            plnLineaGrafica.Points.Clear();
            double tiempoInicial =
                Double.Parse(txtTiempoInicial.Text);
            double tiempoFinal =
                Double.Parse(txtTiempoFinal.Text);
            double frecuenciaMuestreo =
                Double.Parse(txtFrecuenciaMuestreo.Text);

            switch (cbTipoSeñal.SelectedIndex)
            {
            case 0:
                //Senoidal
                double amplitud =
                    Double.Parse(txtAmplitud.Text);
                double frecuencia =
                    Double.Parse(txtFrecuencia.Text);
                double fase =
                    Double.Parse(txtFase.Text);
                señal =
                    new SeñalSenoidal(amplitud, fase, frecuencia,
                                      tiempoInicial, tiempoFinal, frecuenciaMuestreo);

                break;

            case 1:
                //Rampa
                señal =
                    new SeñalRampa(tiempoInicial, tiempoFinal,
                                   frecuenciaMuestreo);
                break;

            case 2:
                //Triangular
                señal =
                    new SeñalTriangular(tiempoInicial, tiempoFinal,
                                        frecuenciaMuestreo);
                break;

            case 3:
                //Rectangular
                señal =
                    new SeñalRectangular(tiempoInicial, tiempoFinal,
                                         frecuenciaMuestreo);
                break;

            default:
                señal = null;
                break;
            }
            if (señal != null)
            {
                plnLineaGrafica.Points =
                    convertirSeñalAGrafica(señal.señal);
            }

            plnEjeX.Points.Clear();
            plnEjeX.Points.Add(new Point(tiempoInicial, 0));
            plnEjeX.Points.Add(new Point(tiempoFinal, 0));

            plnEjeY.Points.Clear();
            plnEjeY.Points.Add(new Point(0, amplitudMaxima));
            plnEjeY.Points.Add(new Point(0, -amplitudMaxima));

            plnEjeX.Points = convertirSeñalAGrafica(plnEjeX.Points);
            plnEjeY.Points = convertirSeñalAGrafica(plnEjeY.Points);
        }