예제 #1
0
        public static Senal correlacionar(Senal operando1, Senal operando2)
        {
            SenalPersonalizada resultado = new SenalPersonalizada();

            resultado.TiempoInicial = operando1.TiempoInicial - operando2.TiempoFinal;
            resultado.TiempoFinal   = operando1.TiempoFinal;
            resultado.FrecMuestreo  = operando1.FrecMuestreo;

            double periodoMuestreo           = 1 / resultado.FrecMuestreo;
            double duracionSenal             = resultado.TiempoFinal - resultado.TiempoInicial;
            double cantidadMuestrasResultado = duracionSenal * resultado.FrecMuestreo;

            double instanteActual = resultado.TiempoInicial;

            for (int n = 0; n < cantidadMuestrasResultado; n++)
            {
                double valorMuestra = 0;
                for (int k = 0; k < operando2.Muestras.Count; k++)
                {
                    if ((n + k) >= 0 && (n + k) < operando2.Muestras.Count)
                    {
                        valorMuestra += operando1.Muestras[k].y * operando2.Muestras[n + k].y;
                    }
                }

                valorMuestra /= resultado.FrecMuestreo;
                Muestra muestra = new Muestra(instanteActual, valorMuestra);
                resultado.Muestras.Add(muestra);
                instanteActual += periodoMuestreo;
            }

            return(resultado);
        }
예제 #2
0
        private void btnRealizarOperacion_Click(object sender, RoutedEventArgs e)
        {
            senalResultado = null;
            switch (cbTipoOperacion.SelectedIndex)
            {
            case 0:     //Suma
                //los metodos estaticos no necesitan una instancia
                senalResultado = Senal.sumar(senal, senal2);
                break;

            case 1:     //Multiplicación
                senalResultado = Senal.multiplicar(senal, senal2);
                break;

            case 2:     //Convolución
                senalResultado = Senal.convolucionar(senal, senal2);
                break;

            case 3:     //Correlación
                senalResultado = Senal.correlacionar(senal, senal2);
                break;

            default:
                break;
            }
            //se actualiza la amplitud maxima del resultado
            senalResultado.actualizarAmplitudMaxima();
            plnGraficaResultado.Points.Clear();
            //cambia los valores de la etiqueta
            //La F es que da el formato para redondear a 2 decimales, la funcion ToString puede recibir un parametro que es el que va a decidir en que formato va a estar,existen varios parametros
            lblAmplitudMaximaY_Copy.Text          = senalResultado.amplitudMaxima.ToString("F");
            lblAmplitudMaximaY_Negativa_Copy.Text = "-" + senalResultado.amplitudMaxima.ToString("F");
            //hacerlo si la señal no es nula
            if (senalResultado != null)
            {
                //recorrer una coleccion o arreglo
                //muestra toma el valor de señal.muestra en cada recorrido del ciclo
                foreach (Muestra muestra in senalResultado.Muestras)
                {
                    //se evalua la señal, luego se ajusta y de ahi se agrega el punto
                    plnGraficaResultado.Points.Add(new Point((muestra.x - senalResultado.TiempoInicial) * scrResultadoOperacion.Width, (muestra.y / senalResultado.amplitudMaxima * ((scrResultadoOperacion.Height / 2) - 30) * -1) + (scrResultadoOperacion.Height / 2)));
                }
            }

            //Graficando el eje de X
            plnEjeXResultado.Points.Clear();
            //Punto de inicio.
            plnEjeXResultado.Points.Add(new Point(0, (scrResultadoOperacion.Height / 2)));
            //Punto de fin.
            plnEjeXResultado.Points.Add(new Point((senalResultado.TiempoFinal - senalResultado.TiempoInicial) * scrResultadoOperacion.Width, (scrResultadoOperacion.Height / 2)));
            //Graficando el eje de Y
            plnEjeYResultado.Points.Clear();
            //Punto de inicio.
            plnEjeYResultado.Points.Add(new Point(0 - senalResultado.TiempoInicial * scrResultadoOperacion.Width, scrResultadoOperacion.Height));
            //Punto de fin.
            plnEjeYResultado.Points.Add(new Point(0 - senalResultado.TiempoInicial * scrResultadoOperacion.Width, scrResultadoOperacion.Height * -1));
        }
