Tiefpassfilterung für kurze int (16 Bit PCM) Samples

9

Ich schreibe Software zur Verarbeitung von Audio als 16-Bit-PCM-Samples. Die erste Stufe der Verarbeitung umfasst die Berechnung der Energie (oder der Gesamtvariation) in einem bestimmten Frequenzbereich (oberhalb einer bestimmten Grenzfrequenz).

Was ich gerade mache, ist das Subtrahieren der Energie des tiefpassgefilterten Signals von der Energie des ursprünglichen Signals. Ich fand heraus, dass ein Großteil der Verarbeitung der Konvertierung der ganzzahligen Sampels in eine Gleitkommadarstellung gewidmet ist.

Meine Frage ist also, gibt es eine Technik zum Filtern der ganzzahligen Abtastwerte, ohne sie in Gleitkomma umzuwandeln?

Smichak
quelle

Antworten:

6

Ja, natürlich können Sie den Filter mithilfe der Festkomma-Arithmetik direkt auf die ganzzahligen Abtastwerte anwenden .

Wenn Sie beispielsweise ein FIR-Filter mit Koeffizienten [1/3, 1, 1/2] und einer 8-Bit-Auflösung für Koeffizienten verwenden, lautet Ihre Ausgabe wie folgt:

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

Zwei Dinge, die Sie beachten sollten:

  • Die Quantisierung der Koeffizienten kann bestenfalls geringfügige Änderungen der Filterantworten verursachen, im schlimmsten Fall Filterinstabilitäten. Was ist Ihr Filtertyp und der Wert seiner Koeffizienten?

  • Überlauf / Datentypen / Kürzungsprobleme. Im obigen Beispiel kann out den Bereich einer 16-Bit-Ganzzahl überschreiten, sodass Sie einige Übersteuerungen vornehmen müssen.

Pichenettes
quelle
2
Ich denke, Probe [n - 1] sollte mit 256 multipliziert werden; Andernfalls wird es effektiv mit anstelle von gewichtet . 112561
Jason R
du hast recht, bearbeitet!
Pichenettes
3
@pichenettes Könnte gut sein, um zu erklären, wie Sie zu den quantisierten Werten gekommen sind, signiert gegen nicht signiert usw. Bis zu Ihnen.
Jim Clay
3

Bei einigen Prozessoren kann die Konvertierung eines großen Blocks (aber im Cache) von Ganzzahlen in Floats vor der Verarbeitung aufgrund der Beseitigung von Pipeline-Gefahren schneller sein. Vielleicht möchten Sie dies vergleichen.

Wenn Sie eine skalierte Ganzzahl- oder Festkomma-Arithmetik verwenden, ist der Betrag der hinzugefügten Ganzzahlgenauigkeit, den Sie für die Koeffizienten und Zwischenwerte benötigen, ungefähr proportional zum Verhältnis zwischen Ihrer Abtastrate und Ihrer gewünschten Grenzfrequenz. Möglicherweise müssen Sie für Ihre 16-Bit-Samples eine Ganzzahlarithmetik mit 24,32,48 Bit oder mehr verwenden, um den gewünschten numerischen Grundrauschpegel zu erreichen. Einige Prozessorbefehlssätze (ARM, MIPS usw.) können zu diesem Zweck eine 64-Bit-Akkumulationsarithmetik enthalten.

hotpaw2
quelle