Übung 10: Matlab-Entwurf von IIR
Transcription
Übung 10: Matlab-Entwurf von IIR
ZHAW, DSV1, FS2010, Rumc, 1 Übung 10: Matlab-Entwurf von IIR-Filtern Aufgabe 1: Bilineare Transformation. Entwerfen Sie (von Hand) ein digitales Butterworth-TP-Filter 1. Ordnung mit einer 3 dB Eckfrequenz von fdigital_DB = 1000 Hz. Die Abtastfrequenz betrage fs = 5000 Hz. Gehen Sie vom analogen Prototyp-Filter H(s) = 1 / (1+s/wDB) aus, wobei wDB = 2π·fanalog_DB , das einen Pol bei s = -wDB und eine Nullstelle bei s=∞ aufweist. a) Bestimmen Sie mit “prewarping” die analoge 3 dB Eckfrequenz fanalog_DB bzw. wDB. b) Bestimmen Sie mit Hilfe der bilinearen sz-Transformation die z-UTF H(z). c) Wie lauten die b,a-Filterkoeffizienten des Digitalfilters H(z)? d) Bestimmen Sie den Pol und die Nullstelle von H(z). Wohin bildet die bilineare Transformation den Pol und die Nullstelle von H(s) ab? Aufgabe 2: IIR-Filterentwurf mit analogen Prototypen. Die Spezifikation für ein digitales Tiefpassfilter lautet: Abtastfrequenz: fs = 8 kHz Durchlassbereich: Eckfrequenz fDB = 1 kHz, max. Dämpfung Amax = Rp = 1.2 dB Sperrbereich: Eckfrequenz fSB = 2 kHz, min. Dämpfung Amin = Rs = 40 dB Entwerfen Sie ein IIR-Filter mit kleinster Ordnung, das die obige Filterspezifikation (gerade noch) erfüllt, und a) Rippel im Durchlass- und im Sperrbereich aufweist. b) einen monoton fallenden Durchlass- und Sperrbereich aufweist. c) einen monoton fallenden Durchlassbereich und Rippel im Sperrbereich aufweist. Geben Sie je den Filtertyp (z.B. Butterworth-Filter), die minimale Filterordnung N und die (floating point) Filterkoeffizienten an und plotten Sie den Amplitudengang im Bereich [0 Hz,..., 4 kHz] bzw. [-80 dB, ..., 3 dB]. Sie können dazu die Vorlage dsv1ueb102.m verwenden. ZHAW, DSV1, FS2010, Rumc, 2 Aufgabe 3: FIR-Filter und Skalierung. Das FIR-BP-Filter mit den b-Koeffizienten b = [0.0139 0.0419 -0.1219 -0.2272 0.3022 0.3022 -0.2272 -0.1219 0.0419 0.0139] weist den folgenden Frequenzgang auf (fs = 8 kHz): Nehmen Sie für das Folgende an, dass das Eingangssignal x[n] und das Ausgangssignal y[n] im Q0.15-Format dargestellt werden. a) Bestimmen Sie die Zeitverzögerung dieses FIR-Filters für Eingangsfrequenzen f < fs/2. b) Bestimmen Sie die l∞-Norm und interpretieren Sie den gefundenen Wert. c) Kann die FIR-Summe bzw. der Ausgang überlaufen bzw. grösser als 1 werden? Wenn ja, geben Sie ein „kritisches“ Eingangssignal x[n] an? d) Wie müssten Sie den Eingang bzw. die b-Koeffizienten skalieren, damit der Ausgang in keinem Fall überläuft? Wie stark verschlechtert sich dann das SNR? e) Bestimmen Sie die l2-Norm und zeigen Sie, dass l2 ≤ l∞ ≤ l1 gilt. ZHAW, DSV1, FS2010, Rumc, 3 Aufgabe 4: Skalierung IIR-Biquad-Filter. a) Entwerfen Sie mit Matlab ein elliptisches IIR-TP-Filter 2. Ordnung, das die folgende Spezifikation erfüllt: - Durchlassbereich: Eckfrequenz fDB = 100 Hz, Amax = 0.1 dB - Sperrbereich: Amin = 25 dB - Abtastfrequenz: fs = 8000 Hz Wo liegt die Eckfrequenz fSB des Sperrbereichs? Wie steil ist das Filter ungefähr in dB pro Oktave und Ordnung? b) Das Filter soll in der Direktstruktur 2 realisiert werden. Geben Sie die Differenzengleichungen zur Berechnung von w[n] und y[n] an. x[n] w[n] gin=1 -a1 z-1 -a2 bo gout=1 y[n] b1 b2 w[n-2] c) Eingang x[n] und Ausgang y[n] liegen im Q0.15-Wertebereich. Skalieren Sie das IIR-Filter bzw. die betreffenden Differenzengleichungen so, dass - alle a-Filterkoeffizienten so genau wie möglich im Q0.15-Format dargestellt werden, - alle b-Filterkoeffizienten so genau wie möglich im Q0.15-Format dargestellt werden - und die Summator-Ausgänge w[n] und y[n] zumindest für sinusförmige Eingangssignale x[n] nicht überlaufen. Sie können die 3 Skalierungsschritte auch im Blockdiagramm oben einzeichnen. Eine UTF eines Systems S ändert sich übrigens nicht, wenn alle einlaufenden Pfade in ein Teilsystem T mit 1/g und alle aus dem Teilsystem T auslaufenden Pfade mit g skaliert werden. Wählen Sie nach der Skalierung die Ein- und die Ausgangsverstärkung gin und gout so, dass Sie nur mit Schiebeoperationen implementiert werden können. Geben Sie die skalierten Differenzengleichungen zur Berechnung von w[n] und y[n] in Matlab-Notation an. d) Filtern Sie mit dem skalierten IIR-Filter einen 75 Hz und einen 458 Hz Ton und vergewissern Sie sich, dass es keine Überläufe gibt und dass die Amplitude bei der Filterung des 458 Hz Tons um den Faktor 10 abnimmt. Sie können die Matlab-Vorlage dsv1ueb104.m verwenden. ZHAW, DSV1, FS2010, Rumc, 4 Musterlösung Aufgabe 1 a) prewarping bzw. Vorverzerrung ergibt: fanalog_DB = 1156.3 Hz b) ersetzen von s = bzw. wDB = 2·fs·tan(π·fdigital_DB/fs) = 7265.4 2 z −1 ⋅ gibt: H ( z ) = Ts z + 1 1 z −1 1+ c ⋅ z +1 wobei c = 2fs/wDB = 1.3764 => H ( z ) = 1 + z −1 z +1 z +1 = = z + 1 + c ⋅ ( z − 1) (1 + c) ⋅ z + (1 − c) (1 + c) + (1 − c) ⋅ z −1 => H ( z ) = 1 ⋅ 1+ c 1 + z −1 1 − c −1 ⋅z 1+ 1+ c c) b = [1 1] / (1+c) = [0.4208 0.4208] und a = [1 (1-c)/(1+c)] = [1 -0.1584] Betragsspektrum IH(f)I des resultierenden Digitalfilters: Die 3 dB Eckfrequenz liegt exakt bei fdigital = 1000 Hz. Das Butterworth-Filter weist einen monoton fallenden Amplitudengang auf. d) Die bilineare Transformation bildet die Nullstelle bei s = ∞ auf z = -1 und den Pol bei s = - wDB auf z = -(1-c)/(1+c) = 0.1584 ab. Die bilineare Transformation bildet die linke Halbebene der s-Ebene einmal ins Innere des Einheitskreises der z-Ebene ab. Jedes Butterworth-TP-Filter weist nur Nullstellen bei z = -1 auf (keine Rippel im Sperrbereich). ZHAW, DSV1, FS2010, Rumc, 5 Aufgabe 2 a) Elliptisches TP-Filter mit Ordnung N=3 b = [0.03816301301598 0.04586583864283 0.04586583864283 0.03816301301598] a = [1.00000000000000 -1.90361085926265 1.56176730013500 -0.49009873755473] b) Butterworth TP-Filter mit Ordnung N=6 b = [0.00173758552778 0.01042551316669 0.02606378291673 0.03475171055564 0.02606378291673 0.01042551316669 0.00173758552778] a = [1.00000000000000 -2.65904646691458 3.44650711546946 -2.56339653248472 1.13889925502283 -0.28194993197852 0.03019203466357] ZHAW, DSV1, FS2010, Rumc, 6 c) Chebyscheff TP-Filter, Typ II, mit Ordnung N=4 b = [0.04581460157325 0.07545934376770 0.10240910939902 0.07545934376770 0.04581460157325] a = [1.00000000000000 -1.52326248034477 1.25373904896926 -0.46024027012053 0.07472070157696] Hinweis: Alle entworfenen Filter sollten mit Vorteil als Biquad-Kaskade realisiert werden. Dazu müssen die Filterkoeffizienten noch mit der Funktion tf2sos umgerechnet werden. Matlab-Code: Clear; format long % Parameter % =========================================================== fs=8000; % Abtastfrequenz fDB=1000; % Eckfrequenz Durchlassbereich fSB=2000; % Eckfrequenz Sperrbereich Rp=1.2; % maximale Dämpfung im Durchlassbereich Rs=40; % minimale Dämpfung im Sperrbereich % Filterentwurf % ============================================================ % [N,w]=ellipord(fDB/(fs/2),fSB/(fs/2),Rp,Rs); % [b,a]=ellip(N,Rp,Rs,w); % [N,w]=buttord(fDB/(fs/2),fSB/(fs/2),Rp,Rs); % [b,a]=butter(N,w); [N,w]=cheb2ord(fDB/(fs/2),fSB/(fs/2),Rp,Rs); [b,a]=cheby2(N,Rs,fSB/(fs/2)); % % N b a Ausgabe ============================================================ % schreibt die Filterordnung auf den Bildschirm % schreibt die Filterkoeffizienten auf den Bildschirm % schreibt die Koeffizienten auf den Bildschirm ZHAW, DSV1, FS2010, Rumc, 7 % Amplitudengang % ============================================================ [H,w]=freqz(b,a); plot((w/pi)*(fs/2),20*log10(abs(H)),'LineWidth',2.0); grid; xlabel('Frequenz [Hz]'); ylabel('Amplitudengang [dB]'); axis([0 4000 -80 3]); print -dpng tmp % generiert das png-File tmp.png des Plots % das ins Word-Dokument importiert werden kann Aufgabe 3 a) Das FIR-Filter hat Ordnung N=9 und ist linearphasig => Zeitverzögerung τ = 4.5·Ts = 0.5625 ms für alle Frequenzen f < fs/2. Man kann die Zeitverzögerung der Frequenzkomponente f0 auch wie folgt bestimmen: Δ0 = − ϕ (f0 ) = (405/360)·2π / (2π·2000) = 0.5625 ms unabhängig von f0. 2π ⋅ f0 b) Die l∞-Norm = max IH(f)I = 1. Der Ausgang kann für sinusförmige Eingangssignale nicht überlaufen. Es ist aber immer noch möglich, dass Zwischensummen überlaufen, wenn der Akkumulator keine Guard-Bits aufweist. c) Der Ausgang kann für nicht-sinusförmige Eingangssignale wie z.B. x[n] = { … -1 -1 1-ε 1-ε -1 -1 … } , ε <<1, überlaufen! Dann erscheint nämlich die Summe der Beträge der (grössten) b-Koeffizienten am Ausgang und die ist hier > 1. d) Der Eingang bzw. die b-Koeffizienten müssten durch die l1-Norm dividiert werden, wobei die l1-Norm = sum(abs(b)) = 1.4142 = √2. Das SNR verschlechtert sich dann um 20·log10(√2) = 3 dB. e) L2-Norm = 0.5653 < l∞-Norm = 1 < l1-Norm = √2. Aufgabe 4 a) Matlab-Code: [b,a]=ellip(2,0.1,25,fDB/(fs/2)) figure(1) freqz(b,a,4096,fs); Filterkoeffizienten: b = [ 0.055976261401186 -0.093358806169603 0.055976261401186 ] a = [ 1.000000000000000 -1.816100033932020 0.834909055656060 ] Eckfrequenz des Sperrbereichs: fSB = 536.1 Hz Filtersteilheit ≈ 6 dB pro Oktave und Ordnung b) w[n] = gin·x[n] - a1·w[n-1] - a2·w[n-2] y[n] = gout · ( b0·w[n] + b1·w[n-1] + b2·w[n-2] ) ZHAW, DSV1, FS2010, Rumc, 8 c) Schritt 1 (siehe auch Grafik unten): Die a-Filterkoeffizienten liegen teilweise ausserhalb des Q0.15-Zahlenformats. Deshalb skalieren wir die w-Differenzengleichung mit 2, d.h. w[n] = 2·( gin·x[n]/2 - a1/2·w[n-1] - a2/2·w[n-2] ) x[n] w[n] gin=1 1/gs bs /2 2 -a1 /2 z-1 -a2/2 Schritt 1 bo /bs gout=1 gs y[n] b1 /bs b2 /bs w[n-2] Schritt 2 Schritt 3 Schritt 2 (siehe auch Grafik oben): Die b-Filterkoeffizienten liegen zwar im Q0.15-Wertebereich, sie sind aber so klein, dass sie bei der Q0.15-Quantisierung zu ungenau dargestellt werden (Verschiebung der Nullstellen!). Deshalb skalieren wir die b-Koeffizienten mit 1/bs, wobei bs = abs(min(b)) bzw. bs = 0.093358806169603, und kompensieren die Verstärkung 1/bs am Eingang mit bs. Schritt 3 (siehe auch Grafik oben): Der Ausgang y[n] überläuft für stationäre Signale nicht, siehe Filterspezifikation. Das Zwischenresultat w[n] überläuft hingegen schon. Wir skalieren den Eingang deshalb mit 1/gs und kompensieren am Ausgang entsprechend mit gs. Der Faktor gs = bs·max (IW(f)/X(f)I) = bs·max (1/IA(f)I) = 0.093358806169603 · 54.389431813254888 = 5.077732422328502. Wenn statt gin = bs / (2gs) = 0.009192962370277 der (nächst) kleinere Wert gin = 1/128 gewählt wird (leichte SNR-Verschlechterung), dann kann die Eingangsskalierung mit einer Schiebe-Operation realisiert werden. Wenn statt gout = gs = 5.0777 der (nächst) kleinere Wert gout = 4 gewählt wird (leichte SNR-Verschlechterung), dann kann auch die Ausgangsskalierung mit einer SchiebeOperation realisiert werden. Die resultierenden Differenzengleichungen in Matlab-Notation lauten: w(n)=2*(gin*x(n)-ascal(2)*w(n-1)-ascal(3)*w(n-2)); ys(n)=gout*(bscal(1)*w(n)+bscal(2)*w(n-1)+bscal(3)*w(n-2)); wobei gin=1/128, ascal(2)= -29755/32768, ascal(3)= 13679/32768, gout=4, bscal(1)= 19647/32768 = bscal(3), bscal(2)= -32768/32768 ZHAW, DSV1, FS2010, Rumc, 9 d) Simulationsresultate: Bei der Filterung des 458 Hz Tons resultiert eine 10 mal kleinere Amplitude. % ============================================ % Biquad Skalierung % ============================================ clear; close all; % Parameter % ============================================ fs=8000; Ns=800; f0=75; fDB=100; % IIR-Filter % ============================================ [b,a]=ellip(2,0.1,25,fDB/(fs/2)) figure(1) freqz(b,a,4096,fs); % Input % ============================================ x=cos(2*pi*f0*[0:Ns-1]/fs); xs=round((2^15-1)*x)/2^15; % Q0.15 Format % Filterung mit skaliertem IIR-Filter % ============================================ bs=abs(min(b)); gs=bs*max(abs(freqz(1,a))); gin=bs/(2*gs); gin=1/128; gout=gs; gout=4; bscal=b/bs; ascal=a/2; bscal=round(2^15*bscal)/2^15; ascal=round(2^15*ascal)/2^15; ZHAW, DSV1, FS2010, Rumc, 10 ys=zeros(1,Ns); w=zeros(1,Ns); for n=3:Ns, w(n)=2*(gin*x(n)-ascal(2)*w(n-1)-ascal(3)*w(n-2)); ys(n)=gout*(bscal(1)*w(n)+bscal(2)*w(n-1)+bscal(3)*w(n-2)); end % Plot figure(2) plot(1000*[0:Ns-1]/fs,ys,1000*[0:Ns-1]/fs,w,'--','LineWidth',2.0); grid; xlabel('Zeit [ms]'); ylabel('ys[n] und w[n] gestr.'); title('Filterung 75 Hz Ton mit skaliertem IIR-Filter'); Bemerkung: In Matlab gibt es auch eine Fixed-Point-Toolbox! c-Code mit TMS320C55x-Compiler-Intrinsics (nicht gefragt): Int16 Int16 Int16 Int32 Int32 w[3]={0, 0, 0}; a[3]={0, 29755, -13679}; // a[0] not used b[3]={19647, -32768, 19647}; y=0; temp=0; ... while (1) { while (!DSK5510_AIC23_read16(hCodec, &sample_in_l)); // links in while (!DSK5510_AIC23_read16(hCodec, &sample_in_r)); // rechts in w[2] = w[1]; w[1] = w[0]; temp temp temp temp w[0] y y y y = = = = = = = = = // ohne Ring-Buffer ((Int32) sample_in_l)<<(16-7); _smac(temp,a[1],w[1]); _smac(temp,a[2],w[2]); temp<<1; (int) (temp>>16); _smac(0,b[0],w[0]); _smac(y,b[1],w[1]); _smac(y,b[2],w[2]); y<<2; sample_out_l = (int) (y>>16); sample_out_r = sample_out_l; while (!DSK5510_AIC23_write16(hCodec, sample_out_l)); // links out while (!DSK5510_AIC23_write16(hCodec, sample_out_r)); // rechts } Bemerkung: fs=8000 Hz, DSP-Codec unterdrückt DC.