예제 #3
0
        public static Senal sumar(Senal suma1, Senal suma2)
        {
            //construimos la señal resultado
            SenalPersonalizada resultado = new SenalPersonalizada();

            //sumamos muestra por muestra
            resultado.TiempoInicial = suma1.TiempoInicial;
            resultado.TiempoFinal   = suma1.TiempoFinal;
            resultado.FrecMuestreo  = suma1.FrecMuestreo;
            //recorremos 1 lista de muestras y a la 2 señal accedemos por un indice
            int indice = 0;

            foreach (Muestra muestra in suma1.Muestras)
            {
                Muestra muestraResultado = new Muestra();
                muestraResultado.x = muestra.x;
                muestraResultado.y = muestra.y + suma2.Muestras[indice].y;
                indice++;
                resultado.Muestras.Add(muestraResultado);
            }
            return(resultado);
        }
예제 #4
0
        public static Senal transformar(Senal senal)
        {
            SenalPersonalizada transformada = new SenalPersonalizada();

            transformada.TiempoInicial = senal.TiempoInicial;
            transformada.TiempoFinal   = senal.TiempoFinal;
            transformada.FrecMuestreo  = senal.FrecMuestreo;

            for (int k = 0; k < senal.Muestras.Count; k++)
            {
                Complex muestra = 0;

                for (int n = 0; n < senal.Muestras.Count; n++)
                {
                    muestra += senal.Muestras[n].y * Complex.Exp(-2 * Math.PI * Complex.ImaginaryOne * k * n / senal.Muestras.Count);
                }

                transformada.Muestras.Add(new Muestra((double)k / (double)senal.Muestras.Count, muestra.Magnitude));
            }

            return(transformada);
        }
예제 #5
0
        private void btnGraficar_Click(object sender, RoutedEventArgs e)
        {
            AudioFileReader reader = new AudioFileReader(txtRutaArchivo.Text);

            double tiempoInicial = 0;
            double tiempoFinal   = reader.TotalTime.TotalSeconds;
            double frecMuestreo  = reader.WaveFormat.SampleRate;

            txtFrecMuestreo.Text  = frecMuestreo.ToString();
            txtTiempoInicial.Text = "0";
            txtTiempoFinal.Text   = tiempoFinal.ToString();

            senal = new SenalPersonalizada();

            senal.TiempoInicial = tiempoInicial;
            senal.TiempoFinal   = tiempoFinal;
            senal.FrecMuestreo  = frecMuestreo;

            //Construye nuestra señal a través del archivo de audio.
            var    bufferLectura    = new float[reader.WaveFormat.Channels];
            int    muestrasLeidas   = 1;
            double instanteActual   = 0;
            double intervaloMuestra = 1.0 / frecMuestreo;

            do
            {
                muestrasLeidas = reader.Read(bufferLectura, 0, reader.WaveFormat.Channels);

                if (muestrasLeidas > 0)
                {
                    double max = bufferLectura.Take(muestrasLeidas).Max();

                    senal.Muestras.Add(new Muestra(instanteActual, max));
                }

                instanteActual += intervaloMuestra;
            } while (muestrasLeidas > 0);

            //Establecer amplitud máxima.
            senal.actualizarAmplitudMaxima();
            amplitudMaxima = senal.amplitudMaxima;

            //Limpia las gráficas.
            plnGrafica.Points.Clear();

            lblAmplitudMaximaY.Text          = amplitudMaxima.ToString("F");
            lblAmplitudMaximaY_Negativa.Text = "-" + amplitudMaxima.ToString("F");

            //Graficando PRIMERA señal.
            if (senal != null)
            {
                //Recorrer una colección o arreglo.
                foreach (Muestra muestra in senal.Muestras)
                {
                    plnGrafica.Points.Add(new Point((muestra.x - tiempoInicial) * scrContenedor.Width,
                                                    (muestra.y / amplitudMaxima) * ((scrContenedor.Height / 2.0) - 30) * -1 + (scrContenedor.Height / 2)));
                }
            }

            //Graficando el eje de X
            plnEjeX.Points.Clear();
            //Punto de inicio.
            plnEjeX.Points.Add(new Point(0, (scrContenedor.Height / 2)));
            //Punto de fin.
            plnEjeX.Points.Add(new Point((tiempoFinal - tiempoInicial) * scrContenedor.Width, (scrContenedor.Height / 2)));

            //Graficando el eje de Y
            plnEjeY.Points.Clear();
            //Punto de inicio.
            plnEjeY.Points.Add(new Point(0 - tiempoInicial * scrContenedor.Width, scrContenedor.Height));
            //Punto de fin.
            plnEjeY.Points.Add(new Point(0 - tiempoInicial * scrContenedor.Width, scrContenedor.Height * -1));
        }
