Digital Signal Processing Lab Book , Bui Thanh Hieu (Msc) Computer Engineering Department – University of Information Tẹchnology
Trang 1Bài 1: Dãy xung đơn vị và dãy nhảy bậc đơn vị
Dãy xung đơn vị:
≠
=
=
0 , 0
0 , 1 ] [
n
n n
δ
Dãy nhảy bậc đơn vị:
<
≥
=
0 , 0
0 , 1 ] [
n
n n
u
Dãy xung đơn vị δ[n] chiều dài N có thể được tạo thành bằng lệnh Matlab sau:
u = [1 zeros (1, N-1)];
Nếu δ[n] bị trễ M mẫu với M < N thì ta sử dụng lệnh:
ud = [zeros (1, M) 1 zeros (1, N -M -1)];
để tạo chuỗi δ[n−M]
Tương tự dãy nhảy bậc đơn vị u[n] chiều dài N được tạo bằng lệnh:
S = [ones (1, N)];
Hãy chạy chương trình P1-1 sau để tạo và vẽ chuỗi xung đơn vị
% Program P1_1
% Generation of a Unit Sample Sequence
clf;
% Generate a vector from -10 to 20
n = -10:20;
% Generate the unit sample sequence
u = [zeros(1,10) 1 zeros(1,20)];
% Plot the unit sample sequence
stem(n,u);
xlabel('Time index n');ylabel('Amplitude');
title('Unit Sample Sequence');
axis([-10 20 0 1.2]);
Câu hỏi:
1 Nêu công dụng của các lệnh clf, axis, title, xlabel, ylabel
2 Sử dụng chương trình P1-1 để viết chương trình tạo chuỗi xung đơn vị trễ
11 mẫu {δ[n−11] } Chạy chương trình đó
3 Tương tự viết chương trình tạo dãy nhảy bậc đơn vị u[n]
4 Viết chương trình tạo dãy nhảy bậc đơn vị sớm 7 mẫu u[n+7]
Bài 2: Biểu diễn tín hiệu hàm mũ
Dạng tín hiệu: x[n] = Aαn
Trong đó A và α là các số thực hoặc phức
Nếu A, α là các giá trị phức thì: α σ jω jφ
e
e( 0 0) , A= A
= +
Khi đó ta có:
) sin(
) cos(
]
[ = σ 0 + (ω 0 + φ) = σ 0 ω0 +φ + σ 0 ω0 +φ
n e
A j n
e A e
A n
Trang 2Chạy chương trình P1-2 và P1-3 dưới đây để tạo chuỗi hàm mũ phức và chuỗi hàm mũ thực
% Program P1_2
% Generation of a complex exponential sequence
clf;
c = -(1/12)+(pi/6)*i;
K = 2;
n = 0:40;
x = K*exp(c*n);
subplot(2,1,1);
stem(n,real(x));
xlabel('Time index n');ylabel('Amplitude');
title('Real part');
%axis([0 40 -5 5]);
subplot(2,1,2);
stem(n,imag(x));
xlabel('Time index n');ylabel('Amplitude');
title('Imaginary part');
% Program P1_3
% Generation of a real exponential sequence
clf;
n = 0:35; a = 1.2; K = 0.2;
x = K*a.^n;
stem(n,x);
xlabel('Time index n');ylabel('Amplitude');
Câu hỏi:
1 Trong chương trình P1_2 tham số nào điều khiển độ tăng hay giảm của chuỗi, tham số nào điều khiển biên độ của chuỗi?
2 Nếu c = (1/12) + (pi/6)*i thì đồ thị của chuỗi có gì thay đổi?
3 Nêu công dụng của các toán tử real và imag
4 Nêu công dụng của lệnh subplot
5 Trong chương trình P1-3 tham số nào điều khiển độ tăng hay giảm của chuỗi? Tham số nào điều khiển biên độ của chuỗi?
6 Nêu sự khác nhau giữa các toán tử số học ^ và ^
7 Chạy lại chương trình P1-3 với tham số a < 1 và K = 20 Rút ra kết luận gì?
8 Có thể dùng lệnh Matlab sum(s.*s) để tính năng lượng của chuỗi số thực s[n] Hãy dùng lệnh này để tính năng lượng của dãy x[n] trong chương trình P1_3 với a = 0.9 và K = 20
Trang 3Bài 3: Tín hiệu rời rạc dạng sin thực
Tín hiệu sin có dạng: x[n]= Acos(ω0n+φ)
Trong đó A, ω0, φ là các số thực
A: biên độ
0
ω : tần số góc
φ: góc pha ban đầu
Chạy chương trình P1-4 dưới đây để tạo dãy tín hiệu sin
% Program P1_4
% Generation of a sinusoidal sequence
n = 0:40;
f = 0.1;
phase = 0;
A = 1.5;
arg = 2*pi*f*n - phase;
x = A*cos(arg);
clf; % Clear old graph
stem(n,x); % Plot the generated sequence
axis([0 40 -2 2]);
grid;
title('Sinusoidal Sequence');
xlabel('Time index n');
ylabel('Amplitude');
axis;
Câu hỏi:
1 Trong chương trình tham số nào ứng với tần số, pha và biên độ của tín hiệu Tính chu kỳ của tín hiệu
2 Chiều dài của chuỗi bằng bao nhiêu và thay đổi nó bằng cách nào?
3 Nêu công dụng của lệnh axis và grid
4 Tính công suất trung bình của tín hiệu
5 Chạy lại chương trình P1-4 với f = 0.9 So sánh với tín hiệu ban đầu
6 Chạy lại chương trình P1-4 với chiều dài của chuỗi bằng 50, tần số 0.08, biên độ 2.5, dịch pha 900 Tính chu kỳ của tín hiệu
7 Thay thế lệnh stem trong chương trình P1-4 bằng lệnh plot Chạy lại chương trình
8 Tương tự, thay thế lệnh stem bằng lệnh stairs Chạy lại chương trình và nêu
sự khác nhau giữa 3 lệnh stem, plot, stairs
Trang 4Bài 4:Loại nhiễu ra khỏi tín hiệu
Xử lý tín hiệu số còn được ứng dụng để loại bỏ các thành phần nhiễu không mong muốn ra khỏi tín hiệu
Gọi s[n] là tín hiệu ban đầu (không bị ảnh hưởng bởi nhiễu)
Nếu tín hiệu này bị tác động bởi nhiễu ngẫu nhiên d[n] thì: x[n] = s[n] + d[n] là tín hiệu bị nhiễu
Tiến hành dịch chuyển x[n] đi một số mẫu xung quanh mẫu tại thời điểm n và lấy trung bình cộng các mẫu này ta sẽ thu được tín hiệu y[n] gần giống với tín hiệu s[n] ban đầu
Chương trình P1-5 sau sẽ minh hoạ cho thuật toán:
]) 1 [ ] [ ] 1 [ ( 3
1 ] [n = x n− +x n +x n+
y
% Program P1_5
% Signal Smoothing by Averaging
clf;
R = 51;
d = 0.8*(rand(R,1) - 0.5); % Generate random noise
m = 0:R-1;
s = 2*m.*(0.9.^m); % Generate uncorrupted signal
x = s + d'; % Generate noise corrupted signal
subplot(2,1,1);
plot(m,d','r-',m,s,'g ',m,x,'b-.');
xlabel('Time index n');ylabel('Amplitude');
legend('d[n] ','s[n] ','x[n] ');
x1 = [0 0 x];x2 = [0 x 0];x3 = [x 0 0];
y = (x1 + x2 + x3)/3;
subplot(2,1,2);
plot(m,y(2:R+1),'r-',m,s,'g ');
legend( 'y[n] ','s[n] ');
xlabel('Time index n');ylabel('Amplitude');
Câu hỏi:
1 Chạy chương trình trên
2 Có thể dùng công thức x = s + d để tạo ra tín hiệu nhiễu không? Nếu không hãy giải thích?
3 Nêu mối quan hệ giữa các tín hiệu x1 , x2 ,x3 với tín hiệu x
4 Nêu công dụng của lệnh legend
Bài 5: Các thao tác cơ bản trên tín hiệu rời rạc
Hãy gõ các đoạn lệnh sau trong chương trình Matlab, mỗi đoạn lệnh được lưu bằng một tên file khác nhau tương ứng là: sigshift.m sigfold.m sigadd.m conv_m.m
Trang 5function [y,n]=sigshift(x,m,n0)
%implement y(n)=x(n-n0)
n = m+n0; y = x;
% -
function [y,n] = sigfold(x,n)
%implement y(n)=x(-n)
y = fliplr(x);
n = -fliplr(n);
% -
function [y,n] = sigadd(x1,n1,x2,n2)
%implement y(n)=x1(n)+x2(n)
%[y,n] = sigadd(x1,n1,x2,n2)
%y = sum sequence over n, which includes n1 and n2
%x1 = first sequence over n1
%x2 = second sequence over n1 (n2 can be different from n1)
n = min(min(n1), min(n2)):max(max(n1),max(n2)); %duration of y(n)
y1 = zeros(1,length(n)); y2=y1; %initialization
y1(find((n>=min(n1))&(n<=max(n1))= =1))=x1; %x1 with duration of y1
y2(find((n>=min(n2))&(n<=max(n2))= =1))=x2; %x2 with duration of y2
y = y1+y2
% -
function [y,ny] = conv_m(x,nx,h,nh)
% [y,ny] = conv_m(x,nx,h,nh)
% [y,ny] = convolution result
% [x,nx] = first signal
% [h,nh] = second signal
nyb = nx(1)+nh(1);
nye = nx(length(x))+nh(length(h));
ny = [nyb:nye];
y = conv(x,h)
↑
=
n
x
Trang 6Xác định và vẽ các tín hiệu sau:
a x1(n) = 2x(n-5) - 3x(n+4)
b x2(n) = x(3-n) + x(n-2)
% Chương trình tính toán câu a
n = -2:10
x = [1:7,6:-1:1]
[x11,n11] = sigshift(x,n,5)
[x12,n12] = sigshift(x,n,-4)
[x1,n1] = sigadd(2*x11,n11,-3*x12,n12)
subplot(2,1,1)
stem(n1,x1)
title('Sequence in example a')
xlabel('n'); ylabel('x1(n)')
Câu hỏi
a.Chạy chương trình trên, xác định kết quả của chuỗi x1(n) Giải thích các bước thực hiện của chương trình
b.Tương tự, viết chương trình tính toán cho câu b
Bài 6:
Hệ thống tuyến tính bất biến được đặc trưng bởi phương trình sai phân tuyến tính
hệ số hằng có dạng:
] [ ]
[
0 0
k n x p k
n y d
M
k k N
k
∑
=
=
(2)
Trong đó x[n] và y[n] tương ứng là đầu vào và đầu ra của hệ thống {dk} và {pk}
là các hằng số
0 0
1 0
k n x d
p k
n y d
d n
y
M
k k N
k
−
=
=
Nếu biết x[n] và các điều kiện đầu y[n0 - 1], y[n0 -2], , y[n0 - N] ta sẽ tìm được
đáp ứng ra của hệ thống
Trong matlab sử dụng lệnh filter để mô phỏng hệ tuyến tính bất biến và nhân quả
được biểu diễn theo công thức (2) Nếu ký hiệu:
num = [p0 p1 pM]
Trang 7den = [d0 d1 dN] Thì lệnh y = filter (num, den, x) sẽ tạo một vector đầu ra y có chiều dài bằng với chiều dài của tín hiệu vào x khi các điều kiện đầu bằng 0 Nghĩa là:
y[-1] = y[-2] = = y[-N] = 0 Còn nếu dùng lệnh y = filter (num, den, x, ic) để tính đầu ra của hệ thống thì ic = [y[-1], y[-2], , y[-N]] là vector điều kiện ban đầu của hệ thống
Chương trình P2-1 dưới đây vẽ đáp ứng ra của hệ thống được cho bởi biểu thức:
y[n] =x[n]2 - x[n-1]x[n+1]
% Program P2_1
% Generate a sinusoidal input signal
clf;
n = 0:200;
x = cos(2*pi*0.05*n);
% Compute the output signal
x1 = [x 0 0]; % x1[n] = x[n+1]
x2 = [0 x 0]; % x2[n] = x[n]
x3 = [0 0 x]; % x3[n] = x[n-1]
y = x2.*x2-x1.*x3;
y = y(2:202);
% Plot the input and output signals
subplot(2,1,1)
plot(n, x)
xlabel('Time index n');ylabel('Amplitude');
title('Input Signal')
subplot(2,1,2)
plot(n,y)
xlabel('Time index n');ylabel('Amplitude');
title('Output signal');
Câu hỏi:
1 Chạy chương trình trên
2 Sử dụng các tín hiệu sin với tần số khác nhau làm tín hiệu đầu vào và tính
đáp ứng ra của hệ thống Đáp ứng ra phụ thuộc như thế nào vào tần số của
tín hiệu vào ?
3 Nếu x[n] = sin(ω0n ) + K, tính đáp ứng ra y[n] của hệ thống
Bài 7: Hệ thống tuyến tính và không tuyến tính
Cho: y[n]- 0.4y[n-1] + 0.75y[n-2] = 2.2403x[n] + 2.4908x[n-1] + 2.2403x[n-2] (3)
Trang 8Chương trình P2-2 dưới đây sử dụng 3 chuỗi tín hiệu vào khác nhau x1[n], x2[n],
và x[n] = a.x1[n] + b.x2[n] để tính và vẽ các đáp ứng ra tương ứng y1[n], y2[n] và y[n]
% Program P2_2
% Generate the input sequences
clf;
n = 0:40;
a = 2;b = -3;
x1 = cos(2*pi*0.1*n);
x2 = cos(2*pi*0.4*n);
x = a*x1 + b*x2;
num = [2.2403 2.4908 2.2403];
den = [1 -0.4 0.75];
ic = [0 0]; % Set zero initial conditions
y1 = filter(num,den,x1,ic); % Compute the output y1[n]
y2 = filter(num,den,x2,ic); % Compute the output y2[n]
y = filter(num,den,x,ic); % Compute the output y[n]
yt = a*y1 + b*y2;
d = y - yt; % Compute the difference output d[n]
% Plot the outputs and the difference signal
subplot(3,1,1)
stem(n,y);
ylabel('Amplitude');
title('Output Due to Weighted Input: a \cdot x_{1}[n] + b
\cdot x_{2}[n]');
subplot(3,1,2)
stem(n,yt);
ylabel('Amplitude');
title('Weighted Output: a \cdot y_{1}[n] + b \cdot y_{2}[n]');
subplot(3,1,3)
stem(n,d);
xlabel('Time index n');ylabel('Amplitude');
title('Difference Signal');
Câu hỏi:
1 Chạy chương trình trên và so sánh y[n] với yt[n] Hệ thống này có tuyến tính không ?
2 Chạy lại chương trình với giá trị khác nhau của các hệ số a, b và tần số của tín hiệu vào
3 Chạy lại chương trình với điều kiện đầu khác 0 và kiểm tra xem hệ thống
có tuyến tính hay không?
4 Sửa lại chương trình P2-2 để tính đầu ra y1[n], y2[n] và y[n] của hệ thống
được cho bởi: y[n] = x[n]x[n-1]
So sánh y[n] với yt[n] Hệ thống này có tuyến tính không?
Trang 9Bài 8: Xác định đáp ứng xung của hệ thống LTI
% Program P2_3
% Compute the impulse response y
clf;
N = 40;
num = [2.2403 2.4908 2.2403];
den = [1 -0.4 0.75];
y = impz(num,den,N);
% Plot the impulse response
stem(y);
xlabel('Time index n'); ylabel('Amplitude');
title('Impulse Response'); grid;
Câu hỏi:
1 Chạy chương trình trên để tạo đáp ứng xung của hệ thống được mô tả bởi phương trình (3)
2 Sửa lại chương trình để phát ra 45 mẫu đáp ứng xung đầu tiên của hệ thống LTI nhân quả sau:
y[n] + 0.7y[n-1] - 0.46y[n-2] - 0.62y[n-3] = 0.9x[n] - 0.45x[n-1] + 0.35x[n-2] + 0.002x[n-3]
Bài 9: Hệ bất biến và không bất biến
Chương trình P2_4 dưới đây mô phỏng cho hệ thống được biểu diễn bởi công thức (3) Đầu tiên tạo ra 2 tín hiệu vào khác nhau x[n] và x[n-D], sau đó tính
và vẽ các tín hiệu ra tương ứng y1[n], y2[n] và tín hiệu sai khác y1[n] - y2[n+D]
% Program P2_4
% Generate the input sequences
clf;
n = 0:40; D = 10;a = 3.0;b = -2;
x = a*cos(2*pi*0.1*n) + b*cos(2*pi*0.4*n);
xd = [zeros(1,D) x];
num = [2.2403 2.4908 2.2403];
den = [1 -0.4 0.75];
ic = [0 0]; % Set initial conditions
% Compute the output y[n]
y = filter(num,den,x,ic);
% Compute the output yd[n]
yd = filter(num,den,xd,ic);
% Compute the difference output d[n]
d = y - yd(1+D:41+D);
% Plot the outputs
subplot(3,1,1)
Trang 10stem(n,y);
ylabel('Amplitude');
title('Output y[n]'); grid;
subplot(3,1,2)
stem(n,yd(1:41));
ylabel('Amplitude');
title(['Output due to Delayed Input x[n Ð', num2str(D),']']); grid;
subplot(3,1,3)
stem(n,d);
xlabel('Time index n'); ylabel('Amplitude');
title('Difference Signal'); grid;
Câu hỏi:
1 Chạy chương trình trên và so sánh y[n] và yd[n-10] Hệ thống trên có bất biến không?
2 Lặp lại câu hỏi 1 khi điều kiện ban đầu ic khác 0
3 Tương tự hãy viết chương trình để mô phỏng cho hệ thống
y[n] = nx[n] + x[n-1]
Hệ thống trên có phải là hệ bất biến?
Bài 10: Tổng chập
−∞
=
∞
−∞
=
−
=
−
=
k x k n h k
n x k h n
Để tính tổng chập trong matlab sử dụng lệnh conv
% Program P2_5
clf;
h = [3 2 1 -2 1 0 -4 0 3]; % impulse response
x = [1 -2 3 -4 3 2 1]; % input sequence
y = conv(h,x);
n = 0:14;
subplot(2,1,1);
stem(n,y);
xlabel('Time index n'); ylabel('Amplitude');
title('Output Obtained by Convolution'); grid;
x1 = [x zeros(1,8)];
y1 = filter(h,1,x1);
subplot(2,1,2);
stem(n,y1);
xlabel('Time index n'); ylabel('Amplitude');
title('Output Generated by Filtering'); grid;
Câu hỏi:
1 Chạy chương trình trên So sánh y[n] và y1[n]
Trang 112 Hãy giải thích lý do vì sao phải tạo tín hiệu x1[n] bằng cách thêm các mẫu
0 sau x[n] làm tín hiệu vào để tính y1[n] bằng lệnh filter?
3 Tương tự, viết chương trình tính tổng chập của đáp ứng xung h[n] có chiều dài bằng 15 và tín hiệu vào x[n] có chiều dài bằng 10
Bài 11: Hệ ổn định
Một hệ thống LTI được gọi là ổn định khi và chỉ khi đáp ứng xung của hệ thổng thoã mãn điều kiện:
∞
<
∑∞
−∞
=
n
n
h ][
% Program P2_6
% Stability test based on the sum of the absolute
% values of the impulse response samples
clf;
num = [1 -0.8]; den = [1 1.5 0.9];
N = 200;
h = impz(num,den,N+1);
parsum = 0;
for k = 1:N+1;
parsum = parsum + abs(h(k));
if abs(h(k)) < 10^(-6), break, end
end
% Plot the impulse response
n = 0:N;
stem(n,h)
xlabel('Time index n'); ylabel('Amplitude');
% Print the value of abs(h(k))
disp('Value =');disp(abs(h(k)));
Câu hỏi:
1 Chạy chương trình để tính đáp ứng xung của hệ thống
2 Nêu công dụng của lệnh for và end
3 Nêu công dụng của lệnh break
4 Hệ thống có ổn định không?
5 Viết chương trình để tìm đáp ứng xung của hệ thống
y[n] = x[n] -4x[n-1] +3x[n-2] +1.7y[n-1]- y[n-2]
Hệ thống này có ổn định không?
Bài 12: Ghép nối tiếp các hệ LTI
Trang 12Trong thực tế các hệ thống LTI nhân quả bậc cao có thể được thực hiện bằng cách ghép nối tiếp các hệ thống LTI nhân quả bậc thấp hơn (thường là bậc 2) Ví dụ hệ thống rời rạc bậc 4 sau
y[n] + 1.6y[n-1] + 2.28y[n-2] + 1.325y[n-3] + 0.68y[n-4]
= 0.06x[n] - 0.19x[n-1] + 0.27x[n-2] - 0.26x[n-3] + 0.12x[n-4]
có thể được thực hiện bằng cách ghép nối tiếp 2 hệ thống rời rạc bậc 2
sys 1 : y1[n] + 0.9y1[n-1] + 0.8y1[n-2] = 0.3x[n] - 0.3x[n-1] + 0.4x[n-2]
sys 2 : y2[n] + 0.7y2[n-1] + 0.85y2[n-2] = 0.2y1[n] - 0.5y1[n-1] + 0.3y1[n-2]
Chương trình P2_7 mô phỏng hệ thống bậc 4 và hệ thống nối tiếp hai hệ thống bậc 2 Trong chương trình này x[n], y[n] tương ứng là tín hiệu vào và ra của
hệ thống bậc 4 Sau đó sử dụng x[n] này làm tín hiệu vào cho hệ thống bậc 2 thứ nhất và tìm đáp ứng ra y1[n] Tiếp đến sử dụng y1[n] làm tín hiệu vào cho hệ thống bậc 2 thứ hai và tìm đáp ứng ra y2[n]
% Program P2_7
% Cascade Realization
clf;
x = [1 zeros(1,40)]; % Generate the input
n = 0:40;
% Coefficients of 4th order system
den = [1 1.6 2.28 1.325 0.68];
num = [0.06 -0.19 0.27 -0.26 0.12];
% Compute the output of 4th order system
y = filter(num,den,x);
% Coefficients of the two 2nd order systems
num1 = [0.3 -0.2 0.4];den1 = [1 0.9 0.8];
num2 = [0.2 -0.5 0.3];den2 = [1 0.7 0.85];
% Output y1[n] of the first stage in the cascade
y1 = filter(num1,den1,x);
% Output y2[n] of the second stage in the cascade
y2 = filter(num2,den2,y1);
% Difference between y[n] and y2[n]
d = y - y2;
% Plot output and difference signals
subplot(3,1,1);
stem(n,y);
ylabel('Amplitude');
title('Output of 4th order Realization'); grid;
subplot(3,1,2);
stem(n,y2)
ylabel('Amplitude');