paso - filtros fir para audio matlab
Reducir la resoluciĆ³n y aplicar un filtro de paso bajo al audio digital (10)
Puede hacer uso de 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 la calidad por la velocidad.
Si prefiere no escribir ningún código, puede usar Audacity para realizar la conversión de frecuencia de muestreo. Ofrece una GUI poderosa y utiliza libsamplerate para su conversión de frecuencia de muestreo.
Tengo un flujo de audio de 44Khz desde un CD, representado como una matriz de muestras de PCM de 16 bits. Me gustaría reducirlo a una transmisión de 11KHz. ¿Cómo puedo hacer eso? Desde mis días de clase de ingeniería hace muchos años, sé que la transmisión ya no podrá describir nada con más de 5500Hz de forma precisa, así que supongo que también quiero cortar todo por encima. ¿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 por un factor de 4x en vez de 6x. ¿Alguna idea de cómo se calculan esas constantes? Además, termino convirtiendo las muestras de 16 bytes en flotadores de todos modos, por lo que puedo hacer la disminución de muestreo con flotadores en lugar de cortos, si eso ayuda en absoluto a la calidad.
Debe aplicar un filtro de paso bajo antes de reducir la señal para evitar el "aliasing". La frecuencia de corte del filtro de paso bajo debe ser menor que la frecuencia nyquist, que es la mitad de la frecuencia de muestreo.
Intentaría aplicar DFT, cortando 3/4 del resultado y aplicando DFT inverso. No puedo decir si sonará bien sin esforzarme realmente.
La "mejor" solución posible es de hecho una DFT, descartando las 3/4 mejores frecuencias, y realizando una DFT inversa, con el dominio restringido a la parte inferior de 1/4. En este caso, descartar los 3/4 primeros es un filtro de paso bajo. Rellenar a una potencia de 2 números de muestras probablemente le dará un beneficio de velocidad. Sin embargo, tenga en cuenta cómo su paquete FFT almacena muestras. 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 oscilarán entre -22 y 22, o de 0 a 44. En el primer caso, querrás el medio 1/4. En este último, el 1/4 más externo.
Puede hacer un trabajo adecuado al promediar los valores de muestra. La forma ingenua de tomar muestras de cuatro por cuatro y hacer un promedio ponderado igual funciona, pero no es demasiado grande. En su lugar, querrá usar una función de "kernel" que los promedia a la vez de una 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 (inversas) de Fourier de las funciones, y viceversa. Entonces, si queremos trabajar en el dominio del tiempo, necesitamos realizar una convolución con la transformada de Fourier (inversa) de la función de caja. Esto resulta ser proporcional a la función "sinc" (sin at) / at, donde a es el ancho del cuadro en el espacio de frecuencia. Por lo tanto, en cada 4ª ubicación (dado que está disminuyendo la resolución por un factor de 4), puede 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 bien que quieras que suene. Es común ignorar todo lo que está fuera del primer cero, por ejemplo, o simplemente tomar la cantidad de puntos que es la razón por la que está bajando la resolución.
Finalmente está la manera pobre (pero rápida) de simplemente descartar la mayoría de las muestras, manteniendo solo el zeroth, el cuarto, y así sucesivamente.
Honestamente, si encaja en la memoria, recomendaría ir por la ruta DFT. Si no usa uno de los paquetes de filtro de software que otros han recomendado para construir el filtro por usted.
Lea en los filtros FIR e IIR. Estos son los filtros que usan una matriz de coeficientes.
Si realiza una búsqueda en Google en "Diseñador de filtro FIR o IIR", encontrará gran cantidad de software y applets en línea que hacen el trabajo duro (obtener los coeficientes) por usted.
EDITAR:
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 C-Code ...
Tiene razón en que necesita aplicar filtro de paso bajo en su señal. Cualquier señal de más de 5500 Hz estará presente en la señal muestreada pero ''aliased'' como otra frecuencia, por lo que tendrá que eliminarlas antes de la reducción de muestreo.
Es una buena idea filtrar con flotadores. También existen algoritmos de filtro de punto fijo, pero generalmente tienen compensaciones de calidad para funcionar. ¡Si tienes carrozas, úsalas!
El uso de DFT para el filtrado suele ser excesivo y hace las cosas más complicadas porque las dft no son un proceso continuo sino que funcionan en los buffers.
Los filtros digitales generalmente vienen en dos sabores. FIR y IIR. En general, son la misma idea, pero los filtros IIF usan ciclos de retroalimentación para lograr una respuesta más pronunciada con muchos menos coeficientes. Esta podría ser una buena idea para la reducción de muestreo porque necesita una pendiente de filtro muy pronunciada allí.
La reducción de la resolución es una especie de caso especial. Como va a tirar 3 de 4 muestras, no hay necesidad de calcularlas. Hay una clase especial de filtros para este llamado filtros polifásicos.
Intente buscar en Google IIF polifásico o FIR polifásico para obtener más información.
Recientemente me encontré con BruteFIR, que ya puede hacer algo de lo que le interesa.
Obsérvese (además de los otros comentarios) que el enfoque simple-fácil-intuitivo de " reducir la resolución por un factor de 4 reemplazando cada grupo de 4 muestras consecutivas por el valor promedio " no es óptimo, pero no es incorrecto, ni prácticamente ni conceptualmente. Debido a que el promediado asciende exactamente a un filtro de paso bajo (una ventana rectangular, que corresponde a un sinc en frecuencia). Lo que sería conceptualmente incorrecto es simplemente disminuir la resolución tomando una de cada 4 muestras: eso definitivamente introduciría aliasing.
Por cierto: prácticamente cualquier software que hace un remuestreo (audio, imagen o lo que sea, ejemplo de la caja de audio: sox) tiene esto en cuenta, y con frecuencia le permite elegir el filtro de paso bajo subyacente.
El proceso que buscas llamado "Decimation". Hay 2 pasos:
- Aplicación de filtro de paso bajo en los datos (en su caso LPF con corte en Pi / 4).
- Reducción de resolución (en su caso, toma 1 de 4 muestras).
Hay muchos métodos para diseñar y aplicar el filtro de paso bajo.
Puedes comenzar aquí:
Debe aplicar un filtro de paso bajo (eliminando frecuencias superiores a 5500 Hz) y luego aplicar la eliminación (deje cada muestra N, cada 4 en su caso).
Para la aniquilación, generalmente se emplean filtros FIR, no IIR, porque no dependen de salidas anteriores y, por lo tanto, no es necesario calcular nada para las muestras descartadas. Los IIR, en general, dependen tanto de las entradas como de las salidas, por lo que, a menos que se utilice un tipo específico de IIR, deberá calcular cada muestra de salida antes de descartar 3/4 de ellas.
Acabo de buscar en Google un artículo de nivel de introducción sobre el tema: http://www.dspguru.com/dsp/faqs/multirate/decimation