Tải bản đầy đủ (.docx) (28 trang)

Bài tập lớn tín hiệu và lọc số

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (333.26 KB, 28 trang )

Project 1:basic signals
EX1: Basic Signals-Impulses

a)Chúng ta tạo các xung tín hiệu trong MATLAB bằng cách lập hàm sau đây:
function [ ] = new_impulse(A,n0,n1,n2 )
nn=n1:n2;
imp=zeros(n2-n1+1,1);
imp(n0-n1+1)=A;
stem(nn,imp)
end
Sau đó sử dụng đoạn mã sau đây để tạo các dạng tín hiệu được yêu cầu:
>> new_impulse(0.9,5,1,20)
% ung voi xung x[1]=0.9 δ[n-5] trong khoang 1 ≤ n ≤ 20
>> new_impulse(0.8,0,-15,15)
% ung voi xung x[2]=0.8 δ[n] trong khoang -15 ≤ n ≤ 15
>> new_impulse(1.5,333,300,350)
% ung voi xung x[3]=1.5 δ[n-333] trong khoang 300 ≤ n ≤ 350
>> new_impulse(4.5,-7,-10,0)
% ung voi xung x[4]=4.5 δ[n+7] trong khoang -10 ≤ n ≤ 0
Ta có kết quả ở trang sau:

xung x[1]=0.9 δ[n-5] trong khoảng 1 ≤ n ≤ 20

xung x[2]=0.8 δ[n] trong khoảng -15 ≤ n ≤ 15


xung x[3]=1.5 δ[n-333] trong khoảng 300 ≤ n ≤ 350 xung x[4]=4.5 δ[n+7] trong khoảng -10 ≤ n ≤ 0

Nhận xét: -Ta sử dụng 2 vector nn và imp để tạo tín hiệu rời rạc và vẽ đồ thị.Trong
hàm new_impulse ta có 4 tham số vào là A(độ lớn của xung ), n0 (vị trí của xung
trong dãy) , n1,n2(điểm bắt đầu và điểm kết thúc quá trình tạo xung ).Phải chú ý


trong thực hiện lập trình vì imp bắt đầu từ 1 đến (n2-n1+1) trong khi nn bắt đầu
từ 0 đến (n2-n1) để khi thức hiện không có lỗi.Trong phần này ta không sử dụng
hàm title để dán nhãn chú tích cho mỗi hình vẽ do MATLAB không in ra kí hiệu δ
mà ta sử dụng.
Ví dụ:
>>title(‘Tin hieu x[1]=0.9 δ[n-5]’);
??? >>title(‘Tin hieu x[1]=0.9 [n-5]’);
|
Error: Unexpected MATLAB operator.
b)Tín hiệu rời rạc có dạng (1.1) theo giả thiết đề bài là tín hiệu tuần hoàn có chu kì
P=5, có chiều dài PM= 50 , bắt đầu từ n=0, kết thúc tại n=49 . Để tạo tín hiệu trên
ta sử dụng đoạn mã:
>> x=[1;0;0;0;0]*ones(1,10); % tao vector co do dai 50, co gia tri x(n)=1 o cac
diem n=5*l
>> x=x(:);
>> nn=0:49;
>> stem(nn,x);
Ta có kết quả như sau:


Nhận xét:
Dựa vào đồ thị ta thấy có 10 xung trong chuỗi tín hiệu rời rạc hữu hạn tương ứng
với các giá trị của l =(0...9). Ta tạo ra tín hiệu trên bằng 2 vector nn và x.Trong đó
x được xây dựng bằng cách nối tiếp nhau 10 lần 1 vector có dạng [1;0;0;0;0] .Đây
là cách làm hiệu quả khi ta đã hiểu rõ được bản chất của tín hiệu.Tuy nhiên có 1
cách làm khác là sử dụng 1 vòng for như sau:
>>nn=0:49;
>>x=zeros(50,1); %ma tran 50 hang,1 cot
>>for i=0:1:9
x(5*i+1)=1;%tao cac xung

>>end
Stem(nn,x)
Ta cũng đạt được kết quả tương tự
c)Ta sử dụng đoạn mã trong ví dụ:
x=[0;1;1;0;0;0]*ones(1,7);
x=x( : );
size(x)
ans =


