Download as pdf or txt
Download as pdf or txt
You are on page 1of 28

ĐẠ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Ử
NĂM HỌC 2021 – 2022
-------*-------

BÁO CÁO THÍ NGHIỆM XỬ LÝ SỐ TÍN HIỆU

BÀI 3: THIẾT KẾ VÀ THỰC HIỆN CÁC BỘ LỌC FIR TRÊN


MATLAB
GVHD: Huỳnh Văn Phận
Lớp L01
SV thực hiện:
Nguyễn Ngọc Độ MSSV: 1913131

Ngày hoàn thành: 22/01/2022.


CÁC THÍ NGHIỆM ĐÃ THỰC HIỆN:
Thí nghiệm 1: Thiết kế, thực hiện và khảo sát bộ lọc FIR chắn dải bằng phương
pháp cửa sổ Kaiser với các thông số sau:
• Chiều dài của đáp ứng xung: N = 63 (MATLAB hiển thị bậc bộ lọc bằng
62)
• Tần số trung tâm: 2700 Hz
• Tần số cắt: 2500 Hz và 2900 Hz
• Giá trị của  = 4
• Tần số lấy mẫu 8000 Hz
Bài làm:
Thực hiện trên Sptool:

Kết quả:
Đơn vị 10 −6

-1747 1688 701 -3432 3149 710 -4377

3766 330 -2976 1668 -1 2202 -5194

765 11622 -18129 3986 24227 -36772 10684

37503 -58645 20836 48200 -79522 32969 53484

-94607 44386 52001 901035 52001 44386 -94607

53484 32969 -79522 48200 20836 -58645 37503

10684 -36772 24227 3986 -18129 11622 765

-5194 2202 -1 1668 -2976 330 3766

-4377 710 3149 -3432 701 1688 -1747

Lưu ý: Theo yêu cầu trong file hướng dẫn tất cả code bên dưới được viết trong
cùng 1 chương trình Matlap chỉ được tách ra để làm báo cáo:
Thực hiện bộ lọc trên Matlab
Để thực hiện việc tính toán ngõ ra của bộ lọc, ta có thể sử dụng định nghĩa
với là đáp ứng xung vừa tìm được sử dụng công cụ
sptool ở trên và là mẫu tín hiệu ngõ vào. Do đó có thể sử dụng giải thuật
xử lý mẫu để thực hiện bộ lọc.
Chương trình Matlab thực hiện giải thuật xử lý mẫu cho bộ lọc này như sau:
% Matlab code

% Giai thuat xu li mau


Lx = length(x)
M = length(h) -1
Ly = Lx + M
y = zeros(1,Ly);
w = zeros(1,N)
t1 = Lx+1:1:Ly
xk = [x zeros(size(t1))]; %he thong co nho
u = 0;
for i=1:Ly
w(1,1) = xk(1,i) % Voi moi x: w1=x
for i1 = 1:N % Ngo ra
u = u + h(1,i1)*w(1,i1);
end
y(1,i) = u; % Gan y()=u
u = 0;
for i2 = N:-1:2 % Cap nhat thanh ghi
w(1,i2)=w(1,i2-1);
end
end

subplot(1,2,2);
plot(0:1/Fs:(Ly-1)/Fs,y);
xlabel('t(s)');
ylabel('y(t)')

Đánh giá kết quả thực hiện


1. Sử dụng chương trình vẽ đồ thị Matlab để vẽ đồ thị giá trị đáp ứng xung của
bộ lọc.
Chương trình Matlab vẽ đồ thị đáp ứng xung của bộ lọc:
clc ;
clear all;
% % % ĐÁNH GIÁ KẾT QUẢ THỰC HIỆN
h=[-0.00174709654564910 0.00168872519890469 0.000701884398853810 -
0.00343223263694093 0.00314913871171463 0.000710421482553483 -
0.00437746218412451 0.00376664077187595 0.000330778555278004 -
0.00297665906401290 0.00166872303004502 -1.72704974511081e-17
0.00220275641330311 -0.00519489780787680 0.000765675515476357
0.0116220248654656 -0.0181296946169379 0.00398607038409518
0.0242275361286390 -0.0367727368557663 0.0106849535445541
0.0375033940408382 -0.0586453988030088 0.0208364586476874
0.0482007192080624 -0.0795222381627791 0.0329698175224111
0.0534842680611123 -0.0946076338576162 0.0443868144711528
0.0520015574471277 0.901035384271123 0.0520015574471277
0.0443868144711528 -0.0946076338576162 0.0534842680611123
0.0329698175224111 -0.0795222381627791 0.0482007192080624
0.0208364586476874 -0.0586453988030088 0.0375033940408382
0.0106849535445541 -0.0367727368557663 0.0242275361286390
0.00398607038409518 -0.0181296946169379 0.0116220248654656
0.000765675515476357 -0.00519489780787680 0.00220275641330311 -
1.72704974511081e-17 0.00166872303004502 -0.00297665906401290
0.000330778555278004 0.00376664077187595 -0.00437746218412451
0.000710421482553483 0.00314913871171463 -0.00343223263694093
0.000701884398853810 0.00168872519890469 -0.00174709654564910];
Fs = 8000
N = length(h)
figure(1);
stem(h);

