You are on page 1of 33

MỤC LỤC

BÀI 1: ..................................................................................................................................................... 2
a.Với N = 1, vẽ đáp ứng xung của bộ lọc (100 mẫu đầu tiên), vẽ đáp ứng biên độ của bộ lọc và group
delay. .................................................................................................................................................. 2
b.Vẽ giản đồ cực và zero của bộ lọc. (Học viên có thể tham khảo hàm root trong Matlab).................... 5
c.Trong file bail.mat có chứa một biến là speech (một tín hiệu được lấy mẫu với tần số fs = 11025 Hz).
Sử dụng bộ lọc ở câu a để lọc tín hiệu này và vẽ so sánh xem tín hiệu có giống/khác tín hiệu ban đầu. . 6
d.Với N = 50, vẽ đáp ứng xung của bộ lọc (5000 mẫu đầu tiên), vẽ đáp ứng biên độ của bộ lọc và
group delay. ........................................................................................................................................ 8
f.Thực hiệu lại câu b và so sánh kết quả khi sử dụng 02 bộ lọc này....................................................... 9
BÀI 2 .................................................................................................................................................... 11
Câu a: Tìm bậc của bộ lọc ................................................................................................................. 12
Câu c: Vẽ đáp ứng biên độ của bộ lọc. Vẽ giản đồ cực và zero của bộ lọc. Vẽ đáp ứng xung của bộ lọc
(100 trọng số đầu tiên)....................................................................................................................... 16
Câu d: Thực hiện việc lọc tín hiệu ban đầu. So sánh kết quả khi thực hiện bằng 03 bộ lọc trên. Rút ra
nhận xét. ............................................................................................................................................ 25
BÀI 3: ................................................................................................................................................... 28
a) Phổ tín hiệu trước khi lấy mẫu: .................................................................................................. 29
b) Tính và vẽ phổ tín hiệu trước khi lấy mẫu:.................................................................................. 31
BÀI 1:
Trong nội dung chương trình học, khi một tín hiệu đi qua một bộ lọc, người ta thường chỉ quan
tâm tới việc biên độ của tín hiệu sẽ bị thay đổi theo đáp ứng của bộ lọc mà bỏ qua sự ảnh hưởng
của việc thay đổi góc pha của tín hiệu do đáp ứng của bộ lọc. Điều này là vì quan điểm tai người
ít nhạy với sự thay đổi về góc pha của tín hiệu âm thanh. Điều đó có nghĩa rằng nếu một tín hiệu
âm thanh được lọc bởi một bộ lọc all-pass (cho qua mọi tần số) thì tai người sẽ không nhận thấy
sự thay đổi. Bài tập này dùng để kiểm chứng điều này. Cho một bộ lọc all-pass có hàm truyền có
dạng:

Các chỉ số ak và bk có được lưu trong các biến a và b có trong file bail.mat. Học viên sử dụng
Matlab để load file này để có được các chỉ số này. Chú ý: a(k+1) = ak và b(k+1) = bk.

a.Với N = 1, vẽ đáp ứng xung của bộ lọc (100 mẫu đầu tiên), vẽ đáp ứng biên độ của bộ lọc và
group delay.
%Dap ung xung
tu = b; %Tu so
mau = a; %Mau so
figure(1)
subplot(2,2,1);
range = 0:1:100;
h = impz(tu,mau,range+1); %Convert H(z) to h(n)
stem(range,h); %Ve do thi ham roi rac
title('Đáp ứng xung h(n)');
xlabel('n'); ylabel('h(n)');

%Dap ung bien do


subplot(2,2,2)
w = 0:(pi)/200:pi;
h = freqz(tu,mau,w);

plot(w/pi,20*log10(abs(h))); %Ve dap ung


grid on;
title('Đáp ứng biên độ');
xlabel('frequency in pi units');
ylabel('Magnitude (dB)');

