Filtragem passa-baixo em amostras int curtas (PCM de 16 bits)

9

Estou escrevendo um software para processamento de áudio fornecido como amostras de PCM de 16 bits. A primeira etapa do processamento envolve o cálculo da energia (ou variação total) em uma determinada faixa de frequência (acima de uma certa frequência de corte).

O que estou fazendo atualmente é subtrair a energia do sinal filtrado passa-baixo da energia do sinal original. Descobri que grande parte do processamento é dedicado à conversão de sampels inteiros em uma representação de ponto flutuante.

Então, minha pergunta é: existe uma técnica para filtrar as amostras inteiras sem convertê-las em ponto flutuante?

smichak
fonte

Respostas:

6

Sim, é claro, você pode aplicar o filtro diretamente às amostras inteiras, usando aritmética de ponto fixo .

Por exemplo, se você usar um filtro FIR com coeficientes [1/3, 1, 1/2] e uma resolução de 8 bits para coeficientes, sua saída será:

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

Duas coisas a serem tomadas, tenha cuidado:

  • A quantização dos coeficientes pode causar, na melhor das hipóteses, pequenas alterações nas respostas do filtro, na pior das hipóteses, causar instabilidades no filtro. Qual é o seu tipo de filtro e o valor de seus coeficientes?

  • Estouro / Tipos de dados / Problemas de truncamento. No exemplo acima, out pode exceder o intervalo de um número inteiro de 16 bits; portanto, você precisará fazer alguns recortes.

pichenettes
fonte
2
Eu acho que a amostra [n - 1] deve ser multiplicada por 256; caso contrário, ele será efetivamente ponderado por vez de . 12561
Jason R
você está certo, editado!
Pichenettes
3
@ pichenettes Pode ser bom explicar como você chegou aos valores quantizados, assinado x não assinado, etc. Até você.
Jim Clay
3

Em alguns processadores, converter um bloco grande de números inteiros (mas em cache) em flutuadores antes de processá-los pode ser mais rápido, devido à eliminação dos riscos do pipeline. Você pode comparar isso.

Se você usar aritmética de número inteiro escalado ou ponto fixo, a quantidade de precisão inteira adicionada necessária nos coeficientes e nos valores intermediários será aproximadamente proporcional à proporção entre a taxa de amostragem e a frequência de corte desejada. Pode ser necessário usar aritmética inteira de precisão de 24,32,48 bits ou mais em suas amostras de 16 bits para reduzir o nível de ruído numérico desejado. Alguns conjuntos de instruções do processador (ARM, MIPS, etc.) podem incluir aritmética de acumulação de 64 bits apenas para essa finalidade.

hotpaw2
fonte