Ghi nhận dạng sóng đáp ứng xung của bộ lọc:


2. Sử dụng chương trình Matlab tính FFT của đáp ứng xung và vẽ đồ thị đáp ứng
biên bộ và pha trong miền tần số của bộ lọc.
Chương trình Matlab tính FFT và vẽ đồ thị đáp ứng tần số của bộ lọc:
%% Dap ung tan so cua bo loc
figure(2);
m = 1
[H_matlab, w] = freqz(h,m);
H_matlab_manitude = abs(H_matlab);
H_matlab_phase = angle(H_matlab);
subplot(1,2,1)
semilogy(w,H_matlab_manitude)
xlabel("Frequency(radians)")
ylabel("Magnitude(dB)")
subplot(1,2,2)
plot(w,H_matlab_phase)
xlabel("Frequency(radians)")
ylabel("Phase(degrees)")
%% FFT
figure(3);
Hk = fft(h,N)
Hk_magnitude = abs(Hk)
Hk_phase = angle(Hk)
subplot(1,2,1)
stem((0:N/2-1)*Fs/N,Hk_magnitude(1:N/2)/N)
xlabel("Frequency(Hz)")
ylabel("Amplitude")
subplot(1,2,2)
stem((0:N/2-1)*Fs/N,Hk_phase(1:N/2)/N)
xlabel("Frequency(Hz)")
ylabel("Phase")
Đáp ứng tần số:

Ghi nhận đáp ứng biên độ-tần số và pha-tần số của bộ lọc:

Kiểm tra bộ lọc:


Tạo mẫu tín hiệu sine đa tần có phương trình x (t ) = x1 (t ) + x 2 (t ) với
x1 ( t ) = cos ( 2000 t ) và x 2 ( t ) = cos ( 5400 t ) từ chương trình Matlab và lưu vào biến
giá trị xn, xn1, xn2 với các thông số sau: tần số lấy mẫu fs = 8000 Hz, khoảng
thời gian lấy mẫu t = 0 đến t = 0.05 s. Sau đó xác định ngõ ra yn khi đưa xn qua
bộ lọc trên. Thực hiện các yêu cầu sau:
Vẽ đồ thị dạng sóng ngõ vào (x, x1, x2) và ngõ ra (y) của bộ lọc. Nhận xét.
Chương trình Matlap:
%% Tao mau tin hieu mien thoi gian
figure(4)
Ts = 1/Fs
t = 0 : Ts : 0.05 - Ts
xn1= cos(2000*pi*t)
xn2= cos(5400*pi*t)
xn = xn1 + xn2
x = xn1 + xn2 + xn
subplot(1,2,1)
plot(t,x)
xlabel('t(s)')
ylabel('x(t)')

% Giai thuat xu li mau


Lx = length(x)
M = length(h) -1
Ly = Lx + M
y = zeros(1,Ly);
w = zeros(1,N)
t1 = Lx+1:1:Ly
xk = [x zeros(size(t1))];
u = 0;
for i=1:Ly
w(1,1) = xk(1,i)
for i1 = 1:N
u = u + h(1,i1)*w(1,i1);
end
y(1,i) = u;
u = 0;
for i2 = N:-1:2
w(1,i2)=w(1,i2-1);
end
end

