public SeñalPersonalizada transformar()
        {
            SeñalPersonalizada resultado =
                new SeñalPersonalizada();

            resultado.señal = new PointCollection();

            resultado.TiempoInicial      = this.TiempoInicial;
            resultado.TiempoFinal        = this.TiempoFinal;
            resultado.FrecuenciaMuestreo = this.FrecuenciaMuestreo;
            double tiempoActual      = this.TiempoInicial;
            double intervaloMuestras = 1 / this.FrecuenciaMuestreo;

            for (int k = 0; k < this.señal.Count; k++)
            {
                Complex muestra = 0;
                for (int n = 0; n < this.señal.Count; n++)
                {
                    muestra +=
                        this.señal[n].Y *
                        Complex.Exp(-2 *
                                    Math.PI *
                                    Complex.ImaginaryOne *
                                    k * n / this.señal.Count);
                }
                resultado.señal.Add(
                    new Point(tiempoActual, muestra.Magnitude));
                tiempoActual += intervaloMuestras;
            }

            return(resultado);
        }
 public SeñalPersonalizada multipllicar(Señal multiplicando)
 {
     if (this.TiempoInicial == multiplicando.TiempoInicial &&
         this.TiempoFinal == multiplicando.TiempoFinal &&
         this.FrecuenciaMuestreo == multiplicando.FrecuenciaMuestreo)
     {
         SeñalPersonalizada resultado =
             new SeñalPersonalizada();
         resultado.TiempoInicial      = this.TiempoInicial;
         resultado.TiempoFinal        = this.TiempoFinal;
         resultado.FrecuenciaMuestreo = this.FrecuenciaMuestreo;
         resultado.señal = new PointCollection();
         for (int i = 0; i < this.señal.Count; i++)
         {
             Point muestraResultante = new Point();
             muestraResultante.X = this.señal[i].X;
             muestraResultante.Y =
                 this.señal[i].Y *
                 multiplicando.señal[i].Y;
             resultado.señal.Add(muestraResultante);
         }
         return(resultado);
     }
     return(null);
 }
 private void multiplicar()
 {
     if (señal != null && señalDos != null)
     {
         double tiempoInicial =
             Double.Parse(txtTiempoInicial.Text);
         double duracion =
             Double.Parse(txtTiempoFinal.Text) -
             Double.Parse(txtTiempoInicial.Text);
         resultado = señal.multipllicar(señalDos);
         if (resultado != null)
         {
             //Grafico
             obtenerAmplitudMaxima();
             plnLineaGraficaResultado.Points =
                 convertirSeñalAGrafica(resultado.señal, duracion, tiempoInicial);
             lblMaxY_Resultado.Text = Math.Round(amplitudMaxima).ToString();
             lblMinY_Resultado.Text = Math.Round(-amplitudMaxima).ToString();
             grdEtiquetas2.Children.Clear();
             for (int i = Convert.ToInt32(Double.Parse(txtTiempoInicial.Text)); i <= Double.Parse(txtTiempoFinal.Text); 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;
                 grdEtiquetas2.Children.Add(etiqueta);
             }
             graficarEjesResultado(resultado.TiempoInicial,
                                   resultado.TiempoFinal);
         }
     }
 }
        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 transformar()
        {
            if (señal != null)
            {
                double tiempoInicial =
                    Double.Parse(txtTiempoInicial.Text);
                double tiempoFinal =
                    Double.Parse(txtTiempoFinal.Text);
                double frecuenciaMuestreo =
                    Double.Parse(txtFrecuenciaMuestreo.Text);
                double duracion =
                    tiempoFinal - tiempoInicial;
                resultado = señal.transformar();
                if (resultado != null)
                {
                    int    indiceValorMaximo = 0;
                    double valorMaximo       = 0.0;
                    for (int n = 0; n < resultado.señal.Count / 2; n++)
                    {
                        if (resultado.señal[n].Y > valorMaximo)
                        {
                            valorMaximo       = resultado.señal[n].Y;
                            indiceValorMaximo = n;
                        }
                    }
                    double frecuenciaFundamental =
                        indiceValorMaximo * frecuenciaMuestreo /
                        señal.señal.Count;


                    lblFrecuenciaFundamental.Text =
                        frecuenciaFundamental.ToString() + " Hz";

                    if (frecuenciaFundamental > 261 && frecuenciaFundamental < 293)
                    {
                        lblFrecuenciaFundamental.Text = "Do";
                    }
                    else if (frecuenciaFundamental > 293 && frecuenciaFundamental < 329)
                    {
                        lblFrecuenciaFundamental.Text = "Re";
                    }
                    else if (frecuenciaFundamental > 329 && frecuenciaFundamental < 349)
                    {
                        lblFrecuenciaFundamental.Text = "Mi";
                    }
                    else if (frecuenciaFundamental > 349 && frecuenciaFundamental < 392)
                    {
                        lblFrecuenciaFundamental.Text = "Fa";
                    }
                    else if (frecuenciaFundamental > 392 && frecuenciaFundamental < 440)
                    {
                        lblFrecuenciaFundamental.Text = "Sol";
                    }
                    else if (frecuenciaFundamental > 440 && frecuenciaFundamental < 493)
                    {
                        lblFrecuenciaFundamental.Text = "La";
                    }
                    else if (frecuenciaFundamental > 493 && frecuenciaFundamental < 523)
                    {
                        lblFrecuenciaFundamental.Text = "SI";
                    }
                }

                if (resultado != null)
                {
                    //Grafico
                    obtenerAmplitudMaxima();
                    plnLineaGraficaResultado.Points =
                        convertirSeñalAGrafica(resultado.señal, duracion, tiempoInicial);
                    lblMaxY_Resultado.Text = Math.Round(amplitudMaxima).ToString();
                    lblMinY_Resultado.Text = Math.Round(-amplitudMaxima).ToString();

                    grdEtiquetas2.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;
                        //grdEtiquetas2.Children.Add(etiqueta);
                    }
                    graficarEjesResultado(resultado.TiempoInicial,
                                          resultado.TiempoFinal);
                }
            }
        }