예제 #6
0
        private void btnFourier_Click(object sender, RoutedEventArgs e)
        {
            Senal transformada = Senal.transformar(senal);

            transformada.actualizarAmplitudMaxima();

            //Limpia las gráficas.
            plnGraficaResultado.Points.Clear();

            lblAmplitudMaximaY_Copy.Text          = transformada.amplitudMaxima.ToString("F");
            lblAmplitudMaximaY_Negativa_Copy.Text = "-" + transformada.amplitudMaxima.ToString("F");

            //Graficando PRIMERA señal.
            if (transformada != null)
            {
                //Recorrer una colección o arreglo.
                foreach (Muestra muestra in transformada.Muestras)
                {
                    //Se va graficando la transformada.
                    plnGraficaResultado.Points.Add(new Point((muestra.x - transformada.TiempoInicial) * scrResultadoOperacion.Width,
                                                             (muestra.y / transformada.amplitudMaxima) * ((scrResultadoOperacion.Height / 2.0) - 30) * -1 + (scrResultadoOperacion.Height / 2)));
                }

                double valorMaximo  = 0;
                int    indiceMaximo = 0;
                int    indiceActual = 0;

                //Recorrer una colección o arreglo.
                foreach (Muestra muestra in transformada.Muestras)
                {
                    //Buscamos el valor máximo y el indice actual.
                    if (muestra.y > valorMaximo)
                    {
                        valorMaximo  = muestra.y;
                        indiceMaximo = indiceActual;
                    }

                    indiceActual++;

                    //Evaluamos en la primera mitad de la gráfica de la transformada.
                    if (indiceActual > (double)transformada.Muestras.Count / 2.0)
                    {
                        break;
                    }
                }

                double frecuenciaFundamental = (double)indiceMaximo * senal.FrecMuestreo / (double)transformada.Muestras.Count;

                lblHz.Text = frecuenciaFundamental.ToString() + " Hz";
            }

            //Graficando el eje de X
            plnEjeXResultado.Points.Clear();
            //Punto de inicio.
            plnEjeXResultado.Points.Add(new Point(0, (scrResultadoOperacion.Height / 2)));
            //Punto de fin.
            plnEjeXResultado.Points.Add(new Point((transformada.TiempoFinal - transformada.TiempoInicial) * scrResultadoOperacion.Width, (scrResultadoOperacion.Height / 2)));

            //Graficando el eje de Y
            plnEjeYResultado.Points.Clear();
            //Punto de inicio.
            plnEjeYResultado.Points.Add(new Point(0 - transformada.TiempoInicial * scrResultadoOperacion.Width, scrResultadoOperacion.Height));
            //Punto de fin.
            plnEjeYResultado.Points.Add(new Point(0 - transformada.TiempoInicial * scrResultadoOperacion.Width, scrResultadoOperacion.Height * -1));
        }