%Group Delay
subplot(2,2,[3,4])
plot(w/pi,grpdelay(tu,mau,w));
grid on;
title('Group delay');
xlabel ('frequency in pi units');
ylabel ('Group delays in samples');
b.Vẽ giản đồ cực và zero của bộ lọc. (Học viên có thể tham khảo hàm root trong Matlab)
root : hàm dùng để tìm nghiệm trong mathlab
zplane: hàm dùng để biểu diễn trên đồ thị mặt phẳng z

tu = b;
mau = a;
figure(1);
pole = roots(tu);
zero = roots(mau);
subplot(2,2,1);
zplane(pole,zero);
title('bieu do cuc-zero theo vong tron don vi');
xlabel('truc thuc');
ylabel('truc ao');
subplot(2,2,2)
plot(real(pole), imag(pole), 'gx', real(zero), imag(zero), 'bo');
title('bieu do cuc-zero');
xlabel('Re');
ylabel('Im');
grid on;
c.Trong file bail.mat có chứa một biến là speech (một tín hiệu được lấy mẫu với tần số fs =
11025 Hz). Sử dụng bộ lọc ở câu a để lọc tín hiệu này và vẽ so sánh xem tín hiệu có giống/khác
tín hiệu ban đầu.

Hàm speech

Ở câu này, chúng em sử dụng hàm filter để thực hiện việc so sánh
Filter:
- Công dụng:
Lọc dữ liệu với đáp ứng xung không xác định hay đáp ứng xung xác định.
- Cú pháp:
y = filter(b,a,X)
[y,zf] = filter(b,a,X)
[y,zf] = filter(b,a,X,zi)
y = filter(b,a,X,zi,dim)
[.] = filter(b,a,X,[ ],dim)
- Giải thích:
Lệnh fiter lọc dữ liệu tuần tự sử dụng bộ lọc số cho các ngõ vào thực và phức.
y = filter(b,a,X) lọc dữ liệu trong vector X với bộ lọc được mô tả bởi vector hệ số tử số b
và vector hệ số mẫu số a. Nếu a(1) không bằng 1, bộ lọc sẽ chuẩn hóa hệ số lọc bởi a(1).
Nếu a(1) bằng 0 thì sẽ báo lỗi.
Nếu X là một ma trận, bộ lọc sẽ thực hiện trên các cột của X. Nếu X là một mảng đa chiều,
bộ lọc sẽ thực hiện theo chiều duy nhất.
[y,zf] = filter(b,a,X) tạo ma trận điều kiện cuối cùng zf của bộ trễ. Ngõ ra zf là một vector
của max(size(a),size(b)) hoặc một tập hợp các vector với mỗi vector là một cột của X.

tu = b; %tu so H(z)
mau = a; %mau so H(z)

%Ve dau vao


subplot(2,1,1);
plot(speech);
grid on;
title('tin hieu ban dau');
xlabel('t');
ylabel('A');
%Ve dau ra
y = filter(tu,mau,speech);
subplot(2,1,2);
plot(y);
grid on;
title('tin hieu ra');
xlabel('t');
ylabel('bien do');
Ta thấy được sau khi qua bộ lộc, tín hiệu sẽ phẳng hơn, đỡ nhiễu hơn so với tín hiệu đầu
vào

d.Với N = 50, vẽ đáp ứng xung của bộ lọc (5000 mẫu đầu tiên), vẽ đáp ứng biên độ của bộ
lọc và group delay.
Hz = tf(b,a,1/fs,'Variable','z^-1'); %Ham truyen
figure(1);
subplot(2,2,1);
Hz = Hz^50;
ts = Hz.Numerator{1, 1};
ms = Hz.Denominator{1, 1};
impz(ts,ms,5000);
grid on;
title('Dap ung xung cua he thong');
%
[h1,w1] = freqz(ts,ms,5000,fs);
mag1 = 20*log10(abs(h1));
phase1 = angle(h1)*180/pi;
subplot(2,2,2);
plot(w1/pi,mag1);
xlabel('tan so');
ylabel('bien do');
title('Dap ung bien do cua he thong');
grid on;
axis tight;
subplot(2,2,3);
plot(w1/pi,phase1);
xlabel('Frequency');
ylabel('Phase');
title('Dap ung pha cua he thong');
grid on;
axis tight;
%
subplot(2,2,4);
grpdelay(ts,ms,5000,fs);
grid on;
title('Do tre group delay');