subplot(1,2,2);
plot(0:1/Fs:(Ly-1)/Fs,y);
xlabel('t(s)');
ylabel('y(t)')
Ngõ vào xn và ngõ ra yn:
Thực hiện tính phổ của ngõ vào (x) và ngõ ra (y) của bộ lọc, sau đó vẽ đồ thị
phổ biên độ của ngõ vào và ngõ ra. Nhận xét.
Chương trình Matlap:
%% Ve pho mien tan so
figure(5)
X_pho = fft(x,Lx);
Y_pho = fft(y,Ly);
X_magnitude = abs(X_pho);
Y_magnitude = abs(Y_pho);
subplot(1,2,1)
stem((0:Lx/2-1)*Fs/Lx,X_magnitude(1:Lx/2)/Lx)
xlabel("Frequency(Hz)")
ylabel("Amplitude_X")
subplot(1,2,2)
stem((0:Ly/2-1)*Fs/Ly,Y_magnitude(1:Ly/2)/Ly)
xlabel("Frequency(Hz)")
ylabel("Amplitude_Y")
Phổ miền tần số:

2. Tạo một mẫu tín hiệu x(n) là tổng của các tín hiệu sine có tần số từ 100 Hz đến
3900 Hz có bước nhảy 100Hz và tần số lấy mẫu fs = 8000 Hz, sau đó cho tín hiệu
xn qua bộ lọc để tính giá trị ngõ ra y(n). Dùng chương trình Matlab để vẽ phổ
biên độ của tín hiệu ngõ vào và ngõ ra. Giải thích tại sao có dạng phổ này?
Chương trính Matlap:
%% Tao mau tin hieu tu 100-->3900 va ve pho ngo vao, ngo ra
figure(6)

F=100:100:3900;
xa=0;
b=0;
Lf=length(F);
for i=1:Lf
xa=xa+sin(2*pi*F(1,i)*t);
end
Lxa=length(xa);
M=length(h)-1;
k4=Lxa+M;
k3=length(xa);
k=length(h);
ya=zeros(1,k4);
xan=zeros(1,k4);
t2=k3+1:1:k4;
xan=[xa zeros(size(t2))];
w=zeros(1,k);
for i=1:k4
w(1,1)=xan(1,i);
for ii=1:k
b=b+h(1,ii)*w(1,ii);
end
ya(1,i)=b;
b=0;
for e=k:-1:2
w(1,e)=w(1,e-1);
end
end
Lya=length(ya);
Ya=fft(ya,Lya);
Xa=fft(xa,Lxa);
Ya_mag=abs(Ya);
Xa_mag=abs(Xa);

subplot(1,2,1);
stem((0:Lxa/2-1)*Fs/Lxa,Xa_mag(1:Lxa/2)/Lxa);
xlabel('Hz');
ylabel('Amp');
subplot(1,2,2);
stem((0:Lya/2-1)*Fs/Lya,Ya_mag(1:Lya/2)/Lya);
xlabel('Hz');
ylabel('Amp');
Phổ của tín hiệu ngõ vào và ngõ ra:
Nhận xét:
-Bộ lọc nhóm tạo được đáp ứng đúng với yêu cầu đã đề ra.
-Ở phổ của ngõ ra vì đây là bộ lọc chắn dải có fc1=2500 và fc2=2900 nên phôt
của ngõ ra tại vùng tần số này có giá trị = 0.
Thí nghiệm 2: Thiết kế, thực hiện và kiểm tra bộ lọc FIR thông dải bằng phương
pháp Kaiser Window với các thông số như sau:
• Chiều dài đáp ứng xung: 63
• Tần số cắt: 1500 và 2000 Hz.
• Giá trị của  = 5
• Tần số lấy mẫu: 8 kHz.
1. Đáp ứng tần số của bộ lọc thiết kế trên công cụ SPTool của Matlab:

Kết quả:
2. Gía trị các hệ số đáp ứng xung của bộ lọc trên SPTool của Matlab:
Đơn vị 10 −6

-28 394 482 -1051 -1897 1238 4221

-6 -6394 -2814 6574 5636 -4097 -5495

689 -2*e-12 -925 9933 10003 -18691 -29846

17676 55958 -3*e-11 -77679 -34351 82721 76379

-63904 -111805 24084 124538 24084 -111805 -63904

76379 82721 -34351 -77679 -3*e-11 55958 17676

-29846 -18691 10003 9933 -925 -2*e-12 689

