Filtrage passe-bas sur les échantillons courts int (PCM 16 bits)

9

J'écris un logiciel de traitement audio donné en échantillons PCM 16 bits. La première étape du traitement consiste à calculer l'énergie (ou variation totale) dans une certaine plage de fréquences (au-dessus d'une certaine fréquence de coupure).

Ce que je fais actuellement, c'est soustraire l'énergie du signal filtré passe-bas de l'énergie du signal d'origine. J'ai découvert qu'une grande partie du traitement est dédiée à la conversion des sampels entiers en une représentation en virgule flottante.

Ma question est donc la suivante: existe-t-il une technique pour filtrer les échantillons entiers sans les convertir en virgule flottante?

smichak
la source

Réponses:

6

Oui bien sûr, vous pouvez appliquer le filtre directement aux échantillons entiers, en utilisant l' arithmétique à virgule fixe .

Par exemple, si vous utilisez un filtre FIR avec des coefficients [1/3, 1, 1/2] et une résolution de 8 bits pour les coefficients, votre sortie sera:

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

Deux choses à prendre en compte:

  • La quantification des coefficients pourrait entraîner au mieux de légères modifications des réponses du filtre, au pire provoquer des instabilités du filtre. Quel est votre type de filtre et la valeur de ses coefficients?

  • Débordement / types de données / problèmes de troncature. Dans l'exemple ci-dessus, out peut dépasser la plage d'un entier 16 bits, vous devrez donc effectuer un découpage.

pichenettes
la source
2
Je pense que l'échantillon [n - 1] devrait être multiplié par 256; sinon, il est effectivement pondéré par au lieu de . 12561
Jason R
vous avez raison, édité!
pichenettes du
3
@pichenettes Peut-être bien d'expliquer comment vous êtes arrivé aux valeurs quantifiées, signé vs non signé, etc. À vous de choisir.
Jim Clay
3

Certains processeurs, convertissant un bloc d'entiers volumineux (mais en cache) en flottants avant de les traiter, pourraient être plus rapides, en raison de l'élimination des dangers liés aux pipelines. Vous voudrez peut-être comparer cela.

Si vous utilisez une arithmétique entière ou à virgule fixe, la quantité de précision entière supplémentaire dont vous aurez besoin dans les coefficients et les valeurs intermédiaires est à peu près proportionnelle au rapport entre votre fréquence d'échantillonnage et la fréquence de coupure souhaitée. Vous devrez peut-être utiliser une arithmétique entière de précision de 24,32,48 bits ou plus sur vos échantillons 16 bits pour atteindre le niveau de bruit de fond numérique souhaité. Certains jeux d'instructions de processeur (ARM, MIPS, etc.) peuvent inclure une arithmétique d'accumulation 64 bits à cette fin.

hotpaw2
la source