f.Thực hiệu lại câu b và so sánh kết quả khi sử dụng 02 bộ lọc này.
-Vẽ biểu đồ cực zero của N=50
figure(2);
pole = roots(tu);
zero = roots(mau);
subplot(2,2,1);
zplane(pole,zero);
title('bieu do cuc zero');
xlabel('Re');
ylabel('Im');
subplot(2,2,2);
plot(real(pole), imag(pole), 'gx', real(zero), imag(zero), 'bo');
title('bieu do cuc zero');
xlabel('Re');
ylabel('Im');
grid on;

-So sánh
BÀI 2
1.1. Đề bài

Mục tiêu của bài tập này là để sinh viên biết cách thiết kế một bộ lọc FIR/IIR và thấy được đáp
ứng biên độ của bộ lọc thực tế sẽ khác như thế nào so với bộ lọc lý tưởng. Trong file bai2.mat có
chứa một biến là noisy. Đây là âm thanh được lấy mẫu với tần số 44100 Hz. Âm thanh này là sự
kết hợp của một giọng nói có tần số dưới 4KHz và một âm thanh nhiễu với tần số lớn hơn 4KHz.
Để nghe được giọng nói, ta cần lọc âm thanh đã cho với một bộ lọc thông thấp có cần số cắt là
4KHz. Thiết kế 01 bộ lọc FIR sử dụng của sổ Kaiser, 01 bộ lọc IRR bằng phương pháp Betterworth
và 01 bộ lọc IRR bằng phương pháp Chebyshev type II với một số yêu cầu:

• Tần số biên dải thông (fpass) là 2500Hz.


• Tần số biên dải chắn (fstop) là 4000Hz.
• Độ lợi trong dải thông dao động 40dB – 37dB.
• Độ lợi lớn nhất trong dải chắn là -55dB.
Chú ý rằng bộ lọc có thể phải có bậc rất lớn để thỏa các yêu cầu trên.

a) Tìm bậc của bộ lọc.


b) Tìm số phép tính nhân cần thực hiện đối với mỗi mẫu đầu vào. Giải thích rõ dựa vào cấu
trúc bộ lọc mà sinh viên đề xuất.
c) Vẽ đáp ứng biên độ của bộ lọc. Vẽ giản đồ cực và zero của bộ lọc. Vẽ đáp ứng xung của
bộ lọc (100 trọng số đầu tiên).
d) Thực hiện việc lọc tín hiệu ban đầu. So sánh kết quả khi thực hiện bằng 03 bộ lọc trên. Rút
ra nhận xét.
1.2. Thực hiện yêu cầu

Câu a: Tìm bậc của bộ lọc


Bộ lọc FIR Kaiser

bandpass_ripple = 0.171; %Rp = 3dB


bandstop_ripple = 0.002; %Rs = 55dB

fcuts = [2500 4000];


mags = [1 0];
devs = [0.171 0.002];
[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,fs);

=> N = 95

Bộ lọc IRR bằng phương pháp Betterworth

+) Hàm Buttord được dùng để xác định bậc của bộ lọc .


+) Cú pháp của Hàm Buttord() là :
[n wn] = Buttord(wp,ws,Rp,Rs)
Trong đó :
n là Bậc của bộ lọc .
wn là Các giá trị của tần số .
wp là Tần số dải thông .
ws là Tần số dải chắn .
Rp là Độ gợn dải thông .
Rs là Độ gợn dải chắn .
Lưu ý : wp và ws có giá trị trong khoảng từ 0 đến 1 .

%thiet ke bo loc Butterworth

fpass = 2.5; %KHz