-5495 -4097 5636 6574 -2814 -6394 -6

4221 1238 -1897 -1051 482 394 -28

3. Đáp ứng biên độ-tần số và pha-tần số của bộ lọc thực hiện trên Matlab:
Chương trình Matlap:
clc ;
clear all;
h=[-2.85877068898113e-05 0.000394562779517746 0.000482415151186277 -
0.00105113297051336 -0.00189772220034618 0.00123847075719520
0.00422178934088143 -6.96498471681547e-18 -0.00634984952083661 -
0.00281401319382511 0.00657438607311026 0.00563669025688154 -0.00409743140499819
-0.00549529693090259 0.000689341578283886 -2.57459937661280e-18
-0.000925970213620167 0.00993328594326822 0.0100031738537173 -
0.0186911150995596 -0.0298467661360885 0.0176765750739977 0.0559583752702576 -
2.92213910723154e-17 -0.0776792890820932 -0.0343511174411251
0.0827216761354691 0.0763793958993219 -0.0639040870215645 -
0.111085813544049 0.0240844372270715 0.124538753055583 0.0240844372270715 -
0.111085813544049 -0.0639040870215645 0.0763793958993219 0.0827216761354691 -
0.0343511174411251 -0.0776792890820932 -2.92213910723154e-17
0.0559583752702576 0.0176765750739977 -0.0298467661360885 -
0.0186911150995596 0.0100031738537173 0.00993328594326822 -0.000925970213620167
-2.57459937661280e-18 0.000689341578283886 -0.00549529693090259
-0.00409743140499819 0.00563669025688154 0.00657438607311026 -
0.00281401319382511 -0.00634984952083661 -6.96498471681547e-18
0.00422178934088143 0.00123847075719520 -0.00189772220034618 -
0.00105113297051336 0.000482415151186277 0.000394562779517746 -
2.85877068898113e-05];
Fs = 8000
N = length(h)
% % % biên độ-tần số và pha-tần số
figure(1);
Hk = fft(h,N)
Hk_magnitude = abs(Hk)
Hk_phase = angle(Hk)
subplot(1,2,1)
stem((0:N/2-1)*Fs/N,Hk_magnitude(1:N/2)/N)
xlabel("Frequency(Hz)")
ylabel("Amplitude")
subplot(1,2,2)
stem((0:N/2-1)*Fs/N,Hk_phase(1:N/2)/N)
xlabel("Frequency(Hz)")
ylabel("Phase")

Kết quả:

4. Kiểm tra bộ lọc với ngõ vào tín hiệu sin đa tần có các thành phần tần số 1000
Hz và 1700 Hz:
Chương trình Matlap:
%% Tao mau tin hieu mien thoi gian
figure(2)
Ts = 1/Fs
t = 0 : Ts : 0.05 - Ts
xn1= cos(2000*pi*t)
xn2= cos(3400*pi*t)
xn = xn1 + xn2
x = xn1 + xn2 + xn
subplot(1,2,1)
plot(t,x)
xlabel('t(s)')
ylabel('x(t)')

% Giai thuat xu li mau


Lx = length(x)
M = length(h) -1
Ly = Lx + M
y = zeros(1,Ly);
w = zeros(1,N)
t1 = Lx+1:1:Ly
xk = [x zeros(size(t1))];
u = 0;
for i=1:Ly
w(1,1) = xk(1,i)
for i1 = 1:N
u = u + h(1,i1)*w(1,i1);
end
y(1,i) = u;
u = 0;
for i2 = N:-1:2
w(1,i2)=w(1,i2-1);
end
end

subplot(1,2,2);
plot(0:1/Fs:(Ly-1)/Fs,y);
xlabel('t(s)');
ylabel('y(t)')

Kết quả:

Phổ ở miền tấn số:


Chương trình Matlap:
%% Ve pho mien tan so
figure(3)
X_pho = fft(x,Lx);
Y_pho = fft(y,Ly);
X_magnitude = abs(X_pho);
Y_magnitude = abs(Y_pho);
subplot(1,2,1)
stem((0:Lx/2-1)*Fs/Lx,X_magnitude(1:Lx/2)/Lx)
xlabel("Frequency(Hz)")
ylabel("Amplitude_X")
subplot(1,2,2)
stem((0:Ly/2-1)*Fs/Ly,Y_magnitude(1:Ly/2)/Ly)
xlabel("Frequency(Hz)")
ylabel("Amplitude_Y")
Kết quả:

