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?

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.