Pregunta

Tengo un flujo de audio de 44Khz desde un CD, representado como una matriz de muestras PCM de 16 bits. Me gustaría cortarlo a una transmisión de 11KHz. ¿Cómo puedo hacer eso? Desde mis días en la clase de ingeniería hace muchos años, sé que la transmisión ya no podrá describir con precisión nada de más de 5500Hz, por lo que supongo que también quiero eliminar todo lo demás. ¿Algunas ideas? Gracias.

Actualización: hay un código en esta página que convierte de 48KHz a 8KHz usando un algoritmo simple y una matriz de coeficientes que se parece a {1, 4, 12, 12, 4, 1}. Creo que eso es lo que necesito, pero lo necesito para un factor de 4x en lugar de 6x. ¿Alguna idea de cómo se calculan esas constantes? Además, de todos modos, termino convirtiendo las muestras de 16 bytes en flotantes, por lo que puedo hacer el submuestreo con flotadores en lugar de cortos, si eso ayuda a la calidad.

¿Fue útil?

Solución

Leer en los filtros FIR e IIR. Estos son los filtros que utilizan una matriz de coeficientes.

Si realiza una búsqueda en Google en el diseñador de filtros FIR o IIR " Encontrará un montón de software y applets en línea que hacen el trabajo difícil (obteniendo los coeficientes) por usted.

EDIT:

Esta página aquí ( http: //www-users.cs. york.ac.uk/~fisher/mkfilter/ ) le permite ingresar los parámetros de su filtro y escupir listo para usar el código C ...

Otros consejos

Tienes razón en que necesitas aplicar el filtro de paso bajo en tu señal. Cualquier señal de más de 5500 Hz estará presente en su señal de submuestreo, pero tendrá un alias como otra frecuencia, por lo que deberá eliminarlas antes del submuestreo.

Es una buena idea hacer el filtrado con flotadores. También hay algoritmos de filtro de punto fijo, pero generalmente tienen compromisos de calidad para funcionar. Si tienes flotadores, ¡úsalos!

El uso de DFT para filtrar es generalmente excesivo y hace las cosas más complicadas porque los dft no son un proceso continuo sino que funcionan en búferes.

Los filtros digitales generalmente vienen en dos gustos. FIR y IIR. En general, son la misma idea, pero los filtros IIF utilizan bucles de realimentación para lograr una respuesta más pronunciada con muchos menos coeficientes. Esta podría ser una buena idea para reducir el muestreo porque necesita una pendiente de filtro muy pronunciada allí.

Downsampling es una especie de caso especial. Debido a que va a tirar 3 de 4 muestras, no hay necesidad de calcularlas. Existe una clase especial de filtros para esto llamados filtros polifásicos.

Prueba googlear para polifase IIR o polifase FIR para obtener más información.

Observe (en adición a los otros comentarios) que el enfoque simple-fácil-intuitivo " disminuye la muestra por un factor de 4 al reemplazar cada grupo de 4 muestras consecutivas por el valor promedio " no es óptimo, pero no es incorrecto, ni práctica ni conceptualmente. Debido a que el promedio se calcula precisamente en un filtro de paso bajo (una ventana rectangular, que corresponde a un sinc en la frecuencia). Lo que sería conceptualmente incorrecto es simplemente reducir la muestra tomando una de cada 4 muestras: eso definitivamente introducirá aliasing.

Por cierto: prácticamente cualquier software que haga un remuestreo (audio, imagen o lo que sea; ejemplo para el estuche de audio: sox) tiene esto en cuenta y, con frecuencia, le permite elegir el filtro de paso bajo subyacente.

Debe aplicar un filtro de paso bajo antes de muestrear la señal para evitar " aliasing " ;. La frecuencia de corte del filtro de paso bajo debe ser menor que la frecuencia de nyquist, que es la mitad de la frecuencia de muestreo.

El proceso en el que estás llamado " Decimation " ;. Hay 2 pasos:

  1. Aplicación del filtro de paso bajo en los datos (en su caso, LPF con Cut Off en Pi / 4).
  2. Downsampling (en su caso, tomando 1 de 4 muestras).

Hay muchos métodos para diseñar y aplicar el filtro de paso bajo.

Puedes comenzar aquí:

http://en.wikipedia.org/wiki/Filter_design

Puede utilizar libsamplerate para hacer el trabajo pesado. Libsamplerate es una API de C y se encarga de calcular los coeficientes de filtro. Puede seleccionar entre diferentes filtros de calidad para que pueda intercambiar calidad por velocidad.

Si prefiere no escribir ningún código, puede usar Audacity para realizar la conversión de frecuencia de muestreo. . Ofrece una GUI potente y utiliza libsamplerate para su conversión de frecuencia de muestreo.

Intentaría aplicar DFT, cortando 3/4 del resultado y aplicando DFT inversa. No puedo decir si sonará bien sin realmente esforzarme.

El " mejor " la solución posible es, de hecho, una DFT, descartando los 3/4 superiores de las frecuencias y realizando una DFT inversa, con el dominio restringido a la 1 / 4a inferior. Descartar los 3/4 superiores es un filtro de paso bajo en este caso. El relleno a una potencia de 2 muestras probablemente le proporcionará un beneficio de velocidad. Tenga en cuenta cómo su paquete FFT almacena muestras sin embargo. Si se trata de una FFT compleja (que es mucho más fácil de analizar y, en general, tiene propiedades más agradables), las frecuencias irán de -22 a 22, o de 0 a 44. En el primer caso, desea la 1 / 4a media. En este último, el más externo 1/4.

Puede hacer un trabajo adecuado promediando valores de muestra juntos. La mejor manera de tomar muestras de cuatro en cuatro y hacer un promedio ponderado igual funciona, pero no es demasiado buena. En su lugar, querrá usar un " kernel " Función que los promedia de manera no intuitiva.

Mathwise, descartar todo lo que está fuera de la banda de baja frecuencia es la multiplicación por una función de caja en el espacio de frecuencia. La transformada de Fourier (inversa) convierte la multiplicación puntual en una convolución de las transformadas de Fourier (inversas) de las funciones, y viceversa. Por lo tanto, si queremos trabajar en el dominio del tiempo, debemos realizar una convolución con la transformada de Fourier (inversa) de la función de caja. Esto resulta ser proporcional al " sinc " función (sin en) / en, donde a es el ancho del cuadro en el espacio de frecuencia. Entonces, en cada cuarta ubicación (ya que estás reduciendo el tamaño de la muestra por un factor de 4) puedes sumar los puntos cercanos, multiplicados por sin (a dt) / a dt, donde dt es la distancia en el tiempo a esa ubicación. ¿Qué tan cerca? Bueno, eso depende de lo bueno que quieras que suene. Es común ignorar todo lo que se encuentre fuera del primer cero, por ejemplo, o simplemente considerar que la cantidad de puntos es la proporción en la que se está reduciendo el muestreo.

Finalmente, existe la forma más pobre (pero rápida) de descartar la mayoría de las muestras, mantener solo el cero, el cuarto, etc.

Honestamente, si cabe en la memoria, recomendaría simplemente seguir la ruta DFT. Si no usa uno de los paquetes de filtros de software que otros han recomendado para construir el filtro por usted.

Hace poco me encontré con BruteFIR que ya puede hacer algo de lo que te interesa?

Tiene que aplicar el filtro de paso bajo (eliminar las frecuencias por encima de 5500 Hz) y luego aplicar la reducción (dejar cada Nth muestra, cada 4 en su caso).

Por lo general, los filtros FIR, y no los filtros IIR se emplean, ya que no dependen de las salidas anteriores y, por lo tanto, no es necesario calcular nada para las muestras desechadas. Los IIR, generalmente, dependen tanto de las entradas como de las salidas, por lo que, a menos que se use un tipo específico de IIR, tendrá que calcular cada muestra de salida antes de descartar 3/4 de ellas.

Simplemente busque en Google un artículo de introducción sobre el tema: https: // www. dspguru.com/dsp/faqs/multirate/decimation

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top