5. Kiểm tra bộ lọc với ngõ vào tín hiệu tổng của các tín hiệu sine tần số từ 100 –
3900 Hz:
Chương trình Matlap:
%% Tao mau tin hieu tu 100-->3900 va ve pho ngo vao, ngo ra
figure(4);

F=100:100:3900;
xa=0;
b=0;
Lf=length(F);
for i=1:Lf
xa=xa+sin(2*pi*F(1,i)*t);
end
Lxa=length(xa);
M=length(h)-1;
k4=Lxa+M;
k3=length(xa);
k=length(h);
ya=zeros(1,k4);
xan=zeros(1,k4);
t2=k3+1:1:k4;
xan=[xa zeros(size(t2))];
w=zeros(1,k);
for i=1:k4
w(1,1)=xan(1,i);
for ii=1:k
b=b+h(1,ii)*w(1,ii);
end
ya(1,i)=b;
b=0;
for e=k:-1:2
w(1,e)=w(1,e-1);
end
end
Lya=length(ya);
Ya=fft(ya,Lya);
Xa=fft(xa,Lxa);
Ya_mag=abs(Ya);
Xa_mag=abs(Xa);

subplot(1,2,1);
stem((0:Lxa/2-1)*Fs/Lxa,Xa_mag(1:Lxa/2)/Lxa);
xlabel('Hz');
ylabel('Amp');
subplot(1,2,2);
stem((0:Lya/2-1)*Fs/Lya,Ya_mag(1:Lya/2)/Lya);
xlabel('Hz');
ylabel('Amp');

Kết quả:

Nhận xét:
-Bộ lọc nhóm tạo được đáp ứng đúng với yêu cầu đã đề ra.
-Ở phổ của ngõ ra vì đây là bộ lọc chắn dải có fc1=1500 và fc2=2000 nên phổ
của ngõ ra tại vùng tần số này có giá trị = 1
Thí nghiệm 3: Thiết kế, thực hiện và kiểm tra bộ lọc FIR thông cao bằng
phương pháp Kaiser Window với các thông số như sau:
Thiết kế Sptool:
• Chiều dài đáp ứng xung: 63
• Tần số cắt: 2200 Hz.
• Giá trị của  = 4
• Tần số lấy mẫu: 8 kHz.
1. Đáp ứng tần số của bộ lọc thiết kế dùng SPTool trên MATLAB:

2. Gía trị các hệ số đáp ứng xung của bộ lọc :


Đơn vị 10 −6

142 -1194 238 1804 -1055 -2270 2368

2327 -4136 -1670 6178 -5 -8155 2915

9576 -7182 -9811 12739 8116 -19331 -3624

26518 -4776 -33713 18907 40255 -43075 -45494

93123 48883 -314117 450503 -314117 48883 93123

-45494 -43705 40255 18907 -33713 -4776 26518

-3624 -19331 8116 12739 -9811 -7182 9576

2915 -8155 -5 6178 -1670 -4136 2327

2368 -2270 -1055 1804 238 -1194 142