fstop = 4.0; %KHz
bandpass_ripple = 3;
bandstop_ripple = 55;
Fs = fs/1000;
%Tim Ws,Wp,Rp,Rs
Wp = (fpass)/(Fs);
Ws = (fstop)/(Fs);
Rp = bandpass_ripple;
Rs = bandstop_ripple;

[n,Wc] = buttord(Wp,Ws,Rp,Rs);

Ta có bậc của bộ lọc là N=14 .

Bộ lọc IIR bằng phương pháp Chebyshev type 2

%Thong so
fpass = 2500; %don vi Hz
fstop = 4000; %don vi Hz
bandpass_ripple = 3; %Rp = 3dB
bandstop_ripple = 55; %Rs = 55dB
%Tim Ws,Wp,Rp,Rs
Wp = (2*pi*fpass)/(2*pi*fs);
Ws = (2*pi*fstop)/(2*pi*fs);
Rp = bandpass_ripple;
Rs = bandstop_ripple;

%Tim bac va tan so cut-off


[n,Wc] = cheb2ord(Wp,Ws,Rp,Rs);
Câu c: Vẽ đáp ứng biên độ của bộ lọc. Vẽ giản đồ cực và zero của bộ lọc. Vẽ đáp ứng xung của
bộ lọc (100 trọng số đầu tiên).

Bộ lọc FIR Kaiser

*Vẽ đáp ứng biên độ

%Design the FIR filter with Kaiser window

%Ve dap ung bien đo


bandpass_ripple = 0.171; %Rp = 3dB
bandstop_ripple = 0.002; %Rs = 55dB

fcuts = [2500 4000];


mags = [1 0];
devs = [0.171 0.002];

[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,fs);
hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale');
freqz(hh)
*Vẽ đáp ứng xung với N = 100 mẫu

%Ve dap ung xung


figure(1)
N = 0:101;
h = impz(hh,1,N+1); %
stem(N,h); %Ve do thi ham roi rac
title('Impulse response h(n)');
xlabel('n');
ylabel('h(n)');
*Vẽ giản đồ zero-pole

%Ve dap ung bien đo


figure(1);
w = 0:(pi)/200:pi;
h = freqz(hh,1,w);
zplane(h);
title('Pole-Zero Plot');
xlabel('Re');
ylabel('Im'); grid on;
Bộ lọc IRR bằng phương pháp Betterworth và Chebyshev

%He so b va a
[b,a] = butter(n,Wc,'low');

%Ve dap ung bien đo


w = 0:(pi)/200:pi;
h = freqz(b,a,w);

figure(1);
subplot(2,2,1);
plot(w/pi,20*log10(abs(h)));
grid on;
title('Dap ung bien do');
xlabel(' frequency (x pi)');
ylabel('dB');

%Ve gian do zero-pole


subplot(2,2,2);
pole = roots(b);
zero = roots(a);
plot(real(pole), imag(pole), 'rx', real(zero), imag(zero), 'go');
title('Pole-Zero Plot');
xlabel('Re');
ylabel('Im'); grid on;

%Tim dap ung xung


subplot(2,2,[3,4]);
range = 0:1:100; %khoảng chia 100 trong so
h = impz(b,a,range,fs); %Convert H(z) to h(n)
stem(range,h); %Ve do thi ham roi rac
title('Đáp ứng xung h(n)');
xlabel('n');
ylabel('h(n)');
%he so b va a
[b,a] = cheby2(n,Rs,Wc,'low');
h = freqz(b,a,w);

subplot(2,2,1);
plot(w/pi,20*log10(abs(h))); grid on;
title('Magnitude response');
xlabel('frequency in pi units');
ylabel('Magnitude in dB');
%he so b va a
[b,a] = cheby2(n,Rs,Wc,'low');

%Ve gian do zero-pole


subplot(2,2,2);
zplane(b,a);
xlabel('Re');
ylabel('Im'); grid on;

%Tim dap ung xung


