Filtraggio passa basso su campioni int brevi (PCM a 16 bit)


9

Sto scrivendo un software per l'elaborazione dell'audio dato come campioni PCM a 16 bit. La prima fase dell'elaborazione prevede il calcolo dell'energia (o variazione totale) in un determinato intervallo di frequenza (al di sopra di una certa frequenza di taglio).

Quello che sto facendo attualmente è sottrarre l'energia del segnale filtrato passa-basso dall'energia del segnale originale. Ho scoperto che gran parte dell'elaborazione è dedicata alla conversione dei campioni interi in una rappresentazione in virgola mobile.

Quindi la mia domanda è: esiste una tecnica per filtrare i campioni interi senza convertirli in virgola mobile?

Risposte:


6

Sì, certo, puoi applicare il filtro direttamente ai campioni interi, usando l' aritmetica a punto fisso .

Ad esempio, se si utilizza un filtro FIR con coefficienti [1/3, 1, 1/2] e una risoluzione di 8 bit per i coefficienti, l'output sarà:

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

Due cose da tenere in considerazione:

  • La quantizzazione dei coefficienti potrebbe causare nella migliore delle ipotesi lievi variazioni delle risposte del filtro, nella peggiore delle ipotesi instabilità del filtro. Qual è il tuo tipo di filtro e il valore dei suoi coefficienti?

  • Overflow / Tipi di dati / Problemi di troncamento. Nell'esempio sopra, out può superare l'intervallo di un numero intero a 16 bit, quindi dovrai fare un po 'di clipping.


2
Penso che il campione [n - 1] debba essere moltiplicato per 256; in caso contrario, viene effettivamente ponderato da anziché . 12561
Jason R,

hai ragione, modificato!
Pichenettes,

3
@pichenettes Potrebbe essere utile spiegare come sei arrivato ai valori quantizzati, con segno rispetto a senza segno, ecc. A te.
Jim Clay,

3

Uno di alcuni processori, convertendo un grande blocco (ma in cache) di numeri interi in float prima di elaborarli potrebbe essere più veloce, a causa dell'eliminazione dei pericoli della pipeline. Potresti voler confrontare questo.

Se si utilizza l'aritmetica intera o in scala fissa, la quantità di precisione intera aggiunta necessaria nei coefficienti e nei valori intermedi è approssimativamente proporzionale al rapporto tra la frequenza di campionamento e la frequenza di taglio desiderata. Potrebbe essere necessario utilizzare l'aritmetica intera di precisione a 24,32,48 bit o superiore sui campioni a 16 bit per scendere al livello di rumore numerico desiderato. Alcuni set di istruzioni del processore (ARM, MIPS, ecc.) Possono includere l'aritmetica di accumulo a 64 bit proprio per questo scopo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.