Projektowanie filtrów
Autorzy: Krzysztof Duda, Przemysław Korohoda
Pliki: rozdzial_04.zip
Przykład 4.1
Obliczanie charakterystyki amplitudowej oraz położenia zer i biegunów zadanej transmitancji H(s) i H(z) (plik przyklad_4_1.m).% Przykład 4.1: % m-plik: przyklad_4_1.m % % Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014. % Rozdział 4. Projektowanie filtrów. % Autorzy rozdziału: Krzysztof Duda, Przemysław Korohoda. % % Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl % % Opracowanie przykładu: kwiecień 2013 r./KD. close all, clear all, clc Ba = [1]; %współczynniki wielomianu licznika H(s) Aa = [1 sqrt(2) 1]; %współczynniki wielomianu mianownika H(s) Bd = [0.12858 0]; %współczynniki wielomianu licznika H(z) Ad = [1 -1.4225 0.55301]; %współczynniki wielomianu mianownika H(z) %% odpowiedź częstotliwościowa H(s) w Matlabie funkcja freqs w = 0:0.1:5; %zakres częstotliwosci w [rad/s] s = j*w; HBa = polyval(Ba,s); HAa = polyval(Aa,s); Ha = HBa./HAa; %% odpowiedź częstotliwościowa H(z) w Matlabie funkcja freqz Om = 0:0.05:pi; %zakres częstotliwosci w [rad] z = exp(j*Om); HBd = polyval(Bd,z); HAd = polyval(Ad,z); Hd = HBd./HAd; %% zera i bieguny [za,pa,ka] = tf2zp(Ba,Aa); [zd,pd,kd] = tf2zp(Bd,Ad); %% wykresy figure subplot(2,2,1) plot(w, abs(Ha),'.-'), xlabel('\omega (rad/s)'), ylabel('|H(s)|') axis tight,box on subplot(2,2,2) plot(Om, abs(Hd),'.-') xlabel('\Omega (rad)'), ylabel('|H(z)|') axis tight,box on subplot(2,2,3), hold on v = [-1.3 1.3 -1 1]; %zakres osi plot(real(pa), imag(pa),'xb') legend('bieguny H(s)') plot([0 0],[v(3) v(4)],'-k') %oś OY plot([v(1) v(2)],[0 0],'-k') %oś OX xlabel('Re'), ylabel('Im') axis(v), box on, axis equal subplot(2,2,4), hold on plot(real(zd), imag(zd),'ob') plot(real(pd), imag(pd),'xb') legend('zera H(z)','bieguny H(s)') plot([0 0],[v(3) v(4)],'-k') %oś OY plot([v(1) v(2)],[0 0],'-k') %oś OX O = -pi:0.01:pi; O = exp(j*O); plot(real(O),imag(O),'-k') %okrąg xlabel('Re'), ylabel('Im') axis(v), box on, axis equal % KONIEC PRZYKŁADU 4.1.
Przykład 4.2
Optymalny w sensie średniokwadratowym, dolnoprzepustowy filtr FIR. Przykładowe wykorzystanie funkcji w „Przykład 4.4.A” (plik fir_mse.m).function [h,a]=fir_mse(M,Omc); % [h,a]=fir_mse(M,Omc); % % projektowanie optymalnego w sensie średniokwadratowym % dolnoprzepustowego filtra FIR o symetrycznej odpowiedzi % impulsowej typu I i długości N=2M+1 % Omc - krawędź pasma w radianach % % Przykład 4.2. % m-plik (funkcyjny): fir_mse.m % % Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014. % Rozdział 4. Projektowanie filtrów. % Autorzy rozdziału: Krzysztof Duda, Przemysław Korohoda. % % Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl % % Opracowanie przykładu: kwiecień 2013 r./KD. dOm= pi/1e3; %krok całkowania Om = -pi: dOm : pi-dOm; NOm= length(Om); iR = zeros(M+1,M+1); % macierz iR nie zależy od współczynników filtra iR(1,1)=1; for k=2:M+1 iR(k, k) = 2; end OmD = ones(size(Om)); %żądana charakterystyka amplitudowa ind = find(abs(Om)>Omc); OmD(ind) = 0; c = zeros(M+1,1); for k=0:M c(k+1,1) = sum( OmD.*cos(k*Om) ) / NOm; end a = iR*c; for k=1:M h(k) = a(k+1)/2; end h = [fliplr(h) a(1) h]; % KONIEC PRZYKŁADU 4.2.
Przykład 4.3
Optymalny w sensie średniokwadratowym, dolnoprzepustowy filtr FIR z ważonym błędem. Przykładowe wykorzystanie funkcji w „Przykład 4.4.A” (plik fir_mse_W.m).function [h, a]=fir_mse_W(M,Omc,Wp,Ws); % [h,a]=fir_mse_W(M,Omc,Wp,Ws); % % projektowanie optymalnego w sensie średniokwadratowym % dolnoprzepustowego filtra FIR o symetrycznej odpowiedzi % impulsowej typu I i długości N=2M+1 % z ważoną charakterystyką amplitudową % Omc - krawędź pasma w radianach % Wp, Ws - wagi w paśmie przepustowym i zaporowym % % Przykład 4.3. % m-plik (funkcyjny): fir_mse_W.m % % Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014. % Rozdział 4. Projektowanie filtrów. % Autorzy rozdziału: Krzysztof Duda, Przemysław Korohoda. % % Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl % % Opracowanie przykładu: kwiecień 2013 r./KD. dOm= pi/1e3; %krok całkowania Om = -pi: dOm : pi-dOm; NOm= length(Om); OmD= ones(size(Om)); %żądana charakterystyka amplitudowa ind= find(abs(Om)>Omc); OmD(ind) = 0; OmW = Wp*ones(size(Om)); %funkcja ważąca OmW(ind) = Ws*ones(size(ind)); R = zeros(M+1,M+1); for n=0:M for m=0:M R(n+1,m+1)= sum( OmW.*cos(Om*n).*cos(Om*m) )/NOm; end end iR = inv(R); c = zeros(M+1,1); for k=0:M c(k+1,1) = sum( OmW.*OmD.*cos(k*Om) )/NOm; end a = iR*c; for k=1:M h(k) = a(k+1)/2; end h = [fliplr(h) a(1) h]; % KONIEC PRZYKŁADU 4.3.
Przykład 4.4
Optymalny w sensie minimum błędów maksymalnych, dolnoprzepustowy filtr FIR z ważonym błędem. Przykładowe wykorzystanie funkcji w „Przykład 4.4.A” (plik fir_min_max.m).function [h, a, delt_teor]=fir_min_max(M,Omp,Oms,Wp,Ws); % [h,a,delt_teor]=fir_min_max(M,Omp,Oms,Wp,Ws); % % projektowanie optymalnego w sensie minimum błedów maksymalnych % dolnoprzepustowego filtra FIR o symetrycznej odpowiedzi % impulsowej typu I i długości N=2M+1 % z ważoną charakterystyką amplitudową % Omp, Oms - pasmo przepustowe i zaporowe w radianach % Wp, Ws - wagi w paśmie przepustowym i zaporowym % % Przykład 4.4. % m-plik (funkcyjny): fir_min_max.m % % Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014. % Rozdział 4. Projektowanie filtrów. % Autorzy rozdziału: Krzysztof Duda, Przemysław Korohoda. % % Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl % % Opracowanie przykładu: kwiecień 2013 r./KD. N_eks = M+2; %liczba ekstremów dOm = (Omp(2)+Oms(2)-Oms(1))/N_eks; Om = 0:dOm:pi; Np=round(Omp(2)/dOm); %liczba ekstremów w pasmie przepustowym Ns=N_eks-Np; %liczba ekstremów w pasmie zaporowym Omk = [Om(1:Np) Om(end-Ns+1:end)]; %częstotliwosci ekstremów for KK=1:1e2 %pętla może być przerwana funkcją break w linni 48 R = zeros(N_eks,N_eks-1); c = ones(N_eks,1); ind_c= find(Omk>=Oms(1)); c(ind_c) = 0; znak = (-1).^([1:N_eks]); w = znak/Wp; w(ind_c) = znak(ind_c)/Ws; w=w(:); for k=0:N_eks-1 for m=0:M R(k+1,m+1)=cos(m*Omk(k+1)); end end a_delt = inv([R w])*c; %% ch-ka filtra Om = 0:pi/1e3:pi; Hw = zeros(size(Om)); for n=0:M Hw = Hw + a_delt(n+1)*cos(n*Om ); end pochodna = diff(Hw); zmiana_znaku = [0 pochodna].*[pochodna 0]; ind1= find(pochodna==0); ind2= find(zmiana_znaku<0); ind = [ind2 ind1]; %indeksy do maksimów %% obliczenie błędu delt_teor = abs(a_delt(N_eks)); Om_eks = Om(ind); Hw_eks = Hw(ind); ind_eks= find(Om_eks>=Oms(1)); delt = Wp*(1-Hw_eks); delt(ind_eks)= Ws*(0-Hw_eks(ind_eks)); %pasmo zaporowe delt_max=max(abs(abs(delt))); if abs(delt_max-delt_teor)<1e-9; disp(['Wykonano ' num2str(KK) ' iteracji']) break %wyjscie z pętli end if Wp>=Ws Omk = [Om(ind) 0 pi Omp(2) Oms(1)]; %nowe częstotliwości else Omk = [Om(ind) 0 pi Oms(1) Omp(2)]; %nowe częstotliwości end % Omk = sort( Omk(1:N_eks),'ascend'); Omk = sort(Omk(1:N_eks)); Omk=Omk(end:-1:1); end for k=1:M h(k) = a_delt(M-k+2)/2; end h = [h a_delt(1) fliplr(h)]; % KONIEC PRZYKŁADU 4.4.
Przykład 4.4.A
Przykład ten (plik przyklad_4_4_A.m) pokazuje jak można skorzystać z funkcji zawartych w przykładach 4.2, 4.3 oraz 4.4 i prezentuje porównanie otrzymanych filtrów w postaci ich charakterystyk amplitudowych.% Przykład 4.4.A: % m-plik: przyklad_4_4_A.m % % Rozdział 4. Projektowanie filtrów. % Autorzy rozdziału: Krzysztof Duda, Przemysław Korohoda. % % Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl % % Opracowanie przykładu: kwiecień 2013 r./KD. close all, clear all, clc FontName = 'Times New Roman'; FontSize = 24; Resolution = 600; M = 10 N = 2*M+1 Omp = [0 0.45*pi ]; %pasmo przepustowe Oms = [0.55*pi pi ]; %pasmo zaporowe Omc = (Omp(2)+Oms(1))/2; Wp = 1; Ws = 100; %% 1. MSE h_1 = fir_mse(M,Omc); %% 2. MSE wazony Wp1 = 1; Ws1 = 175; h_2=fir_mse_W(M,Omc,Wp1,Ws1); %% 3. MIN-MAX M=[10] Wp2=1; Ws2=10; h_3=fir_min_max(M,Omp,Oms,Wp2,Ws2); %% Ch-ki amplitudowe [Hw_1, w_1] = freqz(h_1,1); [Hw_2, w_2] = freqz(h_2,1); [Hw_3, w_3] = freqz(h_3,1); kreska=['-k';'-b';'-r']; FontSize = 16; figure, hold on subplot(2,1,1), hold on plot(w_1, 20*log10(abs(Hw_1)), kreska(1,:),'LineWidth',1) plot(w_2, 20*log10(abs(Hw_2)), kreska(2,:),'LineWidth',1) plot(w_3, 20*log10(abs(Hw_3)), kreska(3,:),'LineWidth',1) %legend('MS','MSW','MinMax') title(['N=' num2str(N)],'FontSize',FontSize,'FontName',FontName) xlabel('\Omega (rad)','FontSize',FontSize,'FontName',FontName) ylabel('|H(\Omega)| (dB)','FontSize',FontSize,'FontName',FontName) axis tight, box on, grid on v=axis; axis([v(1) 2 -2 2]) set(gca,'FontSize',FontSize,'FontName',FontName) subplot(2,1,2), hold on plot(w_1, 20*log10(abs(Hw_1)), kreska(1,:),'LineWidth',1) plot(w_2, 20*log10(abs(Hw_2)), kreska(2,:),'LineWidth',1) plot(w_3, 20*log10(abs(Hw_3)), kreska(3,:),'LineWidth',1) legend('MS','MSW','MM','Location','SouthWest') title(['N=' num2str(N)],'FontSize',FontSize,'FontName',FontName) xlabel('\Omega (rad)','FontSize',FontSize,'FontName',FontName) ylabel('|H(\Omega)| (dB)','FontSize',FontSize,'FontName',FontName) axis tight, box on, grid on v=axis; axis([v(1) v(2) -60 5]) set(gca,'FontSize',FontSize,'FontName',FontName) % KONIEC PRZYKŁADU 4.4.A;
Przykład 4.5
Przykład (plik przyklad_4_5.m) przedstawia obliczenia wstępne przygotowujące do badania filtra interpolującego według (4.71) oraz – porównawczo – tego samego filtra z zastosowanym oknem Hamminga. Warto także porównać wyniki otrzymane dla innych okien dostępnych w pakiecie MATLAB. Przykłady wykresów można zobaczyć na rysunku 4.43. Należy zwrócić uwagę na szczególnie wnikliwe studium charakterystyki fazowej.% Przykład 4.5: % m-plik: przyklad_4_5.m % % Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014. % Rozdział 4. Projektowanie filtrów. % Autorzy rozdziału: Krzysztof Duda, Przemysław Korohoda. % % Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl % % Opracowanie przykładu: kwiecień 2013 r./PK. clc; clear; close all; M=11; n=0:M; d=0.25; % określamy rząd filtra, indeksy dla h[n] oraz opóźnienie ułamkowe; h1=sinc(n-(M+1)/2+d); % wyliczamy h1[n] dla filtra według (4.71); w=hamming(M+1); % wyliczamy wartości okna Hamminga; h2=h1.*w'; % mnożymy h1[n] przez współczynniki okna; [H1,W]=freqz(h1,1,10000); F=W/(2*pi); % wyznaczamy DTFT dla h1[n]; dF=F(2)-F(1); P1=unwrap(angle(H1)); % wyliczamy przyrost na osi F oraz ch-kę fazową; D10=-P1(2:end)./F(2:end); % wyliczamy opóźnienie fazowe; D1=D10/(2*pi); % ... i przeliczamy na opóźnienie w indeksach; G10=-(P1(2:end)-P1(1:end-1))/dF; % wyliczamy opóźnienie grupowe; G1=G10/(2*pi); % ... i przeliczamy na opóźnienie w indeksach; figure(1); plot(0:M,h2,'bo-'); grid on; axis tight xlabel('n'); legend('elementy odpowiedzi impulsowej h1[n]'); figure(2); subplot(4,1,1); plot(F,abs(H1),'b.-'); grid on; legend('DTFT: modul(H1)',0); subplot(4,1,2); plot(F,angle(H1)/pi,'b.-'); grid on; legend('DTFT: faza(H1)/pi',0); subplot(4,1,3); plot(F(1:end-1)+dF/2,D1,'b.-'); grid on; legend('opoznienie fazowe dla h1',0); subplot(4,1,4); plot(F(1:end-1)+dF/2,G1,'b.-'); grid on; legend('opoznienie grupowe dla h1',0); xlabel('F'); % analogicznie dla h2, a następnie wykresy - ale to już proszę wykonać samodzielnie... % KONIEC PRZYKŁADU 4.5.
Przykład 4.6
Przykład (plik przyklad_4_6.m) pokazuje zrealizowane w pakiecie MATLAB porównanie dwóch metod interpolacji wynikającej z K-krotnego zwiększenia tempa próbkowania sygnału wejściowego: a) za pomocą banku filtrów polifazowych typu sinc, b) za pomocą pojedynczej filtracji wykonanej po nadpróbkowaniu.% Przykład 4.6: % m-plik: przyklad_4_6.m % % Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014. % Rozdział 4. Projektowanie filtrów. % Autorzy rozdziału: Krzysztof Duda, Przemysław Korohoda. % % Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl % % Opracowanie przykładu: kwiecień 2013 r./PK. clc; clear; close all; M=10; n=0:M; K=32; % rząd filtra , indeksy h[n] oraz krotność nadpróbkowania; dd=1/K; % ułamkowy krok opóźnienia w dziedzinie indeksów; k=0; % uruchamiamy licznik pętli; for d=0:dd:1-dd; k=k+1; % początek pętli oraz zwiększenie licznika "k" w każdym obiegu; hh(k,:)=sinc(n-M/2+d); % w wierszach macierzy hh umieszczamy kolejne odp. impulsowe; h0(k:K:K*(M+1))=hh(k,:); % te same odp. impulsowe układamy naprzemiennie w h0[n]; end; N=2^8; x=rand(1,N); % to jest dyskretny "dowolny sygnał"; for k=1:K, y1(k:K:K*N)=filter(hh(k,:),1,x); % wyliczamy poprzesuwane wyniki filtracji % (patrz rys.4.42), % układając próbki naprzemiennie w ciągu wynikowym; end; % sposób alternatywny: x2=zeros(1,K*N); x2(1:K:K*N)=x; % ciąg x2, to nadpróbkowany K-krotnie sygnał x; y2=filter(h0,1,x2); % wyznaczamy wynik filtracji za pomocą h0; err=max(abs(y1(:)-y2(:))), % porównanie, czy to na pewno to samo; figure(1); subplot(2,1,1); plot(y1,'r.-'); grid on; hold on; plot(y2,'bo-'); title('Warto ten wykres rozciagnac'); legend('sygnal y1','sygnal y2'); xlabel('n'); subplot(2,1,2); plot(h0,'ko-'); grid on; legend('odp.imp. h0[n]'); xlabel('n'); figure(2); mesh(hh); axis tight; title('wszystkie odpowiedzi impulsowe razem'); xlabel('indeks n'); ylabel('numer odpowiedzi imp.'); % KONIEC PRZYKŁADU 4.6.
Przykład 4.7
Przykład (plik przyklad_4_7.m) pokazuje wzajemne powiązania między najważniejszymi wielkościami występującymi w opisie zagadnienia oraz konfrontuje wynik zastosowania wzoru (4.74) oraz dwóch sposobów wykorzystania funkcji firrcos.% Przykład 4.7: % m-plik: przyklad_4_7.m % % Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014. % Rozdział 4. Projektowanie filtrów. % Autorzy rozdziału: Krzysztof Duda, Przemysław Korohoda. % % Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl % % Opracowanie przykładu: kwiecień 2013 r./PK. clc; clear; close all; % porządki wstępne; Tb=0.01; % czas trwania pojedynczego symbolu; M=200; K=20; % założony rząd filtra oraz liczba próbek na symbol; a=0.5; % parametr pasma przejsciowego filtra; fpr=K/Tb; % częstotliwość próbkowania; Df=a/Tb; % szerokość pasma przejsciowego filtra; h0 = firrcos( M, 1/(2*Tb), Df, fpr); % MATLAB: 1. sposób; h1 = firrcos( M, 1/(2*Tb), a, fpr,'rollof'); % MATLAB: 2. sposób; %% wzór (4.74): n=0:M; Nd=M/2; % indeksy oraz wartość opóźnienia; h2 = sinc((n-Nd)/K).* cos(pi*a*(n-Nd)/K)./(1-4*a^2*(n-Nd).^2/K^2); n0=find((1-4*a^2*(n-Nd).^2/K^2)==0); % wzór może dać dzielenie 0/0; h2(n0)=0; % wartość graniczna, gdy ze wzoru wynika 0/0; h2=h2/K; % normalizacja; err_0=max(abs(h0-h1)), % weryfikacja nr 1; err_1=max(abs(h1-h2)), % weryfikacja nr 2; [H,W]=freqz(h2,1,1000); % wyliczenie DTFT, czyli charakterystyk filtra; F=W/(2*pi); f=F*fpr; % przeliczenie W na F (częstotl. unormowaną) oraz na f [Hz]; figure(1); plot(0:M,h2,'bo-'); grid on; legend('odp. impulsowa h2'); xlabel('n'); figure(2); subplot(211); plot(f,abs(H),'b.-'); grid on; legend('DTFT: modul(H)',0); title('Warto powiekszyc wybrane fragmenty'); subplot(212); plot(f,angle(H)/pi,'r.-'); grid on; legend('DTFT: faza(H)/pi',0); xlabel('f [Hz]'); % KONIEC PRZYKŁADU 4.7.
Przykład 4.8
W przykładzie (plik przyklad_4_8.m) przedstawiono opisaną w rozdziale procedurę projektowania filtrów interpolowanych z wykorzystaniem filtrów FIR. Wyliczone odpowiedzi impulsowe i widma warto obejrzeć w postaci wykresów.% Przykład 4.8: % m-plik: przyklad_4_8.m % % Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014. % Rozdział 4. Projektowanie filtrów. % Autorzy rozdziału: Krzysztof Duda, Przemysław Korohoda. % % Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl % % Opracowanie przykładu: kwiecień 2013 r./PK. clear; close all; clc; % przygotowanie "biurka" do pracy; Fg=0.01; Fz=0.012; % częstotliwości graniczne filtra; A_dB=60; % tłumienie w paśmie zaporowym w dB; NF=100000; % liczba punktów na osi F do wylicz. ch-k; M=round(1/(Fg+Fz+sqrt(Fz-Fg))), % wyliczamy krotność nadpróbkowania; Nref=round(A_dB/(22*(Fz-Fg))), % wyliczamy rząd filtra "ref"; Wref=[1,10]; % wagi dla procedury "remez"; Aref=[1,1,0,0]; % amplitudy docelowe dla funkcji "remez"; Fref=[0,Fg,Fz,0.5]*2; % wektor częstotl. dla funkcji "remez"; href=remez(Nref,Fref,Aref,Wref); % wyznaczamy odpowiedź imp. filtra "ref"; [Href,W]=freqz(href,1,NF); F=W/(2*pi); % wyliczamy ch-ki filtra "ref"; Fprot=[0,Fg*M,Fz*M,0.5]*2; % wektor częstotl. dla funkcji "remez"; Nprot=floor(Nref/M), % wyliczamy rząd filtra "prot"; hprot=remez(Nprot,Fprot,Aref,Wref); % wyznaczamy odp. imp. filtra "prot"; hnp=zeros(1,M*Nprot+1); hnp(1:M:end)=hprot; % nadpróbkowanie; Hnp=freqz(hnp,1,NF); % ch-ki filtra po nadpróbkowaniu (F=Fref); Fintrp_z=1/M-Fz; Fintrp_g=Fg; % częstotliwości graniczne dla filtra "intrp"; Fintrp=[0,Fintrp_g,Fintrp_z,0.5]*2; % wektor częst. dla funkcji "remez"; Nintrp=round(A_dB/(22*(Fintrp_z-Fintrp_g))), % wyliczamy rząd filtra "intrp"; hintrp=remez(Nintrp,Fintrp,Aref,Wref); % wyznaczamy odp. imp. filtra "intrp"; Hintrp=freqz(hintrp,1,NF); % ch-ki filtra "intrp" (F=Fref); H_IFIR=Hnp.*Hintrp; % efekt zastępczy filtracji dwuetapowej; Oszczednosc_w_procentach=100*(Nref-Nintrp-Nprot)/Nref, figure(1); subplot(2,1,1); plot(F,abs(H_IFIR),'b.-'); grid on; hold on; plot(F,abs(Href),'r.-'); xlim([0,0.012]); title('DTFT: modul(H)'); legend('H_I_F_I_R','H_r_e_f',0); subplot(2,1,2); plot(F,angle(H_IFIR)/pi,'b.-'); grid on; hold on; plot(F,angle(Href)/pi,'r.-'); xlim([0,0.012]); title('DTFT: faza(H)/pi'); legend('H_I_F_I_R','H_r_e_f',0); xlabel('F'); % KONIEC PRZYKŁADU 4.8.
Przykład 4.9
W przykładzie (plik przyklad_4_9.m) przedstawiono opisaną w rozdziale procedurę z filtrami IIR. Wyliczone widma warto obejrzeć w postaci wykresów.% Przykład 4.9: % m-plik: przyklad_4_9.m % % Cyfrowe przetwarzanie sygnałów. Podstawy, multimedia, transmisja. PWN, Warszawa, 2014. % Rozdział 4. Projektowanie filtrów. % Autorzy rozdziału: Krzysztof Duda, Przemysław Korohoda. % % Więcej na stronie internetowej: http://teledsp.kt.agh.edu.pl % % Opracowanie przykładu: kwiecień 2013 r./PK. clc; clear; close all; % przygotowanie "biurka" do pracy; Fg=0.01; Fz=0.012; % częstotliwości graniczne filtra; A_dB=60; % tłumienie w paśmie zaporowym w dB; NF=100000; % liczba punktów na osi F do wylicz. ch-k; M=20; p=2*pi/(3*M); r=127/128; % parametry które warto zmieniać; Nref=round(A_dB/(22*(Fz-Fg))), % wyliczamy rząd filtra "ref"; Wref=[1,10]; % wagi dla procedury "remez"; Aref=[1,1,0,0]; % amplitudy docelowe dla funkcji "remez"; Fref=[0,Fg,Fz,0.5]*2; % wektor częstotl. dla funkcji "remez"; href=remez(Nref,Fref,Aref,Wref);% wyznaczamy odpowiedź imp. filtra "ref"; [Href,W]=freqz(href,1,NF); F=W/(2*pi); % wyliczamy ch-ki filtra "ref"; Fprot=[0,Fg*M,Fz*M,0.5]*2; % wektor częstotl. dla funkcji "remez"; Nprot=floor(Nref/M), % wyliczamy rząd filtra "prot"; hprot=remez(Nprot,Fprot,Aref,Wref); % wyznaczamy odp. imp. filtra "prot"; hnp=zeros(1,M*Nprot+1); hnp(1:M:end)=hprot; % nadpróbkowanie; Hnp=freqz(hnp,1,NF); % ch-ki filtra po nadpróbkowaniu (F=Fref); A=1+2*cos(M*p); B=1+2*cos(p); % a1 i b1 opisują Hintrp1(z); b1=[1,zeros(1,M-1),-r^M*A,zeros(1,M-1),r^(2*M)*A,zeros(1,M-1),-r^(3*M)*1]; a1=[1,-r*B,r^2*B,-r^3*1]; Hintrp1=freqz(b1,a1,NF); C=2*cos(M*p/2); D=2*cos(p/2); % a2 i b2 opisują Hintrp2(z); b2=[1,zeros(1,M-1),-r^M*C,zeros(1,M-1),r^(2*M)*1]; a2=[1,-r*D,r^2*1]; Hintrp2=freqz(b2,a2,NF); E=5.2; % tę wartość dobieramy ręcznie; hkor=[1,zeros(1,M-1),-E,zeros(1,M-1),1]; % odp. impulsowa filtra FIR korygującego; Hkor=freqz(hkor,1,NF); H_IFIR=Hnp.*Hintrp1.*Hintrp2.*Hkor; % efekt zastępczy filtracji; figure(1); subplot(4,1,1); plot(F,abs(Hnp),'b.-'); grid on;; hold on; xlim([0,0.012]); legend('DTFT: modul(H_n_p)',0); subplot(4,1,2); plot(F,abs(Hintrp1),'b.-'); grid on;; hold on; xlim([0,0.012]); legend('DTFT: modul(H_i_n_t_r_p_1)',0); subplot(4,1,3); plot(F,abs(Hintrp2),'b.-'); grid on;; hold on; xlim([0,0.012]); legend('DTFT: modul(H_i_n_t_r_p_2)',0); subplot(4,1,4); plot(F,abs(Hkor),'b.-'); grid on;; hold on; xlim([0,0.012]); legend('DTFT: modul(H_k_o_r)',0); xlabel('F'); figure(2); subplot(2,1,1); plot(F,abs(H_IFIR)/max(abs(H_IFIR)),'b.-'); grid on; hold on; plot(F,abs(Href),'r.-'); xlim([0,0.012]); title('DTFT: modul(H)'); legend('H_I_F_I_R','H_r_e_f',0); subplot(2,1,2); plot(F,angle(H_IFIR)/pi,'b.-'); grid on; hold on; plot(F,angle(Href)/pi,'r.-'); xlim([0,0.012]); title('DTFT: faza(H)/pi'); legend('H_I_F_I_R','H_r_e_f',0); xlabel('F'); % KONIEC PRZYKŁADU 4.9.