subplot(2,2,[3,4]);
N = 0:1:100;
h = impz(b,a,N,fs); %Convert H(z) to h(n)
stem(N,h); %Ve do thi ham roi rac
title('Impulse response h(n)');
xlabel('n'); ylabel('h(n)');
Câu d: Thực hiện việc lọc tín hiệu ban đầu. So sánh kết quả khi thực hiện bằng 03 bộ lọc trên. Rút
ra nhận xét.
Bộ lọc kaiser

%Ve Input

subplot(2,1,1);

plot(noisy); grid on

title('Input');

xlabel('t');

ylabel('A');

%Ve output

y = filter(b,1,noisy);

subplot(2,1,2);

plot(y); grid on

title('Output');
xlabel('t');

ylabel('A');

Bộ lọc butterworth
[n,Wc] = buttord(Wp,Ws,Rp,Rs);
%he so b va a
[b,a] = butter(n,Wc,'low');
%Ve Input
subplot(2,1,1);
plot(noisy); grid on
title('Input');
xlabel('t');
ylabel('A');
%Ve output
y = filter(b,a,noisy);
subplot(2,1,2);
plot(y); grid on
title('Output');
xlabel('t');
ylabel('A');

Bộ lọc chebyshev

%he so b va a
[b,a] = cheby2(n,Rs,Wc,'low');
%Ve Input
subplot(2,1,1);
plot(noisy); grid on
title('Input');
xlabel('t');
ylabel('A');
%Ve output
y = filter(b,a,noisy);
subplot(2,1,2);
plot(y); grid on
title('Output chebyshev');
xlabel('t');
ylabel('A');
Nhận xét : ta thấy được rằng các phương pháp hầu hết sẽ lọc được nhiễu.
Tuy nhiên sẽ có độ phẳng khác nhau giữa các phương pháp

BÀI 3:
Gọi ABCD lần lượt là trung bình cộng 4 số cuối cùng của MSSV của các thành viên trong nhóm (Vd: giả
sử nhóm có 02 thành viên, 4 chữ số cuối cùng của 2 thành viên lần lượt là A1B1C1D1 và A2B2C2D2 thì
ABCD = round((A1B1C1D1+ A2B2C2D2)/2). Tương tự cho nhóm có nhiều thành viên hơn). Nếu số nào
trong các số A, B, C, D có giá trị là 0 thì sinh viên tự động cộng thêm 5 cho số đó. (Vd: A = 0 sẽ điều chỉnh
thành A = 5).
Cho tín hiệu x(t) = 5cos (2,vB/) + 4sin (2ftCt) + 3sin (2ftDt) trong đó t có đơn vị (ms). Tín hiệu được

lấy mẫu với tần số f (KHz) = round (mean (B,C,D)).

a/ Thực hiện vẽ phổ của tín hiệu trước và sau khi lấy mẫu theo lý thuyết (Thực hiện tính phổ của tín hiệu
trước khi lấy mẫu bằng tay, sau đó dùng hàm stem để vẽ phổ này. Tương tự đối với phổ của tín hiệu sau
khi lấy mẫu).
b/ Sử dụng matlab, tính phổ của tín hiệu trước và sau khi lấy mẫu (bằng hàm fft hoặc dft). Thực hiện vẽ
phổ biên độ của tín hiệu trước và sau khi được lấy mẫu với kết quả vừa tính được. So sánh với kết quả tìm
được ở câu trên.
c/ Trước khi lấy mẫu và phục hồi lý tưởng, tín hiệu được đi qua một bộ tiền lọc thông thấp. Tìm tín hiệu
sau khi phục hồi. Thông số của bộ lọc thông thấp như sau: bộ lọc có biên độ là 5 trong khoảng [0, f ]; suy

giảm 10xA (dB/octave) (10 lần A) trong khoảng (f, f ] và 30xA (dB/octave) trong khoảng (f, /); trong đó
f (KHz) = min (A,B,C,D) và f (KHz) = f + 5 . d/ Sử dụng matlab, vẽ phổ biên độ của bộ tiền lọc, phổ
biên độ của tín hiệu trước và sau khi đi qua bộ lọc.

