Jak ręcznie wykreślić charakterystykę częstotliwościową pasmowego filtra Butterwortha w MATLAB-ie bez funkcji freqz?

15

Mam kod jak poniżej, który stosuje filtr pasmowoprzepustowy do sygnału. Jestem dość noob w DSP i chcę zrozumieć, co się dzieje za kulisami, zanim przejdę dalej.

Aby to zrobić, chcę wiedzieć, jak wykreślić odpowiedź częstotliwościową filtra bez użycia freqz.

[b, a] = butter(order, [flo fhi]);
filtered_signal = filter(b, a, unfiltered_signal)

Biorąc pod uwagę wyniki, [b, a]jak mam to zrobić? Wydaje się, że byłoby to proste zadanie, ale trudno mi znaleźć to, czego potrzebuję w dokumentacji lub w Internecie.

Chciałbym również zrozumieć, jak to zrobić tak szybko, jak to możliwe, np. Używając fftinnego szybkiego algorytmu.

William
źródło

Odpowiedzi:

25

Wiemy, że ogólnie funkcję transferu filtra zapewniają:

H(z)=k=0Mbkzkk=0Nakzk

Teraz zamień z=ejω aby ocenić funkcję przenoszenia na okręgu jednostkowym:

H(ejω)=k=0Mbkejωkk=0Nakejωk

Staje się to zatem tylko problemem oceny wielomianowej przy danym ω . Oto kroki:

  • Utwórz wektor częstotliwości kątowych ω=[0,,π] dla pierwszej połowy widma (nie trzeba zwiększać do 2π ) i zapisz go w.
  • Przed obliczeniem wykładnika ejω na wszystkich z nich i zapisz go w zmiennej ze.
  • Użyj polyvalfunkcji, aby obliczyć wartości licznika i mianownika, wywołując polyval(b, ze):, podziel je i zapisz H. Ponieważ interesuje nas amplituda, weź bezwzględną wartość wyniku.
  • Przelicz na skalę dB za pomocą: HdB=20log10H - w tym przypadku 1 jest wartością odniesienia.

Umieszczenie tego wszystkiego w kodzie:

%% Filter definition
a = [1 -0.5 -0.25]; % Some filter with lot's of static gain
b = [1 3 2];

%% My freqz calculation
N = 1024; % Number of points to evaluate at
upp = pi; % Evaluate only up to fs/2
% Create the vector of angular frequencies at one more point.
% After that remove the last element (Nyquist frequency)
w = linspace(0, pi, N+1); 
w(end) = [];
ze = exp(-1j*w); % Pre-compute exponent
H = polyval(b, ze)./polyval(a, ze); % Evaluate transfer function and take the amplitude
Ha = abs(H);
Hdb  = 20*log10(Ha); % Convert to dB scale
wn   = w/pi;
% Plot and set axis limits
xlim = ([0 1]);
plot(wn, Hdb)
grid on

%% MATLAB freqz
figure
freqz(b,a)

Oryginalna produkcja freqz:

enter image description here

Wyjście mojego skryptu:

enter image description here

I szybkie porównanie w skali liniowej - wygląda świetnie!

[h_f, w_f] = freqz(b,a);
figure
xlim = ([0 1]);
plot(w, Ha) % mine
grid on
hold on
plot(w_f, abs(h_f), '--r') % MATLAB
legend({'my freqz','MATLAB freqz'})

enter image description here

Teraz możesz przepisać go na jakąś funkcję i dodać kilka warunków, aby była bardziej użyteczna.


Innym sposobem (wcześniej zaproponowanym jest bardziej wiarygodny) byłoby wykorzystanie podstawowej właściwości, że odpowiedź częstotliwościowa filtra jest transformatą Fouriera jego odpowiedzi impulsowej:

H(ω)=F{h(t)}

Dlatego musisz wprowadzić sygnał do swojego systemu δ(t) , obliczyć odpowiedź filtra i wziąć FFT:

d = [zeros(1,length(w_f)) 1 zeros(1,length(w_f)-1)];
h = filter(b, a, d);
HH = abs(fft(h));
HH = HH(1:length(w_f));

Dla porównania spowoduje to:

enter image description here

jojek
źródło
1
Szczegółowe wyjaśnienie
partida
Myślę o tej linii a = [1 -0.5 -0.25]; % Some filter with lot's of static gain. Czy możesz mi wyjaśnić tutaj wybór tych parametrów. Czytam instrukcję mojego Matlaba i jest napisana [h,w] = freqz(hfilt,n)w jednej części synapsy. Dajesz dwa filtry (a, b) do freqz. Czy oba filtry są włączone hfilt? Lub jeden w n?
Léo Léopold Hertz 준영
Dla wyjaśnienia innym: „Nie ma potrzeby zwiększania do 2 pi” występuje wtedy, gdy współczynniki są rzeczywiste. Istnieją zastosowania filtrów o złożonych współczynnikach iw takim przypadku widmo nie będzie już symetryczne i w takim przypadku chciałoby zwiększyć częstotliwość do 2 pi.
Dan Boschen
14

