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