Nhận xét: các kết quả trên MATLAB đúng so với tính toánBài 2: Xác định tính ổn định của các hệ thống sau.. Hãy: • Vẽ đáp ứng xung hn so sánh với kết quả tính bằng tay • Xác định các vect
Trang 1ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Hà Nội, 2025
Trang 2CHƯƠNG 4: HỆ THỐNG TUYẾN TÍNH BẤT BIẾN RỜI RẠCBài 1: Vẽ đáp ứng lối ra của hệ thống trong các trường hợp sau:
stem(n1, y1, 'filled');
title('Dap ung dau ra: x(n)={-1,-2,3,4,2,9}, h(n)={1,3,2,1}');
xlabel('n'); ylabel('y_1(n)'); grid on;
stem(n2, y2, 'filled');
title('Dap ung dau ra: x(n)={1,2,3,4,5}, h(n)={6,7,8,9}');
xlabel('n'); ylabel('y_2(n)'); grid on;
stem(ny3, y3, 'filled');
title('Dap ung dau ra: x(n)=(0.8)^n u(n), h(n)=(-0.9)^n u(n)');
xlabel('n'); ylabel('y_3(n)'); grid on;
stem(n_y4, y4, 'filled');
title('Dap ung dau ra: x(n)=4^n [u(n+1)-u(n-4)], h(n)=u(n)-u(n-5)');
xlabel('n'); ylabel('y_4(n)'); grid on;
Kết quả:
Trang 3Nhận xét: các kết quả trên MATLAB đúng so với tính toán
Bài 2: Xác định tính ổn định của các hệ thống sau Vẽ đồ thị biểu diễn đáp ứng xung Có thể rút ra kết luận gì?
Trang 4figure; stem(n3, h3, 'filled'); grid on;
title('h(n)=2 sin(0.01\pi n) cos(0.5\pi n)');
%% Truong hop 4: gia su causal
Bài 3: Xác định đáp ứng lối ra hệ thống TTBB trong các trường hợp sau:
• y(n) − 0.5y(n − 1) + 0.25y(n−2) = x(n) + 2x(n−1) + x(n−3) với x(n) = cos(n./3)u(n), y(−1) = 1 vày(−2) = 0.5
• y(n)−2y(n−1) + y(n−2) = x(n) + x(n−1) với x(n) = u(n), y(−1) = −1 và y(−2) = −2
Trang 5% Điều kiện ban đầu: y(-1)=1, y(-2)=0.5
% Dùng mảng dịch: index i corresponds to y(n) with n = i-3
y1_full = zeros( , N + 3); % positions: 1->y(-2), 2->y(-1), 3->y(0),
y1_full(1) = 0.5; % y(-2)
y1_full(2) = 1 % y(-1)
for n_idx = 0:N
idx = n_idx + 3; % index in y1_full for y(n)
y_nm1 = y1_full(idx- 1); % y(n-1)
y_nm2 = y1_full(idx- 2); % y(n-2)
stem(n, y1, 'filled'); grid on;
title('Đáp ứng hệ: Trường hợp 1'); xlabel('n'); ylabel('y_1(n)');
subplot( , , );
stem(n, y2, 'filled'); grid on;
title('Đáp ứng hệ: Trường hợp 2'); xlabel('n'); ylabel('y_2(n)');
%% - So sánh nghiệm đóng cho trường hợp
2 -y2_closed = n.^2 + 3*n + 1; % nghiệm đóng
figure;
stem(n, y2, 'filled'); hold on;
plot(n, y2_closed, 'r ', 'LineWidth',1.5);
grid on;
legend('Từ đệ quy','Nghiệm đóng n^2+3n+1');
title('So sánh: Trường hợp 2');
xlabel('n'); ylabel('y_2(n)');
Kết quả:
Trang 6Nhận xét: kết quả đầu ra giống với kết quả tính toán trực tiếp.
Bài 4: Cho hệ thống TTBB nhân quả có
H(z) = (z + 2)
(z − 0.5) Hãy:
• Vẽ đáp ứng xung h(n) (so sánh với kết quả tính bằng tay)
• Xác định các vector a, b
• Vẽ sơ đồ điểm cực, điểm không
• Hệ thống có ổn định không? Nếu có, xác định đáp ứng tần số và vẽ đáp ứng biên độ của hệ thống
• Vẽ đáp ứng lối ra nếu tín hiệu lối vào là x(n) = 2(0.9)nu(n)
imp = [1 zeros( , N)]; % delta[n]
h = filter(b, a, imp); % đáp ứng xung
Trang 7stem(n, h, 'filled'); hold on;
plot(n, h_theory, 'r ','LineWidth',1.5);
grid on;
legend('Tính bằng filter','Công thức tay');
title('So sánh đáp ứng xung');
stem(n_x, y, 'filled'); grid on;
title('Đáp ứng lối ra y(n) với x(n)=2(0.9)^n u(n)');
xlabel('n'); ylabel('y(n)');
Kết quả:
Trang 8Nhận xét: kết quả thu được giống với tính tay và hệ thống ổn định vì đồ thị cho thấy điểm cực nằm trong vòng
tròn đơn vị trong khi hệ thống là nhân quả
Bài 5: Cho hệ thống TTBB nhân quả có
y(n) − 4y(n − 1) + 3y(n − 2) = x(n) + x(n − 1)
Hãy:
• Vẽ đáp ứng xung h(n) (so sánh với kết quả tính bằng tay)
• Vẽ sơ đồ điểm cực, điểm không
• Hệ thống có ổn định không? Nếu có, xác định đáp ứng tần số và vẽ phổ biên độ của hệ thống
• Vẽ đáp ứng lối ra nếu tín hiệu lối vào là
x(n) = 2nu(n)
• Vẽ đáp ứng lối ra nếu tín hiệu lối vào là
x(n) = cos πn
3 u(n)
Trang 9stem(n, h, 'filled'); hold on;
plot(n, h_theory, 'r ','LineWidth',1.5);
legend('Tính bằng filter','Công thức tay');
title('So sánh đáp ứng xung');
plot(w, abs(H)); grid on;
title('|H(e^{j\omega})| (đáp ứng biên độ)');
xlabel('\omega (rad/sample)'); ylabel('|H|');
stem(n1, x1, 'filled'); hold on;
stem(n1, y1, 'filled');
stem(n2, x2, 'filled'); hold on;
stem(n2, y2, 'filled');
legend('x(n)=cos(\pi n/3)','y(n)');
title('Đáp ứng ra với x(n)=cos(\pi n/3)u(n)');
xlabel('n'); grid on;
Kết quả:
Trang 10Nhận xét: kết quả giống so với tính tay là hệ thống không ổn định vì có điểm cực nằm ngoài đường tròn đơn
vị như trên đồ thị trong khi hệ thống là nhân quả
Trang 11stem(n, h, 'filled'); grid on;
title('Đáp ứng xung h(n) = 2n+1'); xlabel('n'); ylabel('h(n)');
% 3 Vẽ |H(e^{j�})|
[H, w] = freqz(b, a, 512);
figure;
plot(w, abs(H)); grid on;
title('|H(e^{j\omega})|'); xlabel('\omega'); ylabel('|H|');
% 4 Input step u(n)
title('Output với x(n)=u(n)');
% 5 Input sinusoid 2*sin(0.01*pi*n)
n2 =-200:200;
x2 = 2*sin(0.01*pi*n2);
% vì hệ causal, chỉ dùng n>=0: shift và zero-pad
x2_pos = zeros(size(n2));
Trang 12Code MATLAB:
%% Tham số
N_h = 100;
N_y = 200;
Trang 13stem(n_h, h, 'filled'); grid on;
title('Đáp ứng xung h(n)'); xlabel('n'); ylabel('h(n)');
%% 2 Kiểm tra ổn định (vẽ cực-zero)
figure;
zplane(b, a); grid on;
title('Sơ đồ cực-zero của H(z)');
%% 3 Đáp ứng tần số |H(e^{j�})|
[H, w] = freqz(b, a, 512);
figure;
plot(w, abs(H)); grid on;
title('|H(e^{j\omega})|'); xlabel('\omega (rad/sample)'); ylabel('|H|');
%% 4 Tạo tín hiệu vào x(n)
plot(n_y, x_vals); grid on;
title('Tín hiệu vào x(n)');
xlabel('n'); ylabel('x(n)');
subplot( , , );
plot(n_y, y); grid on;
title('Đáp ứng ra y(n) với x(n) = [5+3cos(0.2\pi n)+4 sin(0.6\pi n)]u(n)');
xlabel('n'); ylabel('y(n)');
%% 6 (Tùy chọn) Tách từng thành phần bằng cách xử lý riêng
% Thành phần hứng với từng phần
x_const = 5*(n_y>=0); % 5u(n)
x_cos = 3*cos(0.2*pi*n_y).*(n_y>=0);
x_sin = 4*sin(0.6*pi*n_y).*(n_y>=0);
y_const = filter(b,a,x_const);
y_cos = filter(b,a,x_cos);
y_sin = filter(b,a,x_sin);
figure;
plot(n_y, y_const, 'LineWidth', ); hold on;
plot(n_y, y_cos, ' ', 'LineWidth', );
plot(n_y, y_sin, ':', 'LineWidth', );
legend('5u(n)','3cos(0.2\pi n)u(n)','4sin(0.6\pi n)u(n)');
title('Các thành phần đầu ra riêng biệt');
xlabel('n'); grid on;
Kết quả:
Trang 14Nhận xét: đáp ứng xung h(n) cho thấy hệ thống là nhân quả và đồ thị điểm cực-zero cho thấy các điểm cực
đều nằm trong đường tròn đơn vị nên hệ thống ổn định
Bài tập thêm: Cho hệ thống LTI nhân quả mô tả bởi phương trình sai phân:
y(n) = 0.3y(n − 1) − 0.2y(n − 5) + x(n) + 3x(n − 1) + x(n − 2) − 5x(n − 4)
1 Tính và vẽ đáp ứng xung của hệ thống với −100 ≤ n ≤ 100? Vẽ giản đồ điểm cực điểm không của hệthống? Có kết luận gì về tính chất của hệ thống?
2 Xác định đáp ứng đầu ra của hệ thống khi biết tín hiệu vào:
Trang 15stem(n,h_full,'filled'); grid on;
title('Đáp ứng xung h(n)'); xlabel('n'); ylabel('h(n)');
poles = roots(a);
disp('Cực của hệ:'); disp(poles);
if all(abs(poles)<1)
Trang 16Nhận xét: từ đồ thì h(n) cho thấy hệ thống là nhân quả , đồ thị cực- zero cho thấy tất cả các điểm cực đều
nằm trong đường tròn đơn vị nên hệ thống ổn định
CHƯƠNG 6: ỨNG DỤNG CỦA XỬ LÝ TÍN HIỆU TRONG TẠO HIỆU ỨNG ÂM THANH
Bài 1: Sử dụng Matlab/simulink thực hiện hiệu ứng tiếng vọng
1 Đọc file âm thanh bằnglệnh: Có thể lấy file âm thanh ở đây odonnellyougogirl.wav) [x, nellyougogirl.wav’) hoặc [x, fs]=audioread(’odonnellyougogirl.wav.wav’) [tuỳ theo versionMatlab] và kiểmtra giá trị tần số lấy mẫu fscủa nó bằng bao nhiêu?
fs]=wavread(’odon-2 Dùng lệnh sound để nghe file âm thanh trên
3 Cấu trúc trên dùng bộ trễ z−4000 Vậy tín hiệu phản xạ bị trễ so với tín hiệu gốc bao nhiêu?
4 Thực hiện trên code Matlab sử dụng mối quan hệ: y(n) = x(n) + alphax(n−D), tính lối ra tại thời điểm
n, alpha là hệ số suy hao, và D là độ trễ
Trang 175 Thực hiện lại trên Simulink và nghe thử âm thanh thu được.
6 Thay đổi giá trị của khối delay, nghe thử âm thanh lối ra
7 Hoàn thiện mô hình hiệu ứng echo với nhiều đường phản hồi hơn Dựa trên bảng tham số ở bên dưới, thiết
kế mô hình echo2 tương ứng Ghi lại kết quả và trình bày trong báo cáo kết quả như trên hình 6.3 Xác địnhhàm truyền H(z) của hệ thống Hệ thống có đáp ứng xung hữu hạn hay vô hạn Tính lại đáp ứng lối ra vớihàm truyền trên Nghe thử âm thanh thu được
8 Thử thu âm thanh lối vào dùng mic và hàm audio recorder và nghe thử âm thanh có echo tương ứng
Code MATLAB:
%% 1 Đọc file âm thanh
[x, fs] = audioread('audioclip1.wav');
% Kiểm tra tần số lấy mẫu
disp(['Tần số lấy mẫu của file âm thanh là: ',
disp(['Tín hiệu phản xạ bị trễ so với tín hiệu gốc ',
num2str(delay_time), ' giây']);
% Nghe tín hiệu phản xạ
sound(reflected_signal_delay, fs);
pause(length(x)/fs + 1);
%% 4 Công thức echo: y(n) = x(n) + alpha * x(n - D)
alpha = 0.6; % hệ số suy hao
y = x;
y(1+delay_samples:end) = x(1+delay_samples:end) + alpha * x(1 end-delay_samples);
% Nghe tín hiệu có echo
disp('Phát tín hiệu có echo với alpha=0.6 ');
sound(y, fs);
pause(length(y)/fs + 1);
%% 5 Thử nhiều giá trị delay và alpha
delays = [2000, 4000, 8000]; % số mẫu trễ
alphas = [0.3, 0.6, 0.9];
for d = 1 length(delays)
for a = 1 length(alphas)
delay_samples = delays(d);
alpha = alphas(a);
y = x;
y(1+delay_samples:end) = x(1+delay_samples:end) + alpha * x(1 end-delay_samples);
disp(['Echo với delay = ' num2str(delay_samples/fs) ' s, alpha = ' num2str(alpha)]);
Trang 18for i = 1 size(echo_params,1
delay_samples = round(echo_params(i 1 * fs);
pause(length(y)/fs + 1);
%% 7 Thu âm từ micro và thêm echo
recObj = audiorecorder(fs, 16, 1); % fs Hz, 16-bit, mono
disp('Bắt đầu thu âm 5 giây ');
recordblocking(recObj, 5);
disp('Kết thúc thu âm.');
myRecording = getaudiodata(recObj);
% Thêm echo đơn giản vào thu âm
delay_samples = round(0.3 * fs); % 0.3s trễ
alpha = 0.6;
y_rec = myRecording;
y_rec(1+delay_samples:end) = myRecording(1+delay_samples:end) + alpha * myRecording(1 end-delay_samples);
disp('Nghe lại tín hiệu thu âm có echo ');
sound(y_rec, fs);
Đọc file và kiểm tra tần số lấy mẫu ta có kết quả:
Trang 19Thực hiện chương trình cấu trúc trên dùng bộ trễ z−4000ta có kết quả thời gian trễ:
Trang 20Thực hiện trên code Matlab sử dụng mối quan hệ: y(n) = x(n) + alphax(n−D)
1 Kết quả sau khi chạy chương trình ta có thể nghe được sau một khoảng thời gian đúng với thời gian trễ cótiếng vọng lại với biên độ thấp hơn
Thực hiện lại trên Simulink và nghe thử âm thanh thu được.
Trang 21=> Kết quả: Khi nghe trong khoảng 10 giây ta có thể nghe được tiếng được vọng lại nhiều lần.
Thay đổi giá trị của khối delay, nghe thử âm thanh lối ra.
=> Kết quả: Khi ta tăng delay tiếng vọng sẽ đến muộn hơn, khi ta giảm giá trị delay tiếng vọng sẽ đến sớm hơn
Hoàn thiện mô hình hiệu ứng echo với nhiều đường phản hồi hơn Dựa trên bảng tham số ở bên dưới, thiết kế môhình echo2 tương ứng Ghi lại kết quả và trình bày trong báo cáo kết quả như trên hình 6.3 Xác định hàm truyềnH(z) của hệ thống Hệ thống có đáp ứng xung hữu hạn hay vô hạn Tính lại đáp ứng lối ra với hàm truyền trên
Nghe thử âm thanh thu được
SIGNAL DELAY GAIN Giá trị Dk (fs = 11025)
Delayed 1 1/6 5/6 16fs= 1837.5Delayed 2 1/3 2/3 13fs= 3675
Trang 22Bài 2:
1 Sử dụng Simulink, thực hiện sơ đồ mô phỏng hiệu ứng tiếng ngân như trên Hình 6.6
2 Sử dụng file âm thanh ’guitar1.wav’ cho bài mô phỏng Nghe thử âm thanh thu được
3 Cấu trúc trên dùng bộ trễ z−4000 Thử tăng/giảm giá trị của bộ trễ và nhận xét Việc chọn độ trễ có cần lưu
ý gì không?
4 Chuyện gì xảy ra nếu thay đổi Gain lớn hơn/nhỏ hơn/bằng1?
5 Tham số nào trong cấu trúc trên xác định thời gian âm thanh sẽ ”duy trì” sau khi bạn dừng tín hiệu đầu vào
disp(['Tín hiệu phản xạ bị trễ so với tín hiệu gốc ',
num2str(delay_time), ' giây']);
% Nghe tín hiệu phản xạ với giá trị trễ mặc định
sound(reflected_signal_delay, fs);
% Thay đổi giá trị trễ
new_delay_samples = 2000; % Giá trị mới
new_reflected_signal_delay = circshift(x, new_delay_samples);
% Nghe tín hiệu phản xạ với giá trị trễ mới
sound(new_reflected_signal_delay, fs);
% Thay đổi Gain
gain = 0.5; % Gain nhỏ hơn 1
reflected_signal_delay_low_gain = gain * reflected_signal_delay;
sound(reflected_signal_delay_low_gain, fs); % Nghe âm thanh với gain nhỏ hơn 1
gain = 2 % Gain lớn hơn 1
reflected_signal_delay_high_gain = gain * reflected_signal_delay;
sound(reflected_signal_delay_high_gain, fs); % Nghe âm thanh với gain lớn hơn 1
Sơ đồ Simulink:
Trang 23Sử dụng file âm thanh ’guitar1.wav’ cho bài mô phỏng Nghe thử âm thanh thu được:
1 Kết quả: Khi nghe ta nghe thấy tiếng đàn guitar gốc và một chuỗi tiếng lặp lại mờ dần
Nhận xét:
1 Thay đổi giá trị của bộ trễ sẽ ảnh hưởng đến thời điểm và cường độ của âm thanh phản xạ
2 Thay đổi gain sẽ ảnh hưởng đến cường độ của âm thanh phản xạ
3 Thời gian ”duy trì” của âm thanh sau khi dừng tín hiệu đầu vào hệ thống chủ yếu phụ thuộc vào độ dài của
bộ trễ Trong trường hợp này, tham số quan trọng là số lượng mẫu trong bộ trễ
Bài 3: Hoàn thiện mô hình hiệu ứng tiếng ngân với nhiều đường phản hồi hơn như hình 6.7 Thay đổi các âm thanh vào và nghe thử âm thanh có hiệu ứng tương ứng Sơ đồ kết nối:
Kết quả: Ta nghe được tiếng guitar mượt hơn so với bài 2 Nhận xét: Sự kết hợp của 3 chu kỳ trễ khác nhau
tạo ra một tiếng ngân có đuôi, phức tạp hơn, giống với âm thanh thực tế hơn
Trang 24Bài 4: Sau khi chạy mã ta có GUI:
Hiểu cơ bản về cấu trúc của Schoroeder Reverb: Cấu trúc bao gồm 2 phần chính:
1 Các bộ lọc lược song song( Parallel Comb Filters): Mục đích tạo ra các phản xạ ban đầu và sự kéo dài của
âm thanh => giống với cấu trúc của bài 3
2 Các bộ lọc thông toàn phần nối tiếp(Series All-Pass Filters): Tăng cường sự khuếch tán của âm thanh Tạomột đuôi ngân nghe mượt hơn, tạo sự chân thật
Thử các hiệu ứng trong GUI:
1 Room size(0.2), stereo width(0.8), wet/dry mix(0.3): Khi nghe ta thấy tiếng âm ngắn, tạo cảm giác như trongmột phòng ngủ nhiều đồ
2 Room size(0.95), stereo width(0.1), wet/dry mix(0.4): Khi nghe ta thấy tiếng ngân dài, vang vọng, giốngnhư ở trong không gian rộng
3 Room size(1), stereo width(0), wet/dry mix(1.0): Khi nghe âm thanh dường như trở nên đóng băng, ngânmãi, khác biệt so với âm thanh gốc