Filtrado de paso bajo en muestras cortas int (PCM de 16 bits)

9

Estoy escribiendo software para procesar audio dado como muestras PCM de 16 bits. La primera etapa del procesamiento implica calcular la energía (o variación total) en un cierto rango de frecuencia (por encima de una determinada frecuencia de corte).

Lo que estoy haciendo actualmente es restar la energía de la señal filtrada de paso bajo de la energía de la señal original. Descubrí que gran parte del procesamiento está dedicado a convertir las muestras enteras en una representación de punto flotante.

Entonces mi pregunta es, ¿hay una técnica para filtrar las muestras de enteros sin convertirlas en coma flotante?

smichak
fuente

Respuestas:

6

Sí, por supuesto, puede aplicar el filtro directamente a las muestras de enteros, utilizando la aritmética de punto fijo .

Por ejemplo, si usa un filtro FIR con coeficientes [1/3, 1, 1/2] y una resolución de 8 bits para los coeficientes, su salida será:

out[n] = (85 * sample[n] + 256 * sample[n - 1] + 128 * sample[n - 2]) >> 8

Dos cosas a tener en cuenta:

  • La cuantificación de los coeficientes podría causar, en el mejor de los casos, ligeros cambios en las respuestas del filtro, en el peor de los casos, causar inestabilidades del filtro. ¿Cuál es su tipo de filtro y el valor de sus coeficientes?

  • Desbordamiento / Tipos de datos / Problemas de truncamiento. En el ejemplo anterior, out puede exceder el rango de un número entero de 16 bits, por lo que tendrá que hacer un recorte.

pichenettes
fuente
2
Creo que la muestra [n - 1] debería multiplicarse por 256; de lo contrario, es efectivamente ponderado por lugar de . 112561
Jason R
tienes razón, editado!
pichenettes
3
@pichenettes Podría ser bueno explicar cómo llegó a los valores cuantificados, con y sin signo, etc. Depende de usted.
Jim Clay
3

Uno de los procesadores, que convierte un bloque grande (pero en caché) de enteros en flotadores antes de procesarlos, podría ser más rápido, debido a la eliminación de los peligros de la tubería. Es posible que desee comparar esto.

Si utiliza un número entero escalado o una aritmética de punto fijo, la cantidad de precisión entera agregada que necesitará en los coeficientes y valores intermedios es aproximadamente proporcional a la relación entre su frecuencia de muestreo y su frecuencia de corte deseada. Es posible que necesite usar una aritmética de enteros de precisión de 24,32,48 bits o más en sus muestras de 16 bits para llegar al nivel de piso de ruido numérico deseado. Algunos conjuntos de instrucciones de procesador (ARM, MIPS, etc.) pueden incluir aritmética acumulativa de 64 bits solo para este propósito.

hotpaw2
fuente