예제 #7
0
        private void btnGraficar_Click(object sender, RoutedEventArgs e)
        {
            double tiempoInicial = double.Parse(txtTiempoInicial.Text);
            double tiempoFinal   = double.Parse(txtTiempoFinal.Text);
            double frecMuestreo  = double.Parse(txtFrecMuestreo.Text);

            //Primer señal.
            switch (cbTipoSenal.SelectedIndex)
            {
            case 0:     //Senoidal.
                double amplitud   = double.Parse(((ConfiguracionSenoidal)(panelConfiguracion.Children[0])).txtAmplitud.Text);
                double fase       = double.Parse(((ConfiguracionSenoidal)(panelConfiguracion.Children[0])).txtFase.Text);
                double frecuencia = double.Parse(((ConfiguracionSenoidal)(panelConfiguracion.Children[0])).txtFrecuencia.Text);

                senal = new SenalSenoidal(amplitud, fase, frecuencia);
                break;

            case 1:     //Rampa.
                senal = new SenalRampa();
                break;

            case 2:     //Exponencial.
                double alfa = double.Parse(((ConfiguracionExponencial)(panelConfiguracion.Children[0])).txtAlfa.Text);

                senal = new SenalExponencial(alfa);
                break;

            case 3:     //Rectangular
                senal = new SenalRectangular();
                break;

            default: senal = null;
                break;
            }

            senal.TiempoInicial = tiempoInicial;
            senal.TiempoFinal   = tiempoFinal;
            senal.FrecMuestreo  = frecMuestreo;

            //Segunda señal.
            switch (cbTipoSenal_2.SelectedIndex)
            {
            case 0:     //Senoidal.
                double amplitud   = double.Parse(((ConfiguracionSenoidal)(panelConfiguracion_2.Children[0])).txtAmplitud.Text);
                double fase       = double.Parse(((ConfiguracionSenoidal)(panelConfiguracion_2.Children[0])).txtFase.Text);
                double frecuencia = double.Parse(((ConfiguracionSenoidal)(panelConfiguracion_2.Children[0])).txtFrecuencia.Text);

                senal2 = new SenalSenoidal(amplitud, fase, frecuencia);
                break;

            case 1:     //Rampa.
                senal2 = new SenalRampa();
                break;

            case 2:     //Exponencial.
                double alfa = double.Parse(((ConfiguracionExponencial)(panelConfiguracion_2.Children[0])).txtAlfa.Text);

                senal2 = new SenalExponencial(alfa);
                break;

            case 3:     //Rectangular
                senal2 = new SenalRectangular();
                break;

            default:
                senal2 = null;
                break;
            }

            senal2.TiempoInicial = tiempoInicial;
            senal2.TiempoFinal   = tiempoFinal;
            senal2.FrecMuestreo  = frecMuestreo;

            //Construye señal
            senal.construirSenalDigital();
            senal2.construirSenalDigital();

            //Escalar PRIMERA SEÑAL.
            double factorEscala = double.Parse(txtFactorEscalaAmplitud.Text);

            senal.escalar(factorEscala);
            //Desplazar PRIMERA SEÑAL.
            double factorDesplazar = double.Parse(txtFactorDesplazamiento.Text);

            senal.desplazar(factorDesplazar);
            senal.actualizarAmplitudMaxima();
            //Truncar PRIMERA SEÑAL.

            /* double factorTruncar = double.Parse(txtUmbral.Text);
             * senal.truncar(factorTruncar); */

            //Escalar SEGUNDA SEÑAL.
            double factorEscala2 = double.Parse(txtFactorEscalaAmplitud_2.Text);

            senal2.escalar(factorEscala2);
            //Desplazar SEGUNDA SEÑAL.
            double factorDesplazar2 = double.Parse(txtFactorDesplazamiento_2.Text);

            senal2.desplazar(factorDesplazar2);
            senal2.actualizarAmplitudMaxima();
            //Truncar SEGUNDA SEÑAL.

            /* double factorTruncar2 = double.Parse(txtUmbral_2.Text);
             * senal2.truncar(factorTruncar2); */

            //Establecer amplitud máxima comparando con AMBAS señales.
            senal.actualizarAmplitudMaxima();
            senal2.actualizarAmplitudMaxima();

            //Definimos la amplitud máxima con la primer señal por default y comparamos con la segunda en caso de ser mayor.
            senal.actualizarAmplitudMaxima();
            senal2.actualizarAmplitudMaxima();
            amplitudMaxima = senal.amplitudMaxima;

            if (senal2.amplitudMaxima > amplitudMaxima)
            {
                amplitudMaxima = senal2.amplitudMaxima;
            }

            //Limpia las gráficas.
            plnGrafica.Points.Clear();
            plnGrafica_2.Points.Clear();

            lblAmplitudMaximaY.Text          = amplitudMaxima.ToString("F");
            lblAmplitudMaximaY_Negativa.Text = "-" + amplitudMaxima.ToString("F");

            //Graficando PRIMERA señal.
            if (senal != null)
            {
                //Recorrer una colección o arreglo.
                foreach (Muestra muestra in senal.Muestras)
                {
                    plnGrafica.Points.Add(new Point((muestra.x - tiempoInicial) * scrContenedor.Width,
                                                    (muestra.y / amplitudMaxima) * ((scrContenedor.Height / 2.0) - 30) * -1 + (scrContenedor.Height / 2)));
                }
            }


            //Graficando SEGUNDA señal.
            if (senal2 != null)
            {
                //Recorrer una colección o arreglo.
                foreach (Muestra muestra in senal2.Muestras)
                {
                    plnGrafica_2.Points.Add(new Point((muestra.x - tiempoInicial) * scrContenedor.Width,
                                                      (muestra.y / amplitudMaxima) * ((scrContenedor.Height / 2.0) - 30) * -1 + (scrContenedor.Height / 2)));
                }
            }

            //Graficando el eje de X
            plnEjeX.Points.Clear();
            //Punto de inicio.
            plnEjeX.Points.Add(new Point(0, (scrContenedor.Height / 2)));
            //Punto de fin.
            plnEjeX.Points.Add(new Point((tiempoFinal - tiempoInicial) * scrContenedor.Width, (scrContenedor.Height / 2)));

            //Graficando el eje de Y
            plnEjeY.Points.Clear();
            //Punto de inicio.
            plnEjeY.Points.Add(new Point(0 - tiempoInicial * scrContenedor.Width, scrContenedor.Height));
            //Punto de fin.
            plnEjeY.Points.Add(new Point(0 - tiempoInicial * scrContenedor.Width, scrContenedor.Height * -1));
        }