jest to tylko dodatek do odpowiedzi Jojeka, który jest bardziej ogólny i doskonale dobry, gdy używana jest matematyka o podwójnej precyzji. gdy występuje mniejsza precyzja, pojawia się „problem kosinusowy”, który pojawia się, gdy albo częstotliwość w odpowiedzi częstotliwościowej jest bardzo niska (znacznie niższa niż Nyquist), a także gdy częstotliwości rezonansowe filtra są bardzo niskie.

|H(ejω)|2)|H(ejω)|=|H(ejω)|

rozważ tę tożsamość trig:

cos(ω) = 12sin2(ω2)

sin2(ω2)ω0

sin2(ω2)

H.(z)=b0+b1z-1+b2)z-2)za0+za1z-1+za2)z-2)

który ma złożoną charakterystykę częstotliwościową

H.(mijotω)=b0+b1mi-jotω+b2)mi-jot2)ωza0+za1mi-jotω+za2)mi-jot2)ω

który ma kwadratową wielkość:

|H(ejω)|2=|b0+b1ejω+b2ej2ω|2|a0+a1ejω+a2ej2ω|2=(b0+b1cos(ω)+b2cos(2ω))2+(b1sin(ω)+b2sin(2ω))2(a0+a1cos(ω)+a2cos(2ω))2+(a1sin(ω)+a2sin(2ω))2=b02+b12+b22+2b1(b0+b2)cos(ω)+2b0b2cos(2ω)a02+a12+a22+2a1(a0+a2)cos(ω)+2a0a2cos(2ω)

|H(ejω)|cos(ω)cos(2ω)ω11

używając powyższej tożsamości trig, otrzymujesz do kwadratu wielkości:

|H(ejω)|2=b02+b12+b22+2b1(b0+b2)cos(ω)+2b0b2cos(2ω)a02+a12+a22+2a1(a0+a2)cos(ω)+2a0a2cos(2ω)=b02+b12+b22+2b1(b0+b2)(12sin2(ω2))+2b0b2(12sin2(ω))a02+a12+a22+2a1(a0+a2)(12sin2(ω2))+2a0a2(12sin2(ω))=b02+b12+b22+2b1(b0+b2)(12sin2(ω2))+2b0b2(2cos2(ω)1)a02+a12+a22+2a1(a0+a2)(12sin2(ω2))+2a0a2(2cos2(ω)1)=b02+b12+b22+2b1(b0+b2)(12sin2(ω2))+2b0b2(2(12sin2(ω2))21)a02+a12+a22+2a1(a0+a2)(12sin2(ω2))+2a0a2(2(12sin2(ω2))21)=b02+b12+b22+2b1(b0+b2)(12ϕ)+2b0b2(2(12ϕ)21)a02+a12+a22+2a1(a0+a2)(12ϕ)+2a0a2(2(12ϕ)21)=b02+b12+b22+2b1(b0+b2)(12ϕ)+2b0b2(18ϕ+8ϕ2)a02+a12+a22+2a1(a0+a2)(12ϕ)+2a0a2(18ϕ+8ϕ2)=b02+b12+b22+2b1b0+2b1b24(b1b0+b1b2)ϕ+2b0b216b0b2ϕ+16b0b2ϕ2a02+a12+a22+2a1a0+2a1a24(a1a0+a1a2)ϕ+2a0a216a0a2ϕ+16a0a2ϕ2=(b02+b12+b22+2b1b0+2b1b2+2b0b2)4(b1b0+b1b24b0b2)ϕ+16b0b2ϕ2(a02+a12+a22+2a1a0+2a1a2+2a0a2)4(a1a0+a1a24a0a2)ϕ+16a0a2ϕ2=14(b02+b12+b22+2b1b0+2b1b2+2b0b2)(b1b0+b1b24b0b2)ϕ+4b0b2ϕ214(a02+a12+a22+2a1a0+2a1a2+2a0a2)(a1a0+a1a24a0a2)ϕ+4a0a2ϕ2=(b0+b1+b22)2ϕ(4b0b2(1ϕ)+b1(b0+b2))(a0+a1+a22)2ϕ(4a0a2(1ϕ)+a1(a0+a2))

where ϕsin2(ω2)

if your gear is intending to plot this as dB, it comes out as

20log10|H(ejω)| = 10log10((b0+b1+b22)2ϕ(4b0b2(1ϕ)+b1(b0+b2)))10log10((a0+a1+a22)2ϕ(4a0a2(1ϕ)+a1(a0+a2)))

so your division turns into subtraction, but you have to be able to compute logarithms to some base or another. numerically, you will have much less trouble with this for low frequencies than doing it the apparent way.

robert bristow-johnson
źródło
2
That's really cool, thank you Robert! +1
jojek
@Robert I "believe" similar to my comment for Jojek above that this only applies as well when the coefficients are real (and therefore the spectrum is symmetric and thus the magnitude converts to cosines as you show)... Am I correct?
Dan Boschen
yes. that commitment is made when you go from the first line of |H(ejω)|2=... to the second line. no going back after that.
robert bristow-johnson