Come funzionano le sezioni biquad a cascata per i filtri di ordine superiore?


20

Sto cercando di implementare un filtro IIR di ottavo ordine e ogni nota di applicazione e libro di testo che ho letto dice che è meglio implementare qualsiasi filtro di ordine superiore a 2 come sezioni del secondo ordine. Ho usato tf2sosin MATLAB per ottenere i coefficienti per le sezioni del secondo ordine che mi hanno dato un coefficiente di 6x4 per le sezioni del secondo ordine, come previsto. Prima dell'implementazione come SOS, il filtro dell'ottavo ordine richiedeva la memorizzazione di 7 valori campione precedenti (e anche i valori di output). Ora, quando si implementa come sezioni del secondo ordine come funziona il flusso dall'input all'output, è necessario memorizzare solo 2 valori campione precedenti? Oppure l'output del primo filtro si inserisce come x_innel secondo filtro e così via?


devi memorizzare gli stati precedenti per ogni fase, in base all'ordine del filtro in quella fase, in modo che non sia solo 2 come

Risposte:


13

È l'ultima cosa che hai detto ("O l'output del primo filtro viene inserito come x_in nel secondo filtro e così via?"). L'idea è semplice: trattate i biquad come filtri separati del secondo ordine in cascata. L'uscita dal primo filtro è l'ingresso al secondo, e così via, quindi le linee di ritardo sono distribuite tra i filtri. Se è necessario ottimizzare la struttura in un ambiente limitato dalla memoria, è possibile notare che i biquad adiacenti hanno una memoria di ritardo ridondante (vale a dire che gli ultimi campioni di output dello stadio 1 sono gli stessi degli ultimi campioni di input dello stadio 2, quindi non è necessario memorizzarli separatamente come si farebbe se si implementassero i filtri in modo isolato).


Grazie! Sono appena riuscito a farlo rapidamente in MATLAB. La causa della prima confusione era che avevo dimenticato di moltiplicare il guadagno (ugh!) E quindi ogni sorta di idee ha iniziato a insinuarsi.
anasimtiaz

Se non ti preoccupi di chiedere il guadagno come argomento di output da tf2sos (come nel mio codice di esempio pubblicato), non devi preoccuparti di moltiplicarlo nuovamente.
apprese il

9

Esistono in realtà due modi per implementare sezioni del secondo ordine: parallele e seriali. Nella versione seriale, le uscite della sezione N sono gli ingressi della sezione N + 1. Nella versione parallela tutte le sezioni hanno lo stesso input (e solo uno zero reale anziché una coppia complessa coniugata di zeri) e ogni output delle sezioni viene semplicemente riassunto. I due metodi sono correlati attraverso l'espansione parziale della funzione di trasferimento del dominio Z. ATTENZIONE: questo è un problema numericamente complicato e l'implementazione standard di Matlab "residuez" può avere errori numerici molto grandi per i filtri audio tipici che hanno poli vicini al cerchio dell'unità.


6

Ecco un po 'di codice demo per mostrare perché stai meglio a cascata delle sezioni del 2 ° ordine.

clc

sr = 44100;
order = 13;

[b,a] = butter(order,1000/(sr/2),'low');
[sos] = tf2sos(b,a);

x = [1; zeros(299,1)]; %impulse


% all in one
Y = filter(b,a,x);

% cascaded biquads
Z = x;
for nn = 1:size(sos,1);
    Z = filter(sos(nn,1:3),sos(nn,4:6), Z );
end


cla; plot(Y, 'k'); hold on; plot(Z,':r'); hold off

Per il filtro passa-basso fornito nell'esempio sopra, per ordini da circa 12 a 13, gli errori numerici si accumulano per dare una risposta all'impulso visibilmente diversa per l'implementazione che non utilizza biquad a cascata. A seconda del filtro, il tuo chilometraggio varierà.

ORDINE = 10

inserisci qui la descrizione dell'immagine

ORDINE = 13

inserisci qui la descrizione dell'immagine


@learvst Correggimi se sbaglio, ma il tuo codice non guadagna i guadagni. Non dovrebbe essere:[sos gain] = tf2sos(b,a); // Rest of code for nn = 1:size(sos,1); Z = filter(sos(nn,1:3),sos(nn,4:6), Z ); end Z = filter(gain,1,Z);
user915783
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.