3. Đáp ứng biên độ-tần số và pha-tần số của bộ lọc thực hiện Matlab:
Chương trình Matlap:
clc ;
clear all;
h=[0.000142283305243643 -0.00119407064966920 0.000238094241548619
0.00180437346965779 -0.00105503823230635 -0.00227059504648955
0.00236898929825931 0.00232783717916770 -0.00413698749921849 -
0.00167033758173271 0.00617820053213875 -5.29289580547185e-17 -
0.00815538025173265 0.00291509133399347 0.00957616503682162 -0.00718257546114980
-0.00981140458140240 0.0127399746366815 0.00811681517718264 -
0.0193319503098689 -0.00362456540468375 0.0265180516736463 -
0.00477607330848616 -0.0337130144049365 0.0189073657296987 0.0402554521969857 -
0.0430757576238980 -0.0454949731715578 0.0931230506131574 0.0488836082271227 -
0.314177280837310 0.450503208206324 -0.314177280837310 0.0488836082271227
0.0931230506131574 -0.0454949731715578 -0.0430757576238980
0.0402554521969857 0.0189073657296987 -0.0337130144049365 -
0.00477607330848616 0.0265180516736463 -0.00362456540468375 -
0.0193319503098689 0.00811681517718264 0.0127399746366815 -0.00981140458140240
-0.00718257546114980 0.00957616503682162 0.00291509133399347 -
0.00815538025173265 -5.29289580547185e-17 0.00617820053213875 -
0.00167033758173271 -0.00413698749921849 0.00232783717916770
0.00236898929825931 -0.00227059504648955 -0.00105503823230635
0.00180437346965779 0.000238094241548619 -0.00119407064966920
0.000142283305243643];
Fs = 8000
N = length(h)
%% Câu 3
% % % biên độ-tần số và pha-tần số
figure(1);
Hk = fft(h,N)
Hk_magnitude = abs(Hk)
Hk_phase = angle(Hk)
subplot(1,2,1)
stem((0:N/2-1)*Fs/N,Hk_magnitude(1:N/2)/N)
xlabel("Frequency(Hz)")
ylabel("Amplitude")
subplot(1,2,2)
stem((0:N/2-1)*Fs/N,Hk_phase(1:N/2)/N)
xlabel("Frequency(Hz)")
ylabel("Phase")
Kết quả:
4. Kiểm tra bộ lọc với ngõ vào tín hiệu sin đa tần có các thành phần tần số 1000
Hz và 2500 Hz:
Chương trình Matlap:
%% Tao mau tin hieu mien thoi gian
figure(2)
Ts = 1/Fs
t = 0 : Ts : 0.05 - Ts
xn1= cos(2000*pi*t)
xn2= cos(5000*pi*t)
xn = xn1 + xn2
x = xn1 + xn2 + xn
subplot(1,2,1)
plot(t,x)
xlabel('t(s)')
ylabel('x(t)')

% Giai thuat xu li mau


Lx = length(x)
M = length(h) -1
Ly = Lx + M
y = zeros(1,Ly);
w = zeros(1,N)
t1 = Lx+1:1:Ly
xk = [x zeros(size(t1))];
u = 0;
for i=1:Ly
w(1,1) = xk(1,i)
for i1 = 1:N
u = u + h(1,i1)*w(1,i1);
end
y(1,i) = u;
u = 0;
for i2 = N:-1:2
w(1,i2)=w(1,i2-1);
end
end

subplot(1,2,2);
plot(0:1/Fs:(Ly-1)/Fs,y);
xlabel('t(s)');
ylabel('y(t)')

%% Ve pho mien tan so


figure(3);
X_pho = fft(x,Lx);
Y_pho = fft(y,Ly);
X_magnitude = abs(X_pho);
Y_magnitude = abs(Y_pho);
subplot(1,2,1)
stem((0:Lx/2-1)*Fs/Lx,X_magnitude(1:Lx/2)/Lx)
xlabel("Frequency(Hz)")
ylabel("Amplitude_X")
subplot(1,2,2)
stem((0:Ly/2-1)*Fs/Ly,Y_magnitude(1:Ly/2)/Ly)
xlabel("Frequency(Hz)")
ylabel("Amplitude_Y")
Trong miền thời gian:

Trong miền tần số:

5. Kiểm tra bộ lọc với ngõ vào tín hiệu tổng của các tín hiệu sin tần số 100 – 3900
Hz:
Chương trình Matlap:
%% Tao mau tin hieu tu 100-->3900 va ve pho ngo vao, ngo ra
figure(4);
F=100:100:3900;
xa=0;
b=0;
Lf=length(F);
for i=1:Lf
xa=xa+sin(2*pi*F(1,i)*t);
end
Lxa=length(xa);
M=length(h)-1;
k4=Lxa+M;
k3=length(xa);
k=length(h);
ya=zeros(1,k4);
xan=zeros(1,k4);
t2=k3+1:1:k4;
xan=[xa zeros(size(t2))];
w=zeros(1,k);
for i=1:k4
w(1,1)=xan(1,i);
for ii=1:k
b=b+h(1,ii)*w(1,ii);
end
ya(1,i)=b;
b=0;
for e=k:-1:2
w(1,e)=w(1,e-1);
end
end
Lya=length(ya);
Ya=fft(ya,Lya);
Xa=fft(xa,Lxa);
Ya_mag=abs(Ya);
Xa_mag=abs(Xa);