42 1
stem(x);
Ta có đồ thị:

Dựa vào đồ thị thu được ta có thể xây dựng công thức dạng (1.1) như sau:
Nhật xét: -Đây chính là tổng của hai dãy tín hiệu thành phần s1(n) và s2(n) có dạng
công thức như (1.1).
Trong đó s1(n) =
s2(n) =


EX2: Basic Signals-Sinusoids

a)Chúng ta tạo các tín hiệu hình sin rời rạc trong MATLAB bằng cách lập hàm sau
đây:
function [ ] = new_sin( A,omega0,phi,n1,n2 )
nn=n1:n2;
sinx=A*sin(omega0*nn+phi);
stem(nn,sinx);
end

sau đó sử dụng đoạn mã:
>> new_sin(1,pi/17,0,0,25)
>> title('x[1]=sin(pi/17*n)');
>> new_sin(1,pi/17,0,-15,15)
>> title('x[2]=sin(pi/17*n)');
>> new_sin(1,3*pi,pi/2,-10,10)
>> title('x[3]=sin(3*pi*n+pi/2)');
>>new_sin(1,pi/sqrtm(23),pi/2,0,50)%ta doi tu dang cos sang dang sin de ve
duoc bang ham new_sin vua xay dung bang cach thay pha ban dau tu 0 thanh
pi/2
>> title('x[4]=cos(pi/sqrt(23)*n)');
Nhận xét:


Ta xây dựng hàm tạo chuỗi hình sin rời rạc có các giá trị đầu vào là biên độ A, tần
số góc omega0, pha ban đầu phi và các giá trị bắt đầu và kết thúc n1 và n2. Khi gọi
hàm sẽ tự động vẽ đồ thị của tín hiệu.Sau đó ta gán cho mỗi đồ thị 1 tên riêng dựa
vào lệnh title

Ta có kết quả:

Dựa vào đồ thị ta thấy ta có thể biểu diễn x[3](n) không theo công thức dạng
lượng giác do:
sin(3*π*n+ π/2) = sin(3* π*n)*cos(π/2)+cos(3*π*n)*sin(π/2) = cos(3* π*n) = ±1
phụ thuộc vào n


Đó là tổng của 2 chuỗi xung có chu kì P là 2,có độ dài tương ứng lần lượt là 21 và
19.
Cụ thể , công thức đưa ra có dạng:

b)Dựa vào hàm số đã xây dựng ở trên bao gồm 5 tham số: biên độ A, tần số góc
omega,pha ban đầu ɸ và 2 vị trí bắt đầu và kết thúc tín hiệu.Ta chính sửa 1 số cấu
trúc trong đoạn mã để hàm sau khi thức hiện trả về các giá trị là vector chứa các
giá trị của sóng hình sin(thêm sinx,nn vào sau function để hàm trả về vector
sinx).Thử với tín hiệu rời rạc 2*sin(π*n/11) với n từ -20 đến 20.Ta có kết quả sau:
function [sinx,nn ] = new_sin(A,omega0,phi,n1,n2 )
nn=n1:n2;
sinx=A*sin(omega0*nn+phi);
stem(nn,sinx);
end
>> new_sin(2,pi/11,0,-20,20)
ans =
Columns 1 through 9
1.0813 1.5115 1.8193 1.9796 1.9796 1.8193 1.5115 1.0813 0.5635
Columns 10 through 18
-0.0000 -0.5635 -1.0813 -1.5115 -1.8193 -1.9796 -1.9796 -1.8193 -1.5115
Columns 19 through 27
-1.0813 -0.5635
0 0.5635 1.0813 1.5115 1.8193 1.9796 1.9796
Columns 28 through 36
1.8193 1.5115 1.0813 0.5635 0.0000 -0.5635 -1.0813 -1.5115 -1.8193
Columns 37 through 41
-1.9796 -1.9796 -1.8193 -1.5115 -1.0813


EX3: Sampled Sinusoids

a)Ta có các công thức tín hiệu sin s(t) và tín hiệu sau khi lấy mẫu s[n]:
S(t)=A *cos(2*π*f0*t+ɸ)
S[n] = s(t)|t=n*T = A*cos (2*π*f0/fs*n+ɸ)