e/ Lấy ABCD có giá trị như trên. Nếu số nào trong các số A, B, C, D có giá trị là 0 thìsinh viên tự
động cộng thêm 5 cho số đó. (Vd: A = 0 sẽ điều chỉnh thành A = 5). Nếu có 02 số có giá trị bằng
nhau thì tự động một số cộng thêm một số sao cho khác 3 số còn lại. Vd: 1056 => 1256 hoặc 1856 đều
được. Sắp xếp 4 số trên thành thứ tự từ nhỏ đến lớn, tạm gọi là DEFG.
Thiết kế 02 bộ lọc thông dải theo các yêu cầu sau (bộ lọc FIR sử dụng cửa sổ Kaiser và bộ lọc IRR
Chebyshev type II):

• Biên độ của dải thông dao động: G (dB) - G+3 (dB) (Vd G = 3 thì biên độ dải thông là 3 - 6dB).
• Biên độ của dải chắn cao nhất là: -15xD (dB) (Vd D = 3 thì biên độ dải chắn không vượt quá -
45dB).
• Cạnh dưới của dải chắn: fsa = Tĩ / G
• Cạnh dưới của dải thông: f = Tĩ / F
• Cạnh trên của dải thông: fpb = Tĩ / E
• Cạnh trên của dải chắn: f, = Tĩ / D

Tìm bậc của 02 bộ lọc này. Vẽ đáp ứng biên độ của 02 bộ lọc này. Tiến hành lọc tín hiệu x (t) với 02 bộ
lọc vừa thiết kết và vẽ hình so sánh kết quả đầu ra.

Ta có: ABCD = 1935 và DEFG = 1359


→ 𝑥(𝑡) = 5 cos(18𝜋𝑡) + 4 sin(6𝜋𝑡) + 3sin(10𝜋𝑡)

𝑓𝑆 = 𝑟𝑜𝑢𝑛𝑑(𝑚𝑒𝑎𝑛(9,3,5)) = 6 KHz

a) Phổ tín hiệu trước khi lấy mẫu:


5 3
𝑋(𝑓) = |𝛿(𝑓 + 9) + 𝛿 (𝑓 − 9)| + 2|𝛿(𝑓 + 3) − 𝛿(𝑓 − 3)| + |𝛿(𝑓 + 5) − 𝛿(𝑓 − 5)|
2 2
%Ve pho tin hieu truoc khi lay mau
f=[-9 -5 -3 0 3 5 9];
X=[2.5 1.5 2 0 2 1.5 2.5];
stem(f,X);
xlabel('Tan so f(kHz)');
ylabel('Bien do X(f)');
title('Pho bien do truoc khi lay mau');

Phổ tín hiệu sau khi lấy mẫu:


3
𝑋̂(𝑓) = 2|𝛿(𝑓 + 3) − 𝛿 (𝑓 − 3)| + 2 |𝛿(𝑓 + 5) − 𝛿 (𝑓 − 5)|

%Ve pho tin hieu truoc khi lay mau


f=[-5 -3 0 3 5];
X=[1.5 2 0 2 1.5];
stem(f,X);
xlabel('Tan so f(kHz)');
ylabel('Bien do X(f)');
title('Pho bien do sau khi lay mau');
b) Tính và vẽ phổ tín hiệu trước khi lấy mẫu:
%Pho tin hieu truoc khi lay mau
t=linspace(-20,20,210);
x=5*cos(18*pi*t)+4*sin(6*pi*t)+3*sin(10*pi*t);
X=fft(x);
phobiendo1=abs(X/210);
stem(phobiendo1);
phopha1=angle(X);
stem(phopha1);
Phổ biên độ trước khi lấy mẫu

Phổ pha trước khi lấy mẫu


TÀI LIỆU THAM KHẢO
Vinay K. Ingle & John G. Proakis, “ Digital signal using Matlab”,
https://research.iaun.ac.ir/pd/naghsh/pdfs/UploadFile_6417.pdf
https://www.mathworks.com

You might also like