subplot(1,2,1);
stem((0:Lxa/2-1)*Fs/Lxa,Xa_mag(1:Lxa/2)/Lxa);
xlabel('Hz');
ylabel('Amp');
subplot(1,2,2);
stem((0:Lya/2-1)*Fs/Lya,Ya_mag(1:Lya/2)/Lya);
xlabel('Hz');
ylabel('Amp');
Kết quả:

Thí nghiệm 4: Thiết kế, thực hiện và kiểm tra một bộ lọc FIR multiband gồm
63 hệ số, tần số lấy mẫu là 10 kHz, dải thông [500 1000] Hz và [1500 2000] Hz,
độ rộng dải chuyển tiếp 100 Hz. Bộ lọc cần thiết kế có đáp ứng tần số như sau:

1.2

0.8

0.6

0.4

0.2

0
0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000

1. Đáp ứng tần số của bộ lọc thiết kế dùng MATLAB:


Chương trình Matlap:
%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 0 1 1 0 0 1 1 0 0];
n = 63;
cof = remez(n-1,f,m);
% frequency response with 256 points
[h w] = freqz(cof,1,256);
% plot magnitude of the filter
plot(5000*f,m);
figure;
plot(w/pi,abs(h));

Kết quả:

2. Giá trị các hệ số đáp ứng xung của bộ lọc


0.0629 -0.0379 -0.0232 -0.0121 -0.0072 -0.0075 -0.0065

-0.0002 0.0041 -0.0060 -0.0313 -0.0508 -0.0410 -0.0048

0.0257 0.0237 0.0017 0.0014 0.0422 0.0876 0.0782

0.0006 -0.0874 -0.1118 -0.0614 -0.0021 -0.0011 -0.0480

-0.0652 0.0008 0.1097 0.1633 0.1097 0.0008 -0.0652

-0.0480 -0.0011 -0.0021 -0.0614 -0.1118 -0.0874 0.0006

0.0782 0.0876 0.0422 0.0014 0.0017 0.0237 0.0257

-0.0048 -0.0410 -0.0508 -0.0313 -0.0060 0.0041 -0.0002

-0.0065 -0.0075 -0.0072 -0.0121 -0.0232 -0.0379 0.0629

3. Dạng sóng đáp ứng xung của bộ lọc:


Chương trình Matlap:
clc ;
clear all;
h=[0.0629464001857862 -0.0379895774715976 -0.0232455837205856 -
0.0121084542071797 -0.00728192875634709 -0.00758870757876416 -
0.00658151214389935 -0.000288584120480023 0.00416699727409253 -
0.00607547500688878 -0.0313457094276908 -0.0508507421030569 -0.0410553516196983 -
0.00481914395177860 0.0257724255350128 0.0237347384932835 0.00171060290297974
0.00147466748429707 0.0422351629513489 0.0876389862456108
0.0782978474687119 0.000603435671365441 -0.0874874725925719 -
0.111837915704097 -0.0614899870756429 -0.00210250060447118 -
0.00115779547789171 -0.0480739396381892 -0.0652779198236848 0.000877083092475094
0.109793824320079 0.163301921091584 0.109793824320079
0.000877083092475094 -0.0652779198236848 -0.0480739396381892 -
0.00115779547789171 -0.00210250060447118 -0.0614899870756429 -
0.111837915704097 -0.0874874725925719 0.000603435671365441
0.0782978474687119 0.0876389862456108 0.0422351629513489
0.00147466748429707 0.00171060290297974 0.0237347384932835
0.0257724255350128 -0.00481914395177860 -0.0410553516196983 -
0.0508507421030569 -0.0313457094276908 -0.00607547500688878
0.00416699727409253 -0.000288584120480023 -0.00658151214389935 -
0.00758870757876416 -0.00728192875634709 -0.0121084542071797 -
0.0232455837205856 -0.0379895774715976 0.0629464001857862];
Fs = 10000
N = length(h)
figure(1);
stem(h);

4. Đáp ứng biên độ-tần số và pha-tần số của bộ lọc


Chương trình Matlap:
figure(2);
Hk = fft(h,N)
Hk_magnitude = abs(Hk)
Hk_phase = angle(Hk)
subplot(1,2,1)
stem((0:N/2-1)*Fs/N,Hk_magnitude(1:N/2)/N)
xlabel("Frequency(Hz)")
ylabel("Amplitude")
subplot(1,2,2)
stem((0:N/2-1)*Fs/N,Hk_phase(1:N/2)/N)
xlabel("Frequency(Hz)")
ylabel("Phase")

5. Kiểm tra bộ lọc với ngõ vào tín hiệu sin đa tần có các thành phần tần số 500
Hz, 750 Hz và 1750 Hz:
Chương trình Matlap:
%% Dap ung tan so cua bo loc
figure(2);
Hk = fft(h,N)
Hk_magnitude = abs(Hk)
Hk_phase = angle(Hk)
subplot(1,2,1)
stem((0:N/2-1)*Fs/N,Hk_magnitude(1:N/2)/N)
xlabel("Frequency(Hz)")
ylabel("Amplitude")
subplot(1,2,2)
stem((0:N/2-1)*Fs/N,Hk_phase(1:N/2)/N)
xlabel("Frequency(Hz)")
ylabel("Phase")

%% Tao mau tin hieu mien thoi gian


figure(3)
Ts = 1/Fs
t = 0 : Ts : 0.05 - Ts
xn1= cos(1000*pi*t)
xn2= cos(1500*pi*t)
xn3= cos(3500*pi*t)
xn = xn1 + xn2 + xn3
x = xn1 + xn2 + xn3 + xn
subplot(1,2,1)
plot(t,x)
xlabel('t(s)')
ylabel('x(t)')
% Giai thuat xu li mau
Lx = length(x)
M = length(h) -1
Ly = Lx + M
y = zeros(1,Ly);
w = zeros(1,N)
t1 = Lx+1:1:Ly
xk = [x zeros(size(t1))];
u = 0;
for i=1:Ly
w(1,1) = xk(1,i)
for i1 = 1:N
u = u + h(1,i1)*w(1,i1);
end
y(1,i) = u;
u = 0;
for i2 = N:-1:2
w(1,i2)=w(1,i2-1);
end
end

subplot(1,2,2);
plot(0:1/Fs:(Ly-1)/Fs,y);
xlabel('t(s)');
ylabel('y(t)')

%% Ve pho mien tan so


figure(4);
X_pho = fft(x,Lx);
Y_pho = fft(y,Ly);
X_magnitude = abs(X_pho);
Y_magnitude = abs(Y_pho);
subplot(1,2,1)
stem((0:Lx/2-1)*Fs/Lx,X_magnitude(1:Lx/2)/Lx)
xlabel("Frequency(Hz)")
ylabel("Amplitude_X")
subplot(1,2,2)
stem((0:Ly/2-1)*Fs/Ly,Y_magnitude(1:Ly/2)/Ly)
xlabel("Frequency(Hz)")
ylabel("Amplitude_Y")

Kết quả:
6. Kiểm tra bộ lọc với ngõ vào tín hiệu tổng của các tín hiệu sine tần số từ 100 –
3900 Hz:
Chương trình Matlap:
%% Tao mau tin hieu tu 100-->3900 va ve pho ngo vao, ngo ra
figure(5);
F=100:100:3900;
xa=0;
b=0;
Lf=length(F);
for i=1:Lf
xa=xa+sin(2*pi*F(1,i)*t);
end
Lxa=length(xa);
M=length(h)-1;
k4=Lxa+M;
k3=length(xa);
k=length(h);
ya=zeros(1,k4);
xan=zeros(1,k4);
t2=k3+1:1:k4;
xan=[xa zeros(size(t2))];
w=zeros(1,k);
for i=1:k4
w(1,1)=xan(1,i);
for ii=1:k
b=b+h(1,ii)*w(1,ii);
end
ya(1,i)=b;
b=0;
for e=k:-1:2
w(1,e)=w(1,e-1);
end
end
Lya=length(ya);
Ya=fft(ya,Lya);
Xa=fft(xa,Lxa);
Ya_mag=abs(Ya);
Xa_mag=abs(Xa);

subplot(1,2,1);
stem((0:Lxa/2-1)*Fs/Lxa,Xa_mag(1:Lxa/2)/Lxa);
xlabel('Hz');
ylabel('Amp');
subplot(1,2,2);
stem((0:Lya/2-1)*Fs/Lya,Ya_mag(1:Lya/2)/Lya);
xlabel('Hz');
ylabel('Amp');
Phổ của tín hiệu ngõ vào và ngõ ra:

You might also like