Đây chính là quá trình lấy mẫu tín hiệu , hay là việc nhân tín hiệu cần lấy mẫu với 1
xung dirac có chu kì là Te . Ta lập hàm lấy mẫu tín hiệu hình sin có các tham số:
biên độ A, tần số của tín hiệu hình sin,tần số của xung lấy mẫu tslm ,pha ban đầu
ɸ và 2 thời gian bắt đầu và kết thúc quá trình lấy mẫu.
function [sintg] = lay_mau_th( A,tsm,phi,t1,t2,tslm )
temptg=t1:1/tslm:t2; % chia theo cac moc don vi theo thoi gian voi buoc nhay
1/tslm
sintg=A*cos(2*pi*tsm*temptg+phi)
stem(temptg,sintg);
end
Sử dụng đoạn mã sau ta có kết quả là các giá trị của tín hiệu tại các thời điểm lấy
mẫu(thời gian lấy mẫu chuyển về đơn vị giây,do vậy ta để tần số lấy mẫu ở đơn vị
Hz):
>> lay_mau_th(50,1200,pi/4,0,7*10^-3,8000)
sin_lay_mau =
Columns 1 through 9
35.3553 -7.8217 -44.5503 -44.5503 -7.8217 35.3553 49.3844 22.6995 -22.6995


Columns 10 through 18
-49.3844 -35.3553 7.8217 44.5503 44.5503 7.8217 -35.3553 -49.3844 -22.6995
Columns 19 through 27
22.6995 49.3844 35.3553 -7.8217 -44.5503 -44.5503 -7.8217 35.3553 49.3844
Columns 28 through 36
22.6995 -22.6995 -49.3844 -35.3553 7.8217 44.5503 44.5503 7.8217 -35.3553
Columns 37 through 45
-49.3844 -22.6995 22.6995 49.3844 35.3553 -7.8217 -44.5503 -44.5503 -7.8217
Columns 46 through 54
35.3553 49.3844 22.6995 -22.6995 -49.3844 -35.3553 7.8217 44.5503 44.5503
Columns 55 through 57

7.8217 -35.3553 -49.3844

Ta lập 1 hàm tương tự nhưng tham số ban đầu ta thay thời gian lấy mẫu t bằng
tham số n của t=nT. Hàm trả về là các điểm lấy mẫu.
function [nn_lay_mau] = lay_mau_th( A,tsm,phi,t1,t2,tslm )
nn_lay_mau=(t1*tslm):(t2*tslm);
sin_lay_mau=A*cos(2*pi*tsm*nn_lay_mau/tslm+phi);
stem(nn_lay_mau,sin_lay_mau);
end
Sau khi thay đổi hàm lấy mẫu:
>> lay_mau_th(50,1200,pi/4,0,7*10^-3,8000)
ans =
Columns 1 through 15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Columns 16 through 30
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
Columns 31 through 45
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
Columns 46 through 57
45 46 47 48 49 50 51 52 53 54 55 56

Ta có đồ thị ở trang sau.


Ta nhận thấy chiều dài của tín hiệu lấy mẫu là 57, bao gồm 8 chu kì hoàn chỉnh.


b)Lấy mẫu 1 tín hiệu cosin với thời gian lấy mẫu =n+3/4*T ,khi = 1/T ta có biến
đổi:
y[n]=A*cos(ω* (n+3/4*T)+ɸ) = A*cos(ω*n+ ω*3/4*T+ɸ)



y[n]= A*cos(ω*n+3/4*T*2*π/T+ɸ) = A*cos(ω*n+π/2 +π+ɸ )
Vậy y[n]= -A*sin(2*π*n/T+π+ɸ) = A*sin(2*π*n/T+ɸ)

Vậy với = 1/T ta có tín hiệu lấy mẫu là 1 hàm sin với chu kì T đã chọn.
Sử dụng hàm lay_mau_th đã viết ở phần a, ta sử dụng các tham số đầu vào như
sau: A=50 , =n+3/4*T(ms) vậy từ đó ta tính được f( lấy mẫu) = 1/1(ms) =
1/10^3(s) = 1000 Hz,chọn T=0.1s ,vậy f(tín hiệu) =1 /T= 10Hz ,chọn khoảng thời
gian theo n: 0 ≤ n ≤ 200 (ms)  Starting time =0+3/4*T = 0.075s , ending time =
200(ms) +3/4*T = 0.275 s
Sử dụng đoạn mã sau:
>>lay_mau_th (50,10,0,0.075,0.275,1000);
Ta có đồ thị kết quả:

