Próbuję zaimplementować filtr IIR 8. rzędu, a każda notka aplikacji i podręcznik, który przeczytałem, mówi, że najlepiej jest zaimplementować dowolny filtr rzędu więcej niż 2 jako sekcje drugiego rzędu. Użyłem tf2sos
w MATLAB, aby uzyskać współczynniki dla sekcji drugiego rzędu, co dało mi współczynniki 6x4 dla 4 sekcji drugiego rzędu, zgodnie z oczekiwaniami. Przed wdrożeniem jako SOS filtr 8. rzędu wymagał zapisania 7 poprzednich wartości próbek (a także wartości wyjściowych). Teraz, kiedy wdrażam jako sekcje drugiego rzędu, w jaki sposób przepływ działa od wejścia do wyjścia, czy muszę przechowywać tylko 2 poprzednie wartości próbek? A może wyjście pierwszego filtra jest przesyłane jak x_in
do drugiego filtra i tak dalej?
filters
filter-design
infinite-impulse-response
biquad
audio
image-processing
distance-metrics
algorithms
interpolation
audio
hardware
performance
sampling
computer-vision
dsp-core
music
frequency-spectrum
matlab
power-spectral-density
filter-design
ica
source-separation
fourier-transform
fourier-transform
sampling
bandpass
audio
algorithms
edge-detection
filters
computer-vision
stereo-vision
filters
finite-impulse-response
infinite-impulse-response
image-processing
blur
impulse-response
state-space
linear-systems
dft
floating-point
software-implementation
oscillator
matched-filter
digital-communications
digital-communications
deconvolution
continuous-signals
discrete-signals
transfer-function
image-processing
computer-vision
3d
anasimtiaz
źródło
źródło
Odpowiedzi:
To ostatnia rzecz, którą powiedziałeś („A może wyjście pierwszego filtra przesyła się jako x_in do drugiego filtra i tak dalej?”). Pomysł jest prosty: traktujesz biquady jako osobne filtry drugiego rzędu, które są kaskadowo. Sygnał wyjściowy z pierwszego filtra jest wejściem do drugiego i tak dalej, więc linie opóźniające są rozłożone między filtry. Jeśli potrzebujesz zoptymalizować strukturę w środowisku ograniczonym pamięcią, możesz zauważyć, że sąsiednie biquady mają nadmiarową pamięć opóźnień (tj. Kilka ostatnich próbek wyjściowych etapu 1 jest takich samych, jak kilka ostatnich próbek wejściowych etapu 2, więc nie nie będą musiały przechowywać ich osobno, tak jak w przypadku samodzielnego wdrożenia filtrów).
źródło
Istnieją dwa sposoby implementacji sekcji drugiego rzędu: równoległy i szeregowy. W wersji szeregowej dane wyjściowe sekcji N są wejściami do sekcji N + 1. W wersji równoległej wszystkie sekcje mają takie same dane wejściowe (i tylko jedno rzeczywiste zero zamiast sprzężonej złożonej pary zer), a dane wyjściowe każdej sekcji są po prostu sumowane. Te dwie metody są powiązane przez częściowe rozszerzenie ułamka funkcji przenoszenia w domenie Z. OSTRZEŻENIE: jest to trudny numerycznie problem, a standardowa implementacja Matlaba „reszz” może mieć bardzo duże błędy numeryczne dla typowych filtrów audio, które mają bieguny blisko koła jednostki.
źródło
Oto trochę kodu demonstracyjnego, który pokazuje, dlaczego lepiej jest kaskadować sekcje drugiego rzędu.
W przypadku filtra dolnoprzepustowego podanego w powyższym przykładzie, rzędu około 12 do 13, błędy numeryczne narastają, aby dać wyraźnie inną odpowiedź impulsową dla implementacji, która nie wykorzystuje kaskadowych biquadów. W zależności od filtra twój przebieg będzie się różnić.
ZAMÓWIENIE = 10
ZAMÓWIENIE = 13
źródło
[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);