Báo cáo TN Xử lý số tín hiệu online - đại học Bách Khoa Thành phố Hồ Chí Minh (HCMUT) Bài 3: IIR -Hiểu rõ các bước từ thiết kế đến hiện thực bộ lọc FIR/IIR lên trên một kit DSP. -Quan sát đáp ứng xung và đáp ứng tần số của bộ lọc. -Kiểm tra đặc tính (thông thấp, thông cao, thông dải, chắn dải) của bộ lọc. -Khảo sát ngõ ra của bộ lọc khi ngõ vào là tín hiệu xung vuông. -Hệ thống lại các lý thuyết đã học.
1 ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA ĐIỆN - ĐIỆN TỬ BÁO CÁO THÍ NGHIỆM BỘ MÔN: XỬ LÝ SỐ TÍN HIỆU Nhóm: L10 GIẢNG VIÊN HƯỚNG DẪN: HUỲNH VĂN PHẬN Năm học: 2020 – 2021 2.2 Các lọc IIR 2.2.1 Bộ lọc IIR chắn dải Thiết kế, thực kiểm tra lọc IIR chắn dải bậc 10, tần số trung tâm 1750Hz, sử dụng phương pháp Elliptic với thơng số sau: • Tần số cắt: 1700 Hz 1800 Hz • Độ gợn dải thông dải chắn tương ứng dB 60 dB • Tần số lấy mẫu: 8000 Hz Thiết kế lọc dùng SPTool MATLAB: Khởi động SPTool Dưới cột Filters, nhấn nút New để mở cửa sổ Filter Designer Trong giao diện Filter Designer: a Trong text box Filter: Tên lọc tự đặt (ở filt2) Tên thay đổi sau b Nhập thông số thiết kế vào: • Response Type = Bandstop • Design Method = IIR Elliptic • Specify Order: 10 • Frequency Specifications: Fs = 8000, Fc1 = 1700, Fc2 = 1800 • Apass = 1, Astop = 60 c Nhấn Design Filter Khi đáp ứng tần số lọc thiết kế hiển thị Lưu lại kết kiểm tra xem có phải lọc chắn dải mong muốn không? Bộ lọc chắn dải mong muốn Trở cửa sổ SPTool, cột Filters xuất thêm dòng filt2 [design] Đây lọc vừa thiết kế Thay đổi tên lọc thành bs1750 cách chọn Edit Name…filt2 [design] Trong cửa sổ xuất hiện, nhập tên Từ cửa sổ SPTool, chọn File Export… Trong Export list xuất hiện, chọn Filter: bs1750 [design] nhấn nút Export to workspace Đóng cửa sổ SPTool lại Một thơng báo xuất hỏi có muốn lưu lại phiên làm việc hay không Nếu muốn lưu lại, chọn Save Mở cửa sổ Workspace MATLAB, ta thấy workspace xuất biến bs1750 Đây lọc mà ta thiết kế SPTool xuất workspace MATLAB Biến lưu dạng cấu trúc mô tả lọc thiết kế Nhấn đúp chuột vào tên biến bs1750 workspace, ta thấy field cấu trúc Trong field này, field tf thể hàm truyền lọc Field cấu trúc gồm field: tf.num tf.den thể tương ứng hệ số đa thức tử số đa thức mẫu số Để chuyển hệ số sang dạng tầng bậc hai (second-order section), MATLAB dùng lệnh sau: >> [z,p,k] = tf2zp(bs1750.tf.num, bs1750.tf.den) ; >> sos = zp2sos(z,p,k); Ma trận sos MATLAB sau: b00 b01 b b11 sos = 10 M M b L b L1 b02 b12 1 a 01 a11 M M M a L1 bL2 a 02 a12 M aL2 b0i, b1i, b2i hệ số tử số hàm truyền phần bậc thứ i 1, a1i, a2i hệ số mẫu số hàm truyền phần bậc thứ i Các phần tử ma trận sos sử dụng để thực lọc IIR Ghi nhận giá trị b a vào bảng sau 0.852664231745 610 0.332949775032 229 0.852664232172 453 0.348426502847 038 0.784598410841 208 0.361361777931 278 0.999999999505 846 0.280872670866 996 0.963772074731 663 0.419430489052 090 0.999999999616 848 0.483998057131 818 0.964510697225 853 0.346015671203 774 1.000000000224 74 0.311928932295 225 0.994307551293 976 0.434549970594 600 1.000000000151 96 0.465630397820 057 0.994395645612 719 Thực lọc IIR Matlab Chương trình Matlab thực lọc sau: clc; close all; Fs=8000; h1 = bs1750.tf.num; h2 = bs1750.tf.den; w=0:pi/20:pi; [H_matlab, w] = freqz(h1,h2); H_matlab_manitude = abs(H_matlab); figure(1) semilogy(w/2/pi*Fs,H_matlab_manitude); ylabel ('Magnitude(dB)'); xlabel ('w'); title('Dap ung tan so bo loc (semilogy)'); Ts = 1/Fs; % Sampling period T_sim = 0.05; % Signal duration in seconds 50 ms t = : Ts : T_sim-Ts ; xn1 = sin(2000*pi*t); xn2 = sin(3500*pi*t); xn = xn1 + xn2; Lx=length(xn); Xk=fft(xn,Lx); Xk_mag=abs(Xk); Ma = length(h2); Mb = length(h1); M = max(Ma,Mb); Ly = Lx+M; yn = zeros(1,Ly); v = zeros(1,Mb); w = zeros(1,Ma); XN = [xn, zeros(1,M)]; for n=0 : Ly-1 i = n+1; v(1) = XN(i); w(1) = -h2(2:Ma) * w(2:Ma).' + h1*v.'; yn(i) = w(1); for j1 = Ma:-1:2 w(j1) = w(j1 -1); end for j2 = Mb:-1:2 v(j2) = v(j2 -1); end end Yk=fft(yn,Ly); Yk_mag=abs(Yk); figure(2) subplot(1,2,1); stem(t,xn,'b-'); hold on; ylabel ('Amplitude'); xlabel ('x(n)'); subplot(1,2,2); stem(0:Ts:(Ly-1)/Fs,yn,'r-'); hold on; ylabel ('Amplitude'); xlabel ('y(n)'); figure(3) subplot(2,1,1); stem((0:Lx/2-1)*Fs/Lx,Xk_mag(1:Lx/2)/Lx); xlabel('Hz'); ylabel('Amp'); title('X(k)'); subplot(2,1,2); stem((0:Ly/2-1)*Fs/Ly,Yk_mag(1:Ly/2)/Ly); xlabel('Hz'); ylabel('Amp'); title('Y(k)'); Kiểm tra lọc Kiểm tra lọc với tín hiệu sine đa tần có thành phần tần số 1000 Hz 1750 Hz: - Đáp ứng tần số lọc: - x(n), y(n): X(k), Y(k): Kiểm tra lọc với ngõ vào tín hiệu tổng tín hiệu sin tần số 100 – 3900 Hz: Chương trình Matlab thực yêu cầu: % Matlab code clc; close all; Fs=8000; h1 = bs1750.tf.num; h2 = bs1750.tf.den; Ts = 1/Fs; % Sampling period T_sim = 0.05; % Signal duration in seconds 50 ms t = : Ts : T_sim-Ts ; xn=0; for fo=100:100:3900 xn=xn+sin(2*pi*fo*t); end Lx=length(xn); Xk=fft(xn,Lx); Xk_mag=abs(Xk); Ma = length(h2); Mb = length(h1); M = max(Ma,Mb); Ly = Lx+M; yn = zeros(1,Ly); v = zeros(1,Mb); w = zeros(1,Ma); XN = [xn, zeros(1,M)]; for n=0 : Ly-1 i = n+1; v(1) = XN(i); w(1) = -h2(2:Ma) * w(2:Ma).' + h1*v.'; yn(i) = w(1); for j1 = Ma:-1:2 w(j1) = w(j1 -1); end for j2 = Mb:-1:2 v(j2) = v(j2 -1); end end Yk=fft(yn,Ly); Yk_mag=abs(Yk); figure(3) subplot(2,1,1); stem((0:Lx/2-1)*Fs/Lx,Xk_mag(1:Lx/2)/Lx); xlabel('Hz'); ylabel('Amp'); title('X(k)'); subplot(2,1,2); stem((0:Ly/2-1)*Fs/Ly,Yk_mag(1:Ly/2)/Ly); xlabel('Hz'); ylabel('Amp'); title('Y(k)'); Phổ tín hiệu ngõ vào ngõ ra: Nhận xét/Giải thích: Ngõ bị chắn tần số 1700Hz-1800Hz qua lọc chắn dải Bộ lọc không lý tưởng Lưu chương trình Matlab mục với tên Bai_3_IIR_bs_1700_1800_NHOMx.m 2.2.2 Bộ lọc IIR thông thấp Tương tự phần II.2.1, thiết kế, thực kiểm tra lọc IIR thông thấp thuộc loại Chebyshev với thơng số sau: 10 • • • • Bậc lọc: 10 Cạnh dải dải chắn: 1.6 KHz Độ gợn dải chắn: 60 dB Tần số lấy mẫu: kHz Đáp ứng tần số lọc thiết kế dùng MATLAB: Giá trị hệ số đáp ứng xung tầng bậc lọc thực kit DSP: 0.0084666270516 1881 0.015432767504 3263 0.0084666270516 1877 0.15885477033 7671 0.020933743022 1357 0.876755314665 951 1.0000000000000 0.29931923606 4403 0.139355279814 572 0.054217374634 1.0000000000000 - 0.335661466991 17 83 17 00 986 0.985779522240 508 0.999999999995 641 0.4366927114868 53 0.653416752617 471 0.985779522240 480 0.999999999990 904 0.4366927188910 05 0.653416758317 106 0.835069940499 630 1.000000000038 81 0.4663003924163 95 0.738100602568 877 0.835069940555 032 1.000000000051 32 0.4663003607687 41 0.738100617309 498 0.737415272187 916 0.999999999877 311 0.4800438083558 18 0.809829496847 943 0.737415272733 955 0.999999999790 688 0.4800438100258 77 0.809829585761 049 0.674953706913 301 1.000000000660 69 0.4871552166084 71 0.870865516194 636 0.674953708941 863 1.000000000107 18 0.4871552930970 57 0.870865630182 046 0.637653729637 750 1.000000000029 95 0.4932138817411 08 0.924655231934 189 0.637653733010 591 0.999999998937 644 0.4932139515999 93 0.924655285911 270 0.620168171961 213 1.000000000576 45 0.5016066985113 82 0.974946738023 043 0.620168173796 292 0.999999999942 691 0.5016067166049 65 0.974946746166 433 Kiểm tra lọc với ngõ vào tín hiệu sin đa tần có thành phần tần số 1000 Hz 2000 Hz: 18 - Đáp ứng tần số lọc - x(n), y(n) - X(k), Y(k) 19 Kiểm tra lọc với ngõ vào tín hiệu tổng tín hiệu sin tần số 100 – 3900 Hz: Chương trình Matlab thực yêu cầu: % Matlab code clc; close all; Fs=8000; h1 = bp2000.tf.num; h2 = bp2000.tf.den; w=0:pi/20:pi; [H_matlab, w] = freqz(h1,h2); H_matlab_manitude = abs(H_matlab); figure(1) semilogy(w/2/pi*Fs,H_matlab_manitude); ylabel ('Magnitude(dB)'); xlabel ('w'); title('Dap ung tan so bo loc (semilogy)'); Ts = 1/Fs; % Sampling period T_sim = 0.05; % Signal duration in seconds 50 ms t = : Ts : T_sim-Ts ; xn=0; 20 for fo=100:100:3900 xn=xn+sin(2*pi*fo*t); end Lx=length(xn); Xk=fft(xn,Lx); Xk_mag=abs(Xk); Ma = length(h2); Mb = length(h1); M = max(Ma,Mb); Ly = Lx+M; yn = zeros(1,Ly); v = zeros(1,Mb); w = zeros(1,Ma); XN = [xn, zeros(1,M)]; for n=0 : Ly-1 i = n+1; v(1) = XN(i); w(1) = -h2(2:Ma) * w(2:Ma).' + h1*v.'; yn(i) = w(1); for j1 = Ma:-1:2 w(j1) = w(j1 -1); end for j2 = Mb:-1:2 v(j2) = v(j2 -1); end end Yk=fft(yn,Ly); Yk_mag=abs(Yk); figure(2) subplot(1,2,1); stem(t,xn,'b-'); hold on; ylabel ('Amplitude'); xlabel ('x(n)'); subplot(1,2,2); stem(0:Ts:(Ly-1)/Fs,yn,'r-'); hold on; ylabel ('Amplitude'); xlabel ('y(n)'); figure(3) subplot(2,1,1); 21 stem((0:Lx/2-1)*Fs/Lx,Xk_mag(1:Lx/2)/Lx); xlabel('Hz'); ylabel('Amp'); title('X(k)'); subplot(2,1,2); stem((0:Ly/2-1)*Fs/Ly,Yk_mag(1:Ly/2)/Ly); xlabel('Hz'); ylabel('Amp'); title('Y(k)'); Phổ tín hiệu ngõ vào ngõ ra: Nhận xét/Giải thích: Ngõ có xung từ tần số 1600Hz-2400Hz qua lọc thông dải Lưu chương trình Matlab mục với tên Bai_3_IIR_bp_1600_2400_NHOMx.m 2.2.4 Thiết kế lọc IIR multiband Trong thí nghiệm này, thiết kế, thực kiểm tra lọc IIR multiband có đáp ứng mong muốn lọc phần II.1.4 Các bước thiết kế giống phần II.1.4 với nội dung file multibandiir63.m dùng để thiết kế sau: %multibandiir63.m: Multiband IIR filter with 63 coefficients 22 f = [0 0.1 0.12 0.18 0.2 0.3 0.32 0.38 0.4 1]; m = [0 1 0 1 0]; n = 63; [num, den] = yulewalk(n-1,f,m); % frequency response with 256 points [h w] = freqz(num,den,256); % plot magnitude of the filter plot(5000*f,m); figure; plot(w/pi,abs(h)); Trong đoạn chương trình trên, lưu ý: - Lệnh remez thay lệnh yulewalk dùng để thiết kế lọc IIR Lệnh trả hệ số tử số mẫu số hàm truyền lọc, chứa tương ứng biến num den - Lệnh freqz sửa đổi để vẽ đáp ứng tần số lọc IIR thiết kế Các giá trị num den sử dụng cần thực lọc Đáp ứng tần số lọc thiết kế dùng MATLAB: 23 Gía trị hệ số đáp ứng xung tầng bậc lọc thực kit DSP: 0.0039259971310 4432 0.00056922597090 0901 0.0033450638697 9231 0.28566956324 9288 0.68009819355 6299 0.09878864675809 51 1.0007332311818 1.27235867924 311 0.74427325760 7858 1.45257814699475 0.9958551303689 96 1.32532193955 738 0.83592041703 6316 1.98111654298302 0.9980136395642 17 1.79079369582 597 0.83593089720 8638 0.73030027924688 0.3059929535247 52 1.65671361659 985 0.83735700975 6308 1.97439225764657 1.0037788263620 1.58509269043 202 0.83819898627 0824 1.48456035882524 1.0073019415628 0.83435447182 9124 0.85449642011 6735 0.92152481475033 0.5575368157995 53 0.95665532771 9333 0.86944735920 9166 1.23694038330187 0.9961091788959 20 1.17372491377 654 0.87210450200 3550 1.63572158888678 0.9968343179718 83 1.51935787898 635 0.88650880562 8092 1.88493073474561 0.9954468405317 45 1.78984788841 972 0.88723440583 0938 0.67398355489183 0.7094297104485 82 0.75525140977 4527 0.89024692801 6489 0.96065094200282 0.9981382969796 0.91415375789 0.90082831353 24 02 5803 8475 1.78304606915569 0.9981406768722 52 1.69980193328 344 0.91119464446 3468 1.52164696993942 0.6428756733341 84 1.76775685129 704 0.91235210782 4736 0.60885336644980 0.9977867169049 28 0.56757585136 2290 0.91370553587 1920 1.47052719536260 0.9566282912670 99 1.61696890706 264 0.92891974430 3023 1.29311530892520 0.9960921635031 44 1.07971213031 995 0.92939197595 5501 1.95007073302276 0.9990573463636 97 1.89687226121 709 0.93204880802 2672 1.92534033028584 1.0028009237147 1.83279276319 238 0.93928592953 8752 1.78530300981232 0.9237416160229 98 1.81356453492 186 0.94330494211 3962 0.56726298060171 1.0018615169687 0.71412094010 8058 0.94700607745 8800 1.05768816188096 0.9416513714784 15 1.05840786083 411 0.95112974309 4874 1.58838202792499 0.9973141627844 81 1.59399099373 305 0.95257596822 2986 1.22969677115892 0.9974716926591 36 1.14670521890 141 0.95363260109 4818 25 0.61242716703192 0.8571161798557 72 0.67677306667 8776 0.95698042671 9982 0.84442474164252 0.9588536482845 58 0.84441285009 0775 0.95886635401 7009 1.65810767441368 0.9575775841174 34 1.65935032053 506 0.95979442952 3424 1.86481942796085 0.9388405882195 53 1.86915249123 997 0.96303920905 9850 0.67110284579317 0.9426837369814 36 0.64064409023 5217 0.96495647263 1048 0.58981806157359 0.9688230874254 63 0.60934800347 4224 0.98164247930 6726 Kiểm tra lọc với ngõ vào tín hiệu sin đa tần có thành phần tần số 500 Hz, 750 Hz 1750 Hz: - Đáp ứng tần số lọc 26 - x(n), y(n) - X(k), Y(k) 27 Kiểm tra lọc với ngõ vào tín hiệu tổng tín hiệu sin tần số 100 – 3900 Hz: Chương trình Matlab thực yêu cầu: % Matlab code clc; Fs = 10000; % Sampling frequency 10 kHz %multibandfir63.m: Multiband FIR filter with 63 coefficients f = [0 0.1 0.12 0.18 0.2 0.3 0.32 0.38 0.4 1]; m = [0 1 0 1 0]; n = 63; [num, den] = yulewalk(n-1,f,m); w=0:pi/20:pi; [H_matlab, w] = freqz(num,den); H_matlab_manitude = abs(H_matlab); figure(1) semilogy(w/2/pi*Fs,H_matlab_manitude); ylabel ('Magnitude(dB)'); xlabel ('w'); title('Dap ung tan so bo loc (semilogy)'); Ts = 1/Fs; % Sampling period T_sim = 0.05; % Signal duration in seconds 50 ms t = : Ts : T_sim-Ts; xn=0; for fo=100:100:3900 28 xn=xn+sin(2*pi*fo*t); end Lx=length(xn); Xk=fft(xn,Lx); Xk_mag=abs(Xk); Ma = length(den); Mb = length(num); M = max(Ma,Mb); Ly = Lx+M; yn = zeros(1,Ly); v = zeros(1,Mb); w = zeros(1,Ma); XN = [xn, zeros(1,M)]; for n=0 : Ly-1 i = n+1; v(1) = XN(i); w(1) = -den(2:Ma) * w(2:Ma).' + num*v.'; yn(i) = w(1); for j1 = Ma:-1:2 w(j1) = w(j1 -1); end for j2 = Mb:-1:2 v(j2) = v(j2 -1); end end Yk=fft(yn,Ly); Yk_mag=abs(Yk); % plot the magnitude response figure(2) subplot(1,2,1); stem(t,xn,'b-'); hold on; ylabel ('Amplitude'); xlabel ('x(n)'); subplot(1,2,2); stem(0:Ts:(Ly-1)/Fs,yn,'r-'); hold on; ylabel ('Amplitude'); xlabel ('y(n)'); figure(3) subplot(2,1,1); stem((0:Lx/2-1)*Fs/Lx,Xk_mag(1:Lx/2)/Lx); xlabel('Hz'); ylabel('Amp'); 29 title('X(k)'); subplot(2,1,2); stem((0:Ly/2-1)*Fs/Ly,Yk_mag(1:Ly/2)/Ly); xlabel('Hz'); ylabel('Amp'); title('Y(k)'); Phổ tín hiệu ngõ vào ngõ ra: Nhận xét/Giải thích: Ngõ có xung tần số 500Hz-1000Hz 1500Hz-2000Hz qua lọc thông dải tần số cịn lại chắn dải Lưu chương trình Matlab mục với tên Bai_3_IIR_mb_NHOMx.m So sánh kết với phần trước: - FIR 30 - IIR DO FIR LÀ BỘ LỌC CÓ GIÁ TRỊ HỮU HẠN NÊN NGÕ RA PHỔ BIÊN ĐỘ TRONG DẢI CHẮN SẼ KHƠNG BỊ LỌC BỎ HOÀN TOÀN CỊN IIR LÀ BỘ LỌC VÔ HẠN NÊN NGÕ RA PHỔ BIÊN ĐỘ NẰM TRONG DẢI CHẮN SẼ CÓ GIÁ TRỊ GẦN NHƯ BẰNG THÔNG DẢI CỦA IIR LỌC TỐT HƠN FIR 31 ... 1.27 235 867924 31 1 0.7442 732 5760 7858 1.45257814699475 0.995855 130 3689 96 1 .32 532 1 939 55 738 0. 835 920417 03 631 6 1.9811165429 830 2 0.9980 136 395642 17 1.7907 936 9582 597 0. 835 930 89720 8 638 0. 730 30027924688... 0.85449642011 6 735 0.92152481475 033 0.557 536 8157995 53 0.95665 532 771 933 3 0.86944 735 920 9166 1. 236 94 038 330 187 0.9961091788959 20 1.1 737 249 137 7 654 0.87210450200 35 50 1. 635 72158888678 0.996 834 3179718 83 1.51 935 787898... 1.079712 130 31 995 0.92 939 197595 5501 1.950070 733 02276 0.99905 734 636 36 97 1.89687226121 709 0. 932 04880802 2672 1.92 534 033 028584 1.0028009 237 147 1. 832 7927 631 9 238 0. 939 285929 53 8752 1.78 530 300981 232