Nhận xét:
Đồ thị tín hiệu theo thời gian(s).Ta thấy đồ thị hình sin tương ứng với kết quả tính
toán vừa tính toán ở phần đầu.

EX4:Basic Signals-Exponentials


a)Ta sử dụng đoạn mã theo mẫu để xây dựng tín hiệu rời rạc suy giảm theo hàm
mũ có dạng trong đoạn 0...20(có độ dài là 21)
function y = genexp(b,n0,L);
if( L<=0)
error (‘GENEXP: length not positive’)
end
nn=n0 + [1:L] ‘ -1;
y=b.^nn;

end
>>genexp(0.9,0,21)
Ta có đồ thị kết quả:

Đồ thị đã thể hiện rõ 1 tín hiệu rời rạc suy giảm theo hàm mũ.

b) Công thức toán học tính tổng của 1 chuỗi lũy thừa:
( a≠1)
(1.2)
Để so sánh công thức (1.2) và giá trị tổng của các xung trong phần a ta sử dụng
đoạn mã:


Ta xây dựng lại hàm genexp như sau để tiện tính toán tổng: hàm trả về biến tong
là tổng của các giá trị tín hiệu tại các điểm n=(1,2,....,L+1) trong tín hiệu rời rạc vừa
xây dựng, phương pháp tính toán là sử dụng 1 vòng for. Đầu vào bao gồm cơ số b,
điểm bắt đầu n0 và đồ dài L:
function [tong ] = genexp( b,n0,L)
nn=n0:1:(n0+L-1);
for i=n0:1:(n0+L-1)
hm(i-n0+1)=b^i;
end
stem(nn,hm);
tong=0; %tinh tong cua cac gia tri
for i=1:1:L
tong=tong+hm(i);
end
end
sau đó với đoạn mã:
>>genexp (0.9,0,21)

ans =
8.9058
>> (1-0.9^21)/(1-0.9)
ans =
8.9058
Ta thấy kết quả là khá chính xác và giống nhau theo 2 cách tính: 1 cách theo công
thức 1.2 và cách ta tính tổng toàn bộ giá trị của các xung trong dãy tín hiệu tạo bởi
genexp .

c) So sánh 2 vector y(2:L) và a*y(1:L-1) ta xác nhận được sự chính xác của công
thức :
y[n]=a*y[n-1] over the range 1 ≤ n ≤L-1 (1.3)
Lý do 1 dãy tín hiệu dạng mũ được tìm thấy thường xuyên trong DSP là thời gian
khi bị dịch chuyển không làm thay đổi tín hiệu.Do đó 1 tín hiệu mũ rời rạc tỏa mãn
quan hệ dịch chuyển như công thức (1.3)
Ta lấy dữ liệu đầu vào của phần trước: b=0.9 , L=21


Ta sử dụng đoạn mã:
%ve y(2:21): chieu dai la 21,bat dau tu 2
>> genexp(0.9,2,21)
%ve a*y(1:20): chieu dai la 20,bat dau tu 1
>> nn=1:1:20;
>>for i=1:1:20
hm(i)=0.9*0.9^i;
>>end
>>stem(nn,hm);
Ta có kết quả là đồ thị ở trang sau
Nhận xét:
Cả 2 đồ thị trên có hình dáng tương tự nhau, 1 đồ thị bắt đầu từ n=1, đồ thị còn

lại bắt đầu từ n=2. Qua đó chúng ta kiểm chứng được nhận xét ban đầu của đề
bài.

Đồ thị kết quả:


Cách 1: sử dụng đoãn mã phía trên

Cách 2: sử dụng genexp
d)Ta sử dụng hàm filter thay vì xây dựng hàm genexp đã xây dựng để tạo dãy tín
hiệu rời rạc suy giảm theo hàm mũ ở phần trước với việc sử dụng công thức đệ
quy: y[n]-a*y[n-1]=x[n] và điều kiện ban đầu y[-1]=0


Cách sử dụng hàm lọc dữ liệu filter:
=>Trong SIGNAL PROCESSING TOOLBOX, hàm y =filter(b,a,x) lọc dữ liệu trong
vector x với bộ lọc mô tả bởi các vectơ a và b, tạo ra dữ liệu y đã lọc. Cấu trúc lọc
là bộ lọc dãy tổng quát mô tả bởi phương trình vi phân:
y(n) = b(1)x(n) + b(2)x(n-1) + ... + b(nb)x(n-nb+1) - a(2)y(n-1) - ... -a(na)y(n-na+1)
hoặc tương đương phép biến đổi Z:

=
Ta viết 1 hàm sử dụng filter ,dự kiện vào bao gồm cơ số u, điểm bắt đầu n0 và
điểm kết thúc n1:
function [ham_mu ] = ham_filter( u,n0,n1)
b=[1];
a=[1,-u];
for i=(n0+1):1:(n1+1)
x(i)=0;
x(1)=1;

end
nn=0:(n1-n0);
ham_mu=filter(b,a,x);
stem(nn,ham_mu);
end
Để sử dụng hàm trên,ta có đoạn mã:
ham_filter(0.9,0,20)
ans =
Columns 1 through 9
1.0000 0.9000 0.8100 0.7290 0.6561 0.5905 0.5314 0.4783 0.4305
Columns 10 through 18
0.3874 0.3487 0.3138 0.2824 0.2542 0.2288 0.2059 0.1853 0.1668
Columns 19 through 21
0.1501 0.1351 0.1216

Ta có kết quả là đồ thị:


Nhận xét:
-Sử dụng hàm filter, ta có kết quả tương tự như dãy tín hiệu đã tạo bằng hàm
genexp ở phần trước.
-Ta sử dụng hàm filter trong bài này do công thức đệ quy y[n] -a*y[n-1]=x[n]
tương ứng với bộ lọc được mô tả bởi phương trình sử dụng trong hàm trên(xem
cách sử dụng ở trên) có thể tạo ra được tín hiệu rời rạc theo yêu cầu đề bài:
y[-1]=0
y[0]= x[0]=1
y[1]=a
y[2]=a^2
.....................
y[n]=a^n


PROJECT 2 : COMPLEX-VALUED SIGNALS
EX 1:Complex Exponentials


a)Để biểu diễn tín hiệu phức theo công thức Euler :==*(cos(θ*n)+j*sin(θ*n))
Ta xây dựng hàm như sau:
function [ ] = ham_phuc( r,phi,n1,n2)
nn=n1:n2;
for i=1:1:(n2-n1+1)
xx(i)=(r^nn(i))*(cos(phi*nn(i))+1i*sin(phi*nn(i)));% cong thuc Euler.
end
subplot(211)
stem(nn,real(xx))
title('REAL PART')
subplot(212)
stem(nn,imag(xx))
title('IMAG PART')
end
Áp dụng với z=(0.9 ,π/4) với chiều dài xung 0≤n≤20.Ta sử dụng đoạn mã:
ham_phuc(0.9,pi/4,0,20)
Ta có kết quả:=> đồ thị bao gồm 2 phần, phần thực và phần ảo của tín hiệu.

b)Để vẽ đồ thị hàm số của phần ảo đối với phần thực , ta sử dụng hàm sau, áp
dụng với z=(0.9 ,π/4) ,chiều dài xung 0≤n≤20 :
function [ ] = ham_xoan_oc( r,phi,n1,n2)
nn=n1:n2;
for i=1:1:(n2-n1+1)



xx(i)=(r^nn(i))*(cos(phi*nn(i))+1i*sin(phi*nn(i)));
end
stem(imag(xx),real(xx))
title('IMAG VERSUS REAL')
end
>> ham_xoan_oc(0.9,pi/4,0,20)

Ta có đồ thị như hình vẽ, tuy nhiên đồ thị chưa thể hiện rõ được hình xoắn ốc như
yêu cầu bài toán, ta hiệu chỉnh các giá trị r và θ như sau: z=(0.9 ,π/10) ,chiều dài
xung 0≤n≤100.Ta sử dụng đoạn mã sau:
>> ham_xoan_oc(0.9,pi/10,0,100)
Ta có đồ thị kết quả rõ ràng hơn:


Nhận xét:đồ thị đã thể hiện rõ ràng được hàm xoắn ốc theo yêu cầu đề bài

c)Để thể hiện rõ hơn 1 tín hiệu phức,có đầy đủ pha ban đầu,biên độ, ta sử dụng
công thức thứ 2:
==*(cos(θ*n+ɸ)+j*sin(θ*n+ɸ))
Với G=A* A là biên độ, là pha ban đầu.


Áp dụng với 4 xung hình sin được yêu cầu,ta sử dụng đoạn mã cùng với hàm được
xây dựng bởi hàm exp như sau:
function [ xx ] = new_ham_phuc_o( A,r,ro,phi,n1,n2)
nn=n1:n2;
for i=1:1:(n2-n1+1)
xx(i)=A*exp(1j*phi)*exp(1j*nn(i)*ro)*(r^nn(i));
end
end

Với tín hiệu sin ta biểu diễn bằng phần ảo của tín hiệu phức, còn tín hiệu cos ta sử
dụng phần thực.
>> nn=0:20;
>> subplot(211)
>> stem(nn,imag(new_ham_phuc_o(3,1,pi/7,0,0,20)))
>> title('REAL PART')
>> %ta vua ve phan thuc cua tin hieu: 3*sin(pi/7*n) + 4*j*cos(pi/7*n)
>> subplot(212)
>> stem(nn,real(new_ham_phuc_o(4,1,pi/7,0,0,20)))
>> title('IMAG PART')
>>%ta vua ve phan ao cua tin hieu: 3*sin(pi/7*n) + 4*j*cos(pi/7*n)
>> nn=-15:25;
>> stem(nn,imag(new_ham_phuc_o(1,1,pi/17,0,-15,25)))
>>% ta vua ve tin hieu: sin(pi/17*n)
>> nn=0:50;
>> stem(nn,real(new_ham_phuc_o(1,1.1,pi/11,pi/4,0,50)))
>>%ta vua ve tin hieu:1.1^n*cos(pi/11*n+pi/4)
>>nn=-10:20;
>> stem(nn,real(new_ham_phuc_o(1,0.9,pi/11,0,-10,20)))
>>%ta vua ve tin hieu: 0.9^n *cos(pi/11*n)
Đồ thị kết quả:




d)Trong phần này ta sẽ xây dựng tín hiệu phức sử dụng hàm filter, với cách sử
dụng tương tự đã nêu ở phần trên, nhưng với hệ số a phức. Ta dựa vào công thức
đệ quy :
y[n]=*y[n-1]+x[n]
Hay : y[n]=r*exp(j*θ)*y[n-1]+x[n]

với các giá trị đầu vào x[n] = G*δ[n] = A*exp(j*ɸ) δ[n] .
Ta xây dựng hàm sau:
function [th_phuc ] = th_phuc_filter( A,r,omega0,phi,n1,n2 )
b=[1];
a=[1,-r*(cos(omega0)+1j*sin(omega0))];
temp=zeros(n2-n1+1,1);
temp(1)=A*(cos(phi)+1j*sin(phi));
th_phuc=filter(b,a,temp);
end
Sau đó ta sử dụng đoạn mã:
%tao bang ham filter
>> nn=0:50;
>> subplot(211)
>> stem(nn,real(th_phuc_filter(1,1.1,pi/11,pi/4,0,50)));
>> title('REAL PART BY FILTER')
>> subplot(212)
>> stem(nn,imag(th_phuc_filter(1,1.1,pi/11,pi/4,0,50)));
>> title('IMAG PART BY FILTER')
>>% tao lai bang ham mu
>>for i=0:1:50
ham_mu(i+1)=(1.1^i)*exp(j*(pi/11*i+pi/4));
end
>> subplot(211)
>> stem(nn,real(ham_mu))
>> title('REAL PART BY EXP')
>> subplot(212)
>> stem(nn,imag(ham_mu))
>> title('IMAG PART BY EXP')
Đồ thị kết quả:



Nhận xét:
Dựa vào đồ thị ta thấy cách xây dựng tín hiệu phức theo cách thông thường( hàm
exp) và theo cách sử dụng bộ lọc ( hàm filter) cho kết quả hoàn toàn giống nhau.


×