VIETNAM NATIONAL UNIVERSITY, HANOI UNIVERSITY OF ENGINEERING AND TECHNOLOGY Báo cáo thực hành Họ và tên: Phạm Đức Đạt Msv: 20020646 Môn học: Xử lý tín hiệu số 1 MỤC LỤC Chương 1 LÀM QUEN VỚI NGÔN NGỮ LẬP TRÌNH MATLAB ............................ 6 A. Lý Thuyết....................................................................................................................... 6 1.1 Giới thiệu chung .......................................................................................... 6 1.2 Giao diện sử dụng của Matlab ...................................................................... 6 1.3 Biến số trong Matlab ................................................................................... 7 1.4 Vector và ma trận ........................................................................................ 8 1.5 Phép toán .................................................................................................... 8 1.6 Cấu trúc điều khiển và cấu trúc lặp .............................................................. 9 1.6.1 Cấu trúc điều kiện: ................................................................................ 9 1.6.2 Cấu trúc lặp: ......................................................................................... 9 1.7 Function và script ........................................................................................ 9 1.8 I/O và File I/O ........................................................................................... 10 1.9 Đồ thị ........................................................................................................ 11 B. Bài Tập ......................................................................................................................... 11 Chương 2 BIỂU DIỄN VÀ PHÂN TÍCH TÍN HIỆU TRONG MIỀN THỜI GIAN VÀ MIỀN TẦN SỐ .......................................................................................................... 15 A. Lý Thuyết..................................................................................................................... 15 2.1 Tín hiệu cơ bản .......................................................................................... 15 2.1.1 Tín hiệu rời rạc .................................................................................... 15 2.1.2 Tín hiệu liên tục ................................................................................... 16 2.2 Các phép toán trên tín hiệu ........................................................................ 16 2.2.1 Phép toán không phụ thuộc vào biến thời gian:...................................... 16 2.2.2 Phép toán phụ thuộc vào biến thời gian: ................................................ 17 2.3 Tín hiệu trong miền tần số.......................................................................... 17 B. Bài tập .......................................................................................................................... 18 Chương 3 LẤY MẪU TÍN HIỆU ................................................................................... 28 A. Lý Thuyết..................................................................................................................... 28 2 3.1 Lý thuyết lấy mẫu tín hiệu ......................................................................... 28 3.1.1 Định lý lấy mẫu Nyquist ....................................................................... 28 3.2 Lấy mẫu tín hiệu âm thanh ..................................................................... 29 B. Bài tập .......................................................................................................................... 30 Chương 4 HỆ THỐNG TUYẾN TÍNH BẤT BIẾN RỜI RẠC ................................... 32 A. Lý Thuyết..................................................................................................................... 32 4.1 Hệ thống tuyến tính bất biến ...................................................................... 32 4.2 Đáp ứng xung ............................................................................................ 32 4.2.1 Tính chất của hệ thống ......................................................................... 32 4.2.2 Xác định đáp ứng lối ra của hệ thống .................................................... 33 4.3 Phương trình sai phân và hàm truyền ......................................................... 33 4.3.1 Xác định đáp ứng lối ra của hệ thống .................................................... 33 4.3.2 Xác định đáp ứng xung của hệ thống..................................................... 33 4.3.3 Hàm truyền và giản đồ điểm cực điểm không ........................................ 34 4.4 Đáp ứng tần số .......................................................................................... 34 4.4.1 Đáp ứng tần số của hệ thống ................................................................. 34 4.4.2 Ý nghĩa của đáp ứng tần số ................................................................... 34 4.4.3 Ứng dụng của đáp ứng tần số ............................................................... 34 B. Bài tập .......................................................................................................................... 35 Chương 5 THIẾT KẾ CẤU TRÚC HỆ THỐNG ......................................................... 44 A. Lý Thuyết..................................................................................................................... 44 5.1 Cấu trúc hệ thống ...................................................................................... 44 5.2 Cấu trúc nối tiếp và cấu trúc song song ....................................................... 45 5.2.1 Thiết kế cấu trúc tối ưu kiểu nối tiếp ..................................................... 45 5.2.2 Thiết kế cấu trúc tối ưu kiểu song song .................................................. 45 B. Bài tập .......................................................................................................................... 46 Chương 6 ỨNG DỤNG CỦA XỬ LÝ TÍN HIỆU TRONG TẠO HIỆU ỨNG ÂM THANH............................................................................................................................. 48 A. Lý Thuyết..................................................................................................................... 48 6.1 Âm thanh .................................................................................................. 48 3 6.2 Tiếng vọng (Echo) ...................................................................................... 48 6.3 Tiếng ngân (Reverberation)........................................................................ 48 6.4 Chipmunks ............................................................................................... 49 6.5 Optimus Primes ......................................................................................... 49 Chương 7 THIẾT KẾ BỘ LỌC SỐ IIR, FIR ............................................................... 50 A. Lý Thuyết..................................................................................................................... 50 7.1 Bộ lọc số .................................................................................................... 50 7.2 Lọc IIR ..................................................................................................... 50 7.3 fdatool và fvtool ......................................................................................... 51 7.4 Thiết kế bộ lọc số FIR ................................................................................ 51 7.4.1 Thiết kế sử dụng phương pháp cửa số ................................................... 52 7.4.2 Chuyển đổi giữa các bộ lọc ................................................................... 52 B. Bài tập .......................................................................................................................... 52 Chương 8 XỬ LÝ TIẾNG NÓI ...................................................................................... 57 A. Lý Thuyết..................................................................................................................... 57 8.1 Tiếng nói - Speech ...................................................................................... 57 8.2 Thu tiếng nói ............................................................................................. 57 8.3 Đặc điểm của tiếng nói ............................................................................... 57 8.4 Loại nhiễu trong file âm thanh ................................................................... 57 Chương 9 LỌC NHIỄU VÀ PHÁT HIỆN TÍN HIỆU ĐIỆN TIM BẤT THƯỜNG . 59 A. Lý Thuyết..................................................................................................................... 59 9.1.2 Hình thái học của tín hiệu điện tim .......................................................... 59 9.1.3 Nhiễu trong ECG .................................................................................... 60 9.1.4 Rối loạn nhịp tim (Arrhythmia) ............................................................... 60 Chương 10 XỬ LÝ ẢNH ................................................................................................. 61 A. Lý Thuyết..................................................................................................................... 61 10.1 Hiển thị ảnh và chuyển đổi giữa các kênh mầu khác nhau .......................... 61 10.1.1 Đọc và hiển thị ảnh ............................................................................. 61 10.1.2 Chuyển đổi ảnh trong các không gian mầu (colorspace) ....................... 61 4 10.2 Độ phân giải ảnh ...................................................................................... 62 10.3 Toán tử trong ảnh .................................................................................... 62 10.4 Miền tần số .............................................................................................. 62 B. Bài tập .......................................................................................................................... 62 5 Chương 1 LÀM QUEN VỚI NGÔN NGỮ LẬP TRÌNH MATLAB A. Lý Thuyết 1.1 Giới thiệu chung 1.2 Giao diện sử dụng của Matlab • Cửa sổ lệnh (Command Window): là nơi bạn gõ lệnh Matlab. • Cửa sổ thư mục đường dẫn (Current Directory): là thư mục hiện tại Matlab đang làm việc với các file trong đó. • Cửa sổ lịch sử lệnh (Command History): cho thấy các lệnh mà bạn đã nhập trong quá khứ. Bạn có thể lặp lại bất kỳ lệnh nào bằng cách kích đúp vào chúng, hoặc bằng cách kéo chúng từ cửa sổ Command History vào cửa sổ lệnh. • Cửa sổ hiển thị giá trị biến/tham số (Workspace): cho thấy danh sách các biến hiện đang được định nghĩa, và thuộc tính của biến (giá trị, kích thước biến,...). 6 • Trợ giúp (Help): đưa ra thông tin về các hàm số, cách sử dụng hàm số, ví dụ mô phỏng dùng hàm đó. Có thể gọi trợ giúp nhanh bằng Shift F1 hoặc trên cửa sổ lệnh gõ doc + tên hàm hoặc help + tên hàm. 1.3 Biến số trong Matlab Matlab khác với các ngôn ngữ C là các biến số không cần khai báo trước định dạng. Tuỳ vào giá trị khởi tạo mà biến có thể là số (scalar), vector/matrix hay chuỗi (string), cấu trúc (struct, list) hoặc cell. 7 1.4 Vector và ma trận • Trong MATLAB, ma trận là kiểu dữ liệu đặc biệt cho phép tính toán nhanh và hiệu quả. • Ma trận có thể được khai báo trực tiếp thông qua gán giá trị. Các ma trận nhiều chiều có thể được tạo từ các ma trận có số chiều thấp hơn. Có các lệnh như ones, zeros, eye, rand, randn để khởi tạo ma trận đặc biệt. • Các phần tử của ma trận được gán chỉ số bắt đầu từ 1 và kết thúc bằng 'end'. Để truy cập một phần tử tại hàng i, cột j của ma trận A, sử dụng lệnh A(i, j). • Dấu ':' được sử dụng trong khai báo vector, dãy số, trích xuất chỉ số của ma trận và trong các vòng lặp. Nếu ':' đứng một mình, nghĩa là tất cả hàng (hoặc cột) của ma trận. • Thường không sử dụng vòng lặp mà thay vào đó sử dụng chỉ số và các hàm tính toán có sẵn để tối ưu thời gian tính toán khi làm việc với ma trận trong MATLAB. 1.5 Phép toán 1. Phép toán số học: Đây là các phép tính cơ bản được thực hiện trên các số hoặc vector/ma trận số. Bao gồm cộng, trừ, nhân, chia và các phép toán khác như mũ, căn bậc hai, logarit,... 2. Phép toán quan hệ: Được sử dụng trong các lệnh điều kiện để so sánh giá trị của các biến. Các phép toán này bao gồm bằng nhau (==), khác nhau (~=), lớn hơn (>), nhỏ hơn (<), lớn hơn hoặc bằng (>=), nhỏ hơn hoặc bằng (<=),... 3. Phép toán logic và phép toán trên bit: Bao gồm các phép toán logic như AND, OR, XOR, NOT và các phép toán bitwise như AND bit (bitwise AND), OR bit (bitwise OR), XOR bit (bitwise XOR),... 8 4. Phép toán trên tập hợp: Các phép toán này được sử dụng để thực hiện các thao tác trên các tập hợp dữ liệu. Bao gồm hợp (union), giao (intersection), phần tử không thuộc (set difference),... 1.6 Cấu trúc điều khiển và cấu trúc lặp 1.6.1 Cấu trúc điều kiện: • Có ba loại cấu trúc điều kiện chính: if, if-else và if-elseif-else. • Cấu trúc if được sử dụng để kiểm tra một điều kiện duy nhất. • Cấu trúc if-else được sử dụng để kiểm tra một điều kiện, nếu điều kiện đó không đúng thì thực hiện một tập hợp lệnh khác. • Cấu trúc if-elseif-else cho phép kiểm tra nhiều điều kiện tuần tự cho đến khi một điều kiện đúng được tìm thấy. • Luôn cần có end để đóng mỗi cấu trúc điều kiện. 1.6.2 Cấu trúc lặp: • Có hai loại cấu trúc lặp chính: for và while. • Cấu trúc for được sử dụng để lặp qua một tập hợp các giá trị hoặc một khoảng cụ thể. • Cấu trúc while được sử dụng để lặp lại một tập hợp lệnh cho đến khi một điều kiện cụ thể không còn đúng nữa. • Luôn cần có end để đóng mỗi cấu trúc lặp. 1.7 Function và script Function (Hàm): • Trong MATLAB, một hàm là một tập hợp các câu lệnh được tổ chức lại thành một khối logic để thực hiện một nhiệm vụ cụ thể. 9 • Hàm được định nghĩa bằng từ khóa function, sau đó là tên hàm và danh sách các đối số nếu có. • Một hàm có thể trả về một giá trị hoặc không trả về giá trị nào. • Hàm có thể được gọi từ bất kỳ nơi nào trong chương trình bằng cách sử dụng tên của nó và truyền các đối số cần thiết. Script (Kịch bản): • Một script trong MATLAB là một tập hợp các câu lệnh MATLAB được thực thi tuần tự từ đầu đến cuối. • Script không nhận đối số đầu vào và không trả về giá trị. • Script thường được sử dụng để thực hiện một loạt các thao tác hoặc tính toán mà không cần tạo ra một hàm riêng biệt. • Khi script được chạy, MATLAB thực hiện các câu lệnh trong script theo thứ tự xuất hiện. 1.8 I/O và File I/O • Để nhập dữ liệu từ bàn phím và xuất dữ liệu ra màn hình trong MATLAB, bạn có thể sử dụng các hàm liên quan đến Input/Output (I/O). Đồng thời, bạn cũng có thể tuỳ chỉnh kiểu hiển thị của dữ liệu dựa trên định dạng format. • Khi bạn muốn làm việc với các file văn bản trong MATLAB, bạn có thể sử dụng các lệnh liên quan đến Input/Output như fopen, fclose, fscanf, fprintf, fgetl, fget, fwrite, v.v. để mở, đọc, và ghi vào các file. • Đối với các file có định dạng đặc biệt như file âm thanh, file hình ảnh, video, bạn cần sử dụng các hàm từ các thư viện đặc biệt để mở và làm việc với chúng. • Khi bạn muốn lưu trữ hoặc ghi dữ liệu ra file trong MATLAB, bạn có thể sử dụng lệnh save hoặc dlmwrite. 10 1.9 Đồ thị • MATLAB là một công cụ mạnh mẽ cho việc vẽ và hiển thị dữ liệu trong các đồ thị 2D và 3D. • Lệnh cơ bản nhất để vẽ đồ thị 2D là plot(x, y, 'color symbol style'), trong đó x là giá trị trục hoành của đồ thị và y là giá trị trục tung. • Bạn cũng có thể vẽ nhiều đường trên cùng một đồ thị bằng cách sử dụng plot(x, y1, x, y2). • Để vẽ trên một hình mới hoặc vẽ trên cùng một hình, bạn có thể sử dụng figure hoặc hold on. • Để vẽ nhiều hình con trong một hình lớn, bạn có thể sử dụng subplot, xác định tổng số hình con và vị trí của hình vẽ trong grid. • Bạn có thể tùy chỉnh màu sắc và kiểu của các đường trong đồ thị bằng cách sử dụng các tham số thuộc tính 'color symbol style'. • Các lệnh vẽ đồ thị cơ bản như plot, scatter, bar, histogram, và surf là những công cụ quan trọng để hiển thị dữ liệu một cách trực quan và dễ hiểu. B. Bài Tập 1. Tạo một vector hàng, có chiều dài bằng 50, giá trị tăng dần từ 15, cách đều nhau 3 % Tạo vector hàng vector = 15:3:(15 + 3*(50-1)); % Hiển thị vector disp(vector); 2. Tạo một vector cột có chiều dài 20, giá trị giảm dần từ 100, cách đều 2 % Tạo vector cột vector = (100:-2:(100 - 2*(20-1)))'; % Hiển thị vector 11 disp(vector); 3. Tạo một ma trận vuông ngẫu nhiên kích thước bằng 10 × 10; hàng chéo toàn bằng 0 % Tạo ma trận vuông ngẫu nhiên kích thước 10x10 matrix = rand(10); % Thiết lập các phần tử trên đường chéo chính bằng 0 matrix(1:11:end) = 0; % Hiển thị ma trận disp(matrix); 4. Viết hàm số tìm vị trí của thành phần min, max của một ma trận kích thước bất kỳ[ trả về tất cả các vị trí thoả mãn] function [minPositions, maxPositions] = findMinMaxPositions(matrix) % Tìm giá trị nhỏ nhất và lớn nhất trong ma trận minValue = min(matrix(:)); maxValue = max(matrix(:)); % Tìm các vị trí của giá trị nhỏ nhất [minRows, minCols] = find(matrix == minValue); minPositions = [minRows, minCols]; % Tìm các vị trí của giá trị lớn nhất [maxRows, maxCols] = find(matrix == maxValue); maxPositions = [maxRows, maxCols]; end 12 5. Viết hàm số vẽ đường y = x 2 , với x =[-10, 10], y = sin(0.2 ∗ π ∗ x) ; x=[-2:2], y = e x , x=[-10:10] sử dụng subplot và các mầu sắc, loại đường khác nhau. function plot_functions() % Tạo các vector x và y cho các biểu đồ khác nhau % y = x^2 với x = [-10, 10] x1 = -10:0.1:10; y1 = x1.^2; % y = sin(0.2 * π * x) với x = [-2:2] x2 = -2:0.1:2; y2 = sin(0.2 * pi * x2); % y = e^x với x = [-10:10] x3 = -10:1:10; y3 = exp(x3); % Vẽ các biểu đồ sử dụng subplot figure; % Biểu đồ y = x^2 subplot(3, 1, 1); % Chia cửa sổ hiện tại thành lưới 3x1, và chọn ô thứ nhất plot(x1, y1, 'r', 'LineWidth', 2); % Vẽ đường màu đỏ, độ dày đường 2 title('y = x^2'); xlabel('x'); ylabel('y'); grid on; 13 % Biểu đồ y = sin(0.2 * π * x) subplot(3, 1, 2); % Chia cửa sổ hiện tại thành lưới 3x1, và chọn ô thứ hai plot(x2, y2, 'b--', 'LineWidth', 2); % Vẽ đường màu xanh, đường nét đứt, độ dày đường 2 title('y = sin(0.2 * π * x)'); xlabel('x'); ylabel('y'); grid on; % Biểu đồ y = e^x subplot(3, 1, 3); % Chia cửa sổ hiện tại thành lưới 3x1, và chọn ô thứ ba plot(x3, y3, 'g:', 'LineWidth', 2); % Vẽ đường màu xanh lá, đường chấm, độ dày đường 2 title('y = e^x'); xlabel('x'); ylabel('y'); grid on; end 14 Chương 2 BIỂU DIỄN VÀ PHÂN TÍCH TÍN HIỆU TRONG MIỀN THỜI GIAN VÀ MIỀN TẦN SỐ A. Lý Thuyết 2.1 Tín hiệu cơ bản Trong lĩnh vực xử lý tín hiệu, các tín hiệu cơ bản là những khái niệm cơ bản và quan trọng để hiểu về tính chất và xử lý của tín hiệu. Có hai loại chính của tín hiệu cơ bản: tín hiệu rời rạc và tín hiệu liên tục. 2.1.1 Tín hiệu rời rạc Tín hiệu rời rạc là loại tín hiệu mà giá trị chỉ được xác định tại các điểm rời rạc trên trục thời gian, tức là giá trị của tín hiệu chỉ tồn tại tại các điểm thời gian cố định. Các giá trị của tín hiệu rời rạc thường được biểu diễn bằng các số nguyên hoặc số thực. Đặc điểm của tín hiệu rời rạc: 15 • Giá trị chỉ xác định tại các điểm thời gian rời rạc. • Thường được biểu diễn bằng dãy các số hoặc một tập hợp giá trị cố định. • Có thể được biểu diễn bằng biểu đồ dạng đoạn thẳng (đối với tín hiệu 1D) hoặc bản đồ màu sắc (đối với tín hiệu 2D). Ví dụ về tín hiệu rời rạc bao gồm tín hiệu số được sử dụng trong hệ thống số, tín hiệu từ các cảm biến kỹ thuật số, hoặc các tín hiệu được mô phỏng trên máy tính. 2.1.2 Tín hiệu liên tục Tín hiệu liên tục là loại tín hiệu mà giá trị của nó được xác định tại mọi điểm trong một khoảng thời gian liên tục. Điều này có nghĩa là tín hiệu không bị giới hạn trong các giá trị rời rạc trên trục thời gian, mà thay vào đó nó là một hàm liên tục. Đặc điểm của tín hiệu liên tục: • Giá trị của tín hiệu được xác định cho mọi giá trị của thời gian trong một khoảng liên tục. • Thường được biểu diễn bằng các phương trình hoặc hàm số. • Có thể có vô hạn giá trị trong một khoảng thời gian nhất định. Ví dụ về tín hiệu liên tục bao gồm tín hiệu âm thanh, tín hiệu video, hoặc các tín hiệu vật lý như sóng điện từ được phát ra từ các thiết bị truyền thông. 2.2 Các phép toán trên tín hiệu Trong xử lý tín hiệu, các phép toán đóng vai trò quan trọng trong việc biến đổi, xử lý và phân tích tín hiệu. Các phép toán này có thể được phân loại thành hai loại chính: phép toán không phụ thuộc vào biến thời gian và phép toán phụ thuộc vào biến thời gian. 2.2.1 Phép toán không phụ thuộc vào biến thời gian: Phép toán không phụ thuộc vào biến thời gian là những phép toán mà kết quả không thay đổi theo thời gian. Điều này có nghĩa là kết quả của phép toán không phụ thuộc vào biến thời gian không bị ảnh hưởng bởi sự thay đổi trong thời gian. Một số phép toán không phụ thuộc vào biến thời gian bao gồm: • Biến đổi Fourier: Chuyển đổi một tín hiệu từ miền thời gian sang miền tần số, giúp phân tích thành phần tần số của tín hiệu. 16 • Phép toán convolution: Là phép toán toán học thực hiện trên hai tín hiệu để tạo ra một tín hiệu mới, thường được sử dụng trong việc xử lý tín hiệu và lọc tín hiệu. 2.2.2 Phép toán phụ thuộc vào biến thời gian: Phép toán phụ thuộc vào biến thời gian là những phép toán mà kết quả thay đổi theo thời gian. Điều này có nghĩa là kết quả của phép toán này phụ thuộc vào biến thời gian, và có thể thay đổi khi biến thời gian thay đổi. Một số phép toán phụ thuộc vào biến thời gian bao gồm: • Sự khác biệt (Differentiation): Tính toán đạo hàm của một tín hiệu, đo lường sự thay đổi của tín hiệu theo thời gian. • Tích phân (Integration): Tính toán tích phân của một tín hiệu, tính tổng diện tích dưới đường cong của tín hiệu theo thời gian. Cả hai loại phép toán này đều đóng vai trò quan trọng trong việc phân tích và xử lý tín hiệu trong nhiều ứng dụng khác nhau, từ xử lý âm thanh và hình ảnh đến truyền thông và điện tử. 2.3 Tín hiệu trong miền tần số Tín hiệu trong miền tần số là biểu diễn của tín hiệu không theo thời gian mà theo tần số. Thay vì mô tả tín hiệu dựa trên biến thời gian, tín hiệu trong miền tần số cho phép chúng ta nhìn vào thành phần tần số của tín hiệu, tức là các thành phần tần số khác nhau có trong tín hiệu và cách chúng tương tác với nhau. Đặc điểm của tín hiệu trong miền tần số: 1. Biến đổi Fourier (Fourier Transform): Là một công cụ quan trọng trong phân tích tín hiệu trong miền tần số. Biến đổi Fourier chuyển đổi tín hiệu từ miền thời gian sang miền tần số, biểu diễn các thành phần tần số của tín hiệu và mức độ đóng góp của chúng. 2. Biến đổi Fourier ngược (Inverse Fourier Transform): Ngược lại với biến đổi Fourier, biến đổi Fourier ngược chuyển đổi tín hiệu từ miền tần số sang miền thời gian. Điều này cho phép chúng ta tái tạo tín hiệu gốc từ các thành phần tần số được biểu diễn. 17 3. Biến đổi Laplace: Là một công cụ mở rộng của biến đổi Fourier, được sử dụng đặc biệt trong phân tích và điều khiển hệ thống tín hiệu liên tục và hệ thống động. Biến đổi Laplace cho phép phân tích cả tần số và độ phản hồi của hệ thống. 4. Phổ tín hiệu (Spectral Analysis): Là quá trình phân tích thành phần tần số của một tín hiệu và đánh giá mức độ mà mỗi thành phần tần số đóng góp vào tín hiệu tổng thể. Tín hiệu trong miền tần số cho phép nhìn vào cấu trúc tần số của tín hiệu, giúp chúng ta hiểu rõ hơn về các tính chất và đặc điểm của tín hiệu. Việc phân tích và xử lý tín hiệu trong miền tần số là một phần quan trọng của nhiều lĩnh vực như xử lý âm thanh, xử lý hình ảnh, truyền thông và điện tử. B. Bài tập 1. Viết chương trình tạo xung nhảy bậc unit-signal u(n-n0), xung chữ nhật r(n-n0) rec_sig(n, n0) và vẽ tín hiệu u(n − 3) và r(2, 4). % Khởi tạo các thông số n = -10:10; % Dãy giá trị của n, từ -10 đến 10 n0_u = 3; % Giá trị n0 cho xung nhảy bậc n0_r = 2; % Giá trị bắt đầu cho xung chữ nhật width_r = 4; % Độ rộng của xung chữ nhật % Tạo tín hiệu xung nhảy bậc u(n-n0) unit_step_signal = double(n >= n0_u); % Tạo tín hiệu xung chữ nhật r(n-n0) rect_signal = double((n >= n0_r) & (n < n0_r + width_r)); % Vẽ tín hiệu u(n-3) figure; subplot(2, 1, 1); 18 stem(n, unit_step_signal, 'filled'); title('Tín hiệu u(n-3)'); xlabel('n'); ylabel('u(n-3)'); grid on; % Vẽ tín hiệu r(2, 4) subplot(2, 1, 2); stem(n, rect_signal, 'filled'); title('Tín hiệu r(2, 4)'); xlabel('n'); ylabel('r(2, 4)'); grid on; % Hiển thị hình vẽ sgtitle('Tín hiệu u(n-3) và r(2, 4)'); 19 2. Viết chương trình vẽ tín hiệu liên tục sau: • sinc(t) • e −t • xung chữ nhật tuần hoàn chu kỳ T=2, biên độ bằng 1. • x(t) = sin(πt/3 + pi/4) + 2cos(πt/4) % Khởi tạo trục thời gian t = -10:0.01:10; % Định nghĩa hàm sinc thủ công sinc_manual = @(t) sin(pi * t) ./ (pi * t); 20 % Tạo tín hiệu sinc(t) sinc_signal = sinc_manual(t); % Sửa giá trị tại t = 0 để tránh NaN sinc_signal(t == 0) = 1; % Tạo tín hiệu e^(-t) exp_signal = exp(-t); % Tạo tín hiệu xung chữ nhật tuần hoàn chu kỳ T=2, biên độ bằng 1 thủ công T = 2; rect_periodic = zeros(size(t)); for i = 1:length(t) if mod(t(i), T) < T/2 rect_periodic(i) = 1; else rect_periodic(i) = -1; end end % Tạo tín hiệu x(t) = sin(pi*t/3 + pi/4) + 2*cos(pi*t/4) x_t = sin(pi * t / 3 + pi / 4) + 2 * cos(pi * t / 4); % Vẽ các tín hiệu figure; % Vẽ tín hiệu sinc(t) subplot(4, 1, 1); plot(t, sinc_signal); 21 title('Tín hiệu sinc(t)'); xlabel('t'); ylabel('sinc(t)'); grid on; % Vẽ tín hiệu e^{-t} subplot(4, 1, 2); plot(t, exp_signal); title('Tín hiệu e^{-t}'); xlabel('t'); ylabel('e^{-t}'); grid on; % Vẽ tín hiệu xung chữ nhật tuần hoàn chu kỳ T=2, biên độ bằng 1 subplot(4, 1, 3); plot(t, rect_periodic); title('Tín hiệu xung chữ nhật tuần hoàn chu kỳ T=2, biên độ bằng 1'); xlabel('t'); ylabel('Rectangular Pulse'); grid on; % Vẽ tín hiệu x(t) = sin(pi*t/3 + pi/4) + 2*cos(pi*t/4) subplot(4, 1, 4); plot(t, x_t); title('Tín hiệu x(t) = sin(\pi t/3 + \pi/4) + 2cos(\pi t/4)'); xlabel('t'); ylabel('x(t)'); grid on; 22 % Hiển thị hình vẽ sgtitle('Các tín hiệu liên tục'); 3. Tương tự như hàm cộng 2 tín hiệu ở trên, hãy thực hiện hàm cộng hoặc nhân tín hiệu với hằng số; nhân vô hướng 2 tín hiệu (sig_mult.m), cho các trường hợp (i) 2 tín hiệu liên tục theo thời gian và (ii) rời rạc theo thời gian 4. Viết các hàm thực hiện các phép toán lật, dịch, co giãn tín hiệu cho các trường hợp (i) 2 tín hiệu liên tục theo thời gian và (ii) rời rạc theo thời gian %Hàm lật tín hiệu liên tục function flipped_signal = flip_signal_continuous(signal, t) flipped_signal = flip(signal); t = -flip(t); % Đảo ngược trục thời gian end 23 %Hàm dịch tín hiệu liên tục function shifted_signal = shift_signal_continuous(signal, t, shift) shifted_signal = signal; t = t + shift; % Dịch trục thời gian end %Hàm co giãn tín hiệu liên tục function [stretched_signal, t_stretched] = stretch_signal_continuous(signal, t, factor) t_stretched = t * factor; % Co giãn trục thời gian stretched_signal = signal; end %Hàm lật tín hiệu rời rạc function flipped_signal = flip_signal_discrete(signal, n) flipped_signal = flip(signal); n = -flip(n); % Đảo ngược trục thời gian end %Hàm dịch tín hiệu rời rạc function shifted_signal = shift_signal_discrete(signal, n, shift) shifted_signal = signal; n = n + shift; % Dịch trục thời gian end %Hàm co giãn tín hiệu rời rạc function [stretched_signal, n_stretched] = stretch_signal_discrete(signal, n, factor) n_stretched = n * factor; % Co giãn trục thời gian stretched_signal = signal; 24 end 5. Vẽ phổ biên độ và pha của tín hiệu sau: • x(t) = sinc(t) = sin(πt) πt • x(t) = cos(πt/3) + 2sin(πt/4) % Khởi tạo trục thời gian t = -10:0.01:10; % Định nghĩa hàm sinc thủ công sinc_manual = @(t) sin(pi * t) ./ (pi * t); x1 = sinc_manual(t); % sinc(t) = sin(pi*t) / (pi*t) % Sửa giá trị tại t = 0 để tránh NaN x1(t == 0) = 1; % Định nghĩa tín hiệu x2 x2 = cos(pi * t / 3) + 2 * sin(pi * t / 4); % Thực hiện biến đổi Fourier cho tín hiệu x1 X1 = fftshift(fft(x1)); f1 = linspace(-pi, pi, length(X1)); % Biên độ và pha của x1 magnitude_X1 = abs(X1); phase_X1 = angle(X1); % Thực hiện biến đổi Fourier cho tín hiệu x2 X2 = fftshift(fft(x2)); f2 = linspace(-pi, pi, length(X2)); 25 % Biên độ và pha của x2 magnitude_X2 = abs(X2); phase_X2 = angle(X2); % Vẽ phổ biên độ và pha cho x1 figure; subplot(2, 2, 1); plot(f1, magnitude_X1); title('Phổ biên độ của x(t) = sinc(t)'); xlabel('Tần số'); ylabel('Biên độ'); grid on; subplot(2, 2, 2); plot(f1, phase_X1); title('Phổ pha của x(t) = sinc(t)'); xlabel('Tần số'); ylabel('Pha'); grid on; % Vẽ phổ biên độ và pha cho x2 subplot(2, 2, 3); plot(f2, magnitude_X2); title('Phổ biên độ của x(t) = cos(\pi t/3) + 2sin(\pi t/4)'); xlabel('Tần số'); ylabel('Biên độ'); grid on; 26 subplot(2, 2, 4); plot(f2, phase_X2); title('Phổ pha của x(t) = cos(\pi t/3) + 2sin(\pi t/4)'); xlabel('Tần số'); ylabel('Pha'); grid on; % Hiển thị các hình vẽ sgtitle('Phổ biên độ và pha của các tín hiệu'); 27 Chương 3 LẤY MẪU TÍN HIỆU A. Lý Thuyết 3.1 Lý thuyết lấy mẫu tín hiệu Trong lĩnh vực xử lý tín hiệu, lấy mẫu là quá trình chuyển đổi tín hiệu liên tục thành dạng rời rạc bằng cách lấy mẫu giá trị của tín hiệu tại các điểm thời gian cố định. Lý thuyết lấy mẫu là một phần quan trọng của xử lý tín hiệu số và đặc biệt quan trọng trong viễn thông và xử lý âm thanh. 3.1.1 Định lý lấy mẫu Nyquist Định lý lấy mẫu Nyquist là một nguyên lý cơ bản trong lý thuyết lấy mẫu tín hiệu, đặt ra điều kiện cần để đảm bảo tái tạo chính xác của một tín hiệu liên tục từ mẫu của nó. Nội dung của định lý lấy mẫu Nyquist: Để tái tạo chính xác một tín hiệu liên tục từ mẫu của nó, tần số lấy mẫu (fₛ) phải lớn hơn hoặc bằng gấp đôi tần số cao nhất có trong tín hiệu. Nói cách khác, nếu fₘ là tần số cao nhất trong tín hiệu, thì tần số lấy mẫu fₛ phải thỏa mãn điều kiện: Nếu tần số lấy mẫu không đạt đủ điều kiện này, hiện tượng gọi là hiện tượng aliasing có thể xảy ra. Hiện tượng aliasing là hiện tượng khi tần số của một tín hiệu cao hơn nửa tần số lấy mẫu và bị gấp lại, dẫn đến sự biến đổi không mong muốn trong tín hiệu tái tạo. Do đó, việc chọn tần số lấy mẫu phù hợp là rất quan trọng để đảm bảo chất lượng tái tạo của tín hiệu từ mẫu của nó. Định lý lấy mẫu Nyquist cung cấp một hướng dẫn cơ bản để thực hiện điều này. 28 3.2 Lấy mẫu tín hiệu âm thanh Lấy mẫu tín hiệu âm thanh là quá trình quan trọng trong việc biểu diễn và xử lý âm thanh trong hệ thống số. Khi lấy mẫu tín hiệu âm thanh, ta cần cân nhắc đến các tham số quan trọng như tần số lấy mẫu và độ phân giải âm thanh để đảm bảo chất lượng và độ chính xác của âm thanh tái tạo. Tần số lấy mẫu (Sampling Rate) Tần số lấy mẫu là số lần mẫu được lấy trong một giây. Trong lấy mẫu tín hiệu âm thanh, tần số lấy mẫu quyết định khả năng tái tạo âm thanh của hệ thống. Định lý lấy mẫu Nyquist đã đề cập trước đó cho biết rằng tần số lấy mẫu phải lớn hơn gấp đôi tần số cao nhất trong tín hiệu để tránh hiện tượng aliasing. Ví dụ, nếu âm thanh có tần số cao nhất là 20 kHz, thì tần số lấy mẫu ít nhất phải là 40 kHz để đảm bảo tái tạo chính xác. Độ phân giải âm thanh (Bit Depth) Độ phân giải âm thanh xác định số bit được sử dụng để biểu diễn mỗi mẫu âm thanh. Độ phân giải cao hơn cho phép biểu diễn âm thanh với độ chính xác cao hơn và độ động lớn hơn. Ví dụ, âm thanh 16-bit có độ phân giải thấp hơn so với âm thanh 24-bit. Đối với cùng một tín hiệu âm thanh, sử dụng độ phân giải cao hơn sẽ tạo ra một dải động rộng hơn và chi tiết âm thanh tốt hơn. Quy trình lấy mẫu tín hiệu âm thanh 1. Chọn tần số lấy mẫu: Dựa trên tần số cao nhất có trong âm thanh, chọn tần số lấy mẫu sao cho thỏa mãn định lý lấy mẫu Nyquist. 2. Chọn độ phân giải âm thanh: Quyết định số bit được sử dụng cho mỗi mẫu âm thanh, đảm bảo độ chính xác và chi tiết cần thiết cho ứng dụng. 3. Lấy mẫu và lưu trữ dữ liệu: Áp dụng quy trình lấy mẫu tín hiệu âm thanh và lưu trữ dữ liệu mẫu theo định dạng số, như WAV hoặc MP3. Lấy mẫu tín hiệu âm thanh là một phần quan trọng trong việc biểu diễn và xử lý âm thanh số, và việc chọn các tham số lấy mẫu đúng đắn rất quan trọng để đảm bảo chất lượng âm thanh tái tạo. 29 B. Bài tập 3. Vẽ 1 đoạn của file âm thanh trong miền thời gian và miền tần số 4. Tín hiệu âm thanh này đã được lấy mẫu từ một tín hiệu âm thanh tương tự. Giả sử quá trình lấy mẫu không bị chồng phổ, vậy tần số cực đại của tín hiệu tương tự có tần số là bao nhiêu? Nếu quá trình lấy mẫu không gây ra hiện tượng chồng phổ (aliasing), thì theo Nguyên lý Nyquist, tần số lấy mẫu (fs) phải ít nhất gấp đôi tần số cực đại của tín hiệu gốc để tái tạo tín hiệu một cách chính xác. Vậy nếu tần số lấy mẫu (fs) là 300 Hz, thì tần số cực đại của tín hiệu tương tự ban đầu sẽ không vượt quá 150 Hz. Điều này làm cho tín hiệu tương tự được tái tạo một cách chính xác mà không gây ra hiện tượng chồng phổ. 5. Hãy viết chương trình giảm tần số lấy mẫu tín hiệu âm thanh trên đi 4 lần, Fs = fs/4. Nghe thử âm thanh sử dụng sound(ynew, fs/4). % Đọc file âm thanh [audio, fs] = audioread('audioclip1.wav'); % Giảm tần số lấy mẫu đi 4 lần new_fs = fs / 4; % Tái lấy mẫu tín hiệu với tần số mới 30 downsample_factor = round(fs / new_fs); audio_downsampled = audio(1:downsample_factor:end); % Nghe thử âm thanh sound(audio_downsampled, new_fs); 31 Chương 4 HỆ THỐNG TUYẾN TÍNH BẤT BIẾN RỜI RẠC A. Lý Thuyết 4.1 Hệ thống tuyến tính bất biến 4.2 Đáp ứng xung Đáp ứng xung là phản ứng của một hệ thống đến một tín hiệu xung đầu vào. Trong lĩnh vực xử lý tín hiệu và điều khiển, việc hiểu và phân tích đáp ứng xung của hệ thống là rất quan trọng để đảm bảo hiệu suất và đáng tin cậy của hệ thống. 4.2.1 Tính chất của hệ thống Tính chất của hệ thống có thể được xác định bằng cách nghiên cứu đáp ứng của nó đến các tín hiệu xung đầu vào khác nhau. Các tính chất chính bao gồm: 1. Thời gian phản ứng: Là thời gian mà hệ thống mất để đạt đến trạng thái ổn định sau khi nhận được một xung đầu vào. 2. Dạng dạng của đáp ứng: Đáp ứng xung có thể có nhiều dạng khác nhau như đáp ứng dạng dải, đáp ứng dạng hệ số, đáp ứng dạng hàm tần số, v.v. 3. Độ dốc: Độ dốc của đáp ứng xung cho biết tốc độ thay đổi của hệ thống trong quá trình phản ứng. 32 4. Phản hồi: Các hệ thống thường có thể được thiết kế để có phản hồi âm hay dương với các tín hiệu đầu vào xung. 4.2.2 Xác định đáp ứng lối ra của hệ thống Để xác định đáp ứng lối ra của hệ thống đến các tín hiệu xung, ta thực hiện các bước sau: 1. Áp dụng tín hiệu xung đầu vào: Áp dụng một tín hiệu xung đầu vào mong muốn vào hệ thống. 2. Quan sát đáp ứng lối ra: Ghi lại và quan sát sự thay đổi của tín hiệu đầu ra của hệ thống sau khi nhận được tín hiệu xung đầu vào. 3. Phân tích đáp ứng: Phân tích các biến đổi và tính chất của đáp ứng lối ra để hiểu rõ hơn về hành vi của hệ thống. 4. Đánh giá hiệu suất: Dựa trên đáp ứng lối ra, đánh giá hiệu suất và tính chất của hệ thống và xem xét việc điều chỉnh hoặc cải thiện nếu cần thiết. Xác định và hiểu rõ đáp ứng xung của hệ thống là một bước quan trọng trong việc phát triển và vận hành hệ thống điều khiển và xử lý tín hiệu. 4.3 Phương trình sai phân và hàm truyền Trong lý thuyết hệ thống và điều khiển, phương trình sai phân và hàm truyền là hai khái niệm quan trọng để mô hình hóa và phân tích hệ thống. 4.3.1 Xác định đáp ứng lối ra của hệ thống Phương trình sai phân được sử dụng để mô tả mối quan hệ giữa đầu vào và đầu ra của hệ thống trong miền thời gian. Đáp ứng lối ra của hệ thống là giải pháp của phương trình sai phân này với điều kiện ban đầu và điều kiện biên. 4.3.2 Xác định đáp ứng xung của hệ thống Đáp ứng xung của hệ thống là phản ứng của hệ thống đến một tín hiệu xung đầu vào. Nó thường được mô tả thông qua hàm truyền của hệ thống. 33 4.3.3 Hàm truyền và giản đồ điểm cực điểm không Hàm truyền là biểu diễn của mối quan hệ giữa đầu vào và đầu ra của hệ thống trong miền tần số. Nó thường được biểu diễn dưới dạng biểu đồ Bode hoặc biểu đồ Nyquist để minh họa phản ứng của hệ thống tới các tín hiệu tần số khác nhau. Giản đồ điểm cực điểm không là một công cụ khác để mô tả tính chất của hàm truyền. Nó biểu thị vị trí của các điểm cực và không của hàm truyền trên mặt phẳng phức. Những khái niệm này đều rất quan trọng trong việc hiểu và phân tích hệ thống từ góc độ tín hiệu và tần số, giúp kỹ sư điều khiển và xử lý tín hiệu hiểu rõ hơn về tính chất và hiệu suất của hệ thống. 4.4 Đáp ứng tần số Đáp ứng tần số là phản ứng của một hệ thống đến các tín hiệu có tần số khác nhau. Trong lĩnh vực xử lý tín hiệu và điều khiển, việc phân tích đáp ứng tần số của hệ thống là rất quan trọng để hiểu và đánh giá hiệu suất của hệ thống. 4.4.1 Đáp ứng tần số của hệ thống Đáp ứng tần số của hệ thống thường được biểu diễn dưới dạng biểu đồ Bode hoặc biểu đồ điểm cực điểm không. Biểu đồ Bode minh họa phản ứng của hệ thống tới các tần số khác nhau, bao gồm cả pha và độ lớn của đáp ứng. Trong khi đó, biểu đồ điểm cực điểm không biểu diễn vị trí của các điểm cực và không của hàm truyền trên mặt phẳng phức. 4.4.2 Ý nghĩa của đáp ứng tần số Đáp ứng tần số cho ta cái nhìn tổng quan về hiệu suất của hệ thống ở các tần số khác nhau. Nó giúp chúng ta hiểu được làm thế nào hệ thống phản ứng đối với các tín hiệu có tần số cao hoặc thấp, từ đó đưa ra các quyết định thiết kế và điều khiển hợp lý. 4.4.3 Ứng dụng của đáp ứng tần số • Thiết kế bộ lọc: Đáp ứng tần số giúp thiết kế và tinh chỉnh bộ lọc để loại bỏ các thành phần không mong muốn trong tín hiệu và tăng cường các thành phần mong muốn. 34 • Điều khiển hệ thống: Trong điều khiển, việc hiểu và đánh giá đáp ứng tần số của hệ thống giúp thiết kế bộ điều khiển sao cho phù hợp với yêu cầu hiệu suất và ổn định của hệ thống. • Xử lý tín hiệu: Trong xử lý tín hiệu số, đáp ứng tần số giúp hiểu rõ cách hệ thống ảnh hưởng đến tín hiệu ở các tần số khác nhau, từ đó áp dụng các biện pháp xử lý phù hợp. Đáp ứng tần số là một công cụ quan trọng trong phân tích và thiết kế hệ thống điều khiển và xử lý tín hiệu, giúp tối ưu hóa hiệu suất và ổn định của hệ thống. B. Bài tập 1. Vẽ đáp ứng lối ra của hệ thống trong các trường hợp sau: • x(n) = {−1, −2, 3, 4, 2, 9}; h(n) = {1, 3, 2, 1} • x(n) = {1, 2, 3, 4, 5}; h(n) = {6, 7, 8, 9} • x(n) = (0.8)nu(n), h(n) = (−0.9)nu(n) • x(n) = (1/4)−n [u(n + 1) − u(n − 4)], h(n) = u(n) − u(n − 5) % Trường hợp 1 x1 = [-1, -2, 3, 4, 2, 9]; h1 = [1, 3, 2, 1]; y1 = conv(x1, h1); % Trường hợp 2 x2 = [1, 2, 3, 4, 5]; h2 = [6, 7, 8, 9]; y2 = conv(x2, h2); % Trường hợp 3 n = 0:20; x3 = (0.8).^n; h3 = (-0.9).^n; 35 y3 = conv(x3, h3); % Trường hợp 4 n = -1:10; u_n_plus_1 = double(n + 1 >= 0); % u(n + 1) u_n_minus_4 = double(n - 4 >= 0); % u(n - 4) x4 = (1/4).^(-n) .* (u_n_plus_1 - u_n_minus_4); u_n = double(n >= 0); % u(n) u_n_minus_5 = double(n - 5 >= 0); % u(n - 5) h4 = u_n - u_n_minus_5; y4 = conv(x4, h4); % Vẽ kết quả figure; subplot(4, 1, 1); stem(y1, 'filled'); title('Đáp ứng lối ra y(n) với x(n) = \{-1, -2, 3, 4, 2, 9\} và h(n) = \{1, 3, 2, 1\}'); xlabel('n'); ylabel('y(n)'); subplot(4, 1, 2); stem(y2, 'filled'); title('Đáp ứng lối ra y(n) với x(n) = \{1, 2, 3, 4, 5\} và h(n) = \{6, 7, 8, 9\}'); xlabel('n'); ylabel('y(n)'); subplot(4, 1, 3); 36 stem(0:length(y3)-1, y3, 'filled'); title('Đáp ứng lối ra y(n) với x(n) = (0.8)^n u(n) và h(n) = (-0.9)^n u(n)'); xlabel('n'); ylabel('y(n)'); subplot(4, 1, 4); stem(-2:length(y4)-3, y4, 'filled'); title('Đáp ứng lối ra y(n) với x(n) = (1/4)^{-n} [u(n + 1) - u(n - 4)] và h(n) = u(n) - u(n 5)'); xlabel('n'); ylabel('y(n)'); 37 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ì? • h(n) = 3δ(n + 2) + 2δ(n) − δ(n − 3) + 5δ(n − 7), 5 ≤ n ≤ 10 • h(n) = 10u(n) − 5u(n − 5) − 10u(n − 10) + 5u(n − 15) • h(n) = 2sin(0.01πn)cos(0.5πn), −200 ≤ n ≤ 200 • h(n) = (1/2)n • h(n) = 3n % Trường hợp 1 n1 = -10:10; % Mở rộng n để thấy các xung delta h1 = 3*(n1 == -2) + 2*(n1 == 0) - 1*(n1 == 3) + 5*(n1 == 7); % Trường hợp 2 n2 = 0:20; h2 = 10*(n2 >= 0) - 5*(n2 >= 5) - 10*(n2 >= 10) + 5*(n2 >= 15); % Trường hợp 3 n3 = -200:200; h3 = 2*sin(0.01*pi*n3).*cos(0.5*pi*n3); % Trường hợp 4 n4 = 0:20; h4 = (1/2).^n4; % Trường hợp 5 n5 = 0:10; h5 = 3.^n5; % Vẽ kết quả 38 figure; subplot(5, 1, 1); stem(n1, h1, 'filled'); title('Đáp ứng xung h(n) = 3\delta(n + 2) + 2\delta(n) - \delta(n - 3) + 5\delta(n - 7)'); xlabel('n'); ylabel('h(n)'); subplot(5, 1, 2); stem(n2, h2, 'filled'); title('Đáp ứng xung h(n) = 10u(n) - 5u(n - 5) - 10u(n - 10) + 5u(n - 15)'); xlabel('n'); ylabel('h(n)'); subplot(5, 1, 3); stem(n3, h3, 'filled'); title('Đáp ứng xung h(n) = 2sin(0.01\pi n)cos(0.5\pi n)'); xlabel('n'); ylabel('h(n)'); subplot(5, 1, 4); stem(n4, h4, 'filled'); title('Đáp ứng xung h(n) = (1/2)^n'); xlabel('n'); ylabel('h(n)'); subplot(5, 1, 5); stem(n5, h5, 'filled'); title('Đáp ứng xung h(n) = 3^n'); xlabel('n'); 39 ylabel('h(n)'); 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 % Trường hợp 1 n1 = 0:20; x1 = cos(pi*n1/3) .* (n1 >= 0); y1 = zeros(1, length(n1)); 40 % Điều kiện ban đầu cho Trường hợp 1 y1_prev1 = 1; % y(-1) y1_prev2 = 0.5; % y(-2) % Tính y1(n) for k = 1:length(n1) if k == 1 x1k_1 = 0; x1k_3 = 0; elseif k == 2 x1k_1 = x1(k-1); x1k_3 = 0; elseif k == 3 x1k_1 = x1(k-1); x1k_3 = 0; else x1k_1 = x1(k-1); x1k_3 = x1(k-3); end if k == 1 y1(k) = x1(k) + 2*x1k_1 + x1k_3 + 0.5*y1_prev1 - 0.25*y1_prev2; elseif k == 2 y1(k) = x1(k) + 2*x1k_1 + x1k_3 + 0.5*y1(k-1) - 0.25*y1_prev1; else y1(k) = x1(k) + 2*x1k_1 + x1k_3 + 0.5*y1(k-1) - 0.25*y1(k-2); end end 41 % Trường hợp 2 n2 = 0:20; x2 = (n2 >= 0); % x(n) = u(n) y2 = zeros(1, length(n2)); % Điều kiện ban đầu cho Trường hợp 2 y2_prev1 = -1; % y(-1) y2_prev2 = -2; % y(-2) % Tính y2(n) for k = 1:length(n2) if k == 1 x2k_1 = 0; else x2k_1 = x2(k-1); end if k == 1 y2(k) = x2(k) + x2k_1 + 2*y2_prev1 - y2_prev2; elseif k == 2 y2(k) = x2(k) + x2k_1 + 2*y2(k-1) - y2_prev1; else y2(k) = x2(k) + x2k_1 + 2*y2(k-1) - y2(k-2); end end % Vẽ kết quả figure; subplot(2, 1, 1); 42 stem(n1, y1, 'filled'); title('Đáp ứng lối ra y(n) với y(n) - 0.5y(n - 1) + 0.25y(n - 2) = x(n) + 2x(n - 1) + x(n 3)'); xlabel('n'); ylabel('y(n)'); subplot(2, 1, 2); stem(n2, y2, 'filled'); title('Đáp ứng lối ra y(n) với y(n) - 2y(n - 1) + y(n - 2) = x(n) + x(n - 1)'); xlabel('n'); ylabel('y(n)'); 43 Chương 5 THIẾT KẾ CẤU TRÚC HỆ THỐNG A. Lý Thuyết 5.1 Cấu trúc hệ thống Cấu trúc hệ thống đề cập đến cách mà các thành phần của hệ thống được tổ chức, kết nối và tương tác với nhau. Cấu trúc này quyết định về cách tổ chức dữ liệu và luồng thông tin, quy trình xử lý, và cách mà các phần của hệ thống tương tác để đạt được mục tiêu hoạt động. Thành phần của cấu trúc hệ thống có thể bao gồm: 1. Các module hoặc thành phần chức năng: Đây là các phần tử cơ bản của hệ thống, mỗi cái thực hiện một chức năng cụ thể. Chẳng hạn, trong một hệ thống quản lý đơn hàng, có thể có các module cho việc nhập đơn hàng, xử lý thanh toán, quản lý kho, v.v. 2. Giao diện: Là cách mà người dùng hoặc các hệ thống khác tương tác với hệ thống. Giao diện có thể bao gồm giao diện người dùng (UI), API (Application Programming Interface), hoặc các giao thức truyền thông. 3. Luồng dữ liệu: Là cách mà dữ liệu được truyền qua các thành phần của hệ thống. Điều này có thể bao gồm cơ chế như hàng đợi, dây chuyền xử lý, hoặc luồng dữ liệu song song. 4. Các quy trình hoặc quy tắc kinh doanh: Các quy tắc và quy trình được thực hiện bởi hệ thống để thực hiện các nhiệm vụ cụ thể hoặc đảm bảo tuân thủ các quy định và tiêu chuẩn. Mục tiêu của việc thiết kế cấu trúc hệ thống: • Tính linh hoạt: Hệ thống nên có khả năng thích ứng với thay đổi trong yêu cầu và môi trường. 44 • Tính mở rộng: Cấu trúc phải có khả năng mở rộng để đáp ứng với sự phát triển của hệ thống. • Hiệu suất: Tối ưu hóa việc sử dụng tài nguyên để đạt được hiệu suất tốt nhất. • Dễ bảo trì và sửa chữa: Cấu trúc phải được thiết kế sao cho dễ dàng kiểm tra, bảo trì và sửa chữa khi cần thiết. Một cấu trúc hệ thống tốt sẽ đảm bảo rằng hệ thống hoạt động hiệu quả và có thể mở rộng để đáp ứng với các yêu cầu và thay đổi trong tương lai. 5.2 Cấu trúc nối tiếp và cấu trúc song song 5.2.1 Thiết kế cấu trúc tối ưu kiểu nối tiếp Trong cấu trúc nối tiếp, các thành phần của hệ thống được kết nối theo dạng chuỗi, tức là đầu ra của một thành phần là đầu vào của thành phần tiếp theo. Thiết kế cấu trúc tối ưu kiểu nối tiếp tập trung vào việc tối ưu hóa luồng dữ liệu và quy trình xử lý trong chuỗi này. Ưu điểm của cấu trúc nối tiếp: • Đơn giản: Dễ hiểu và triển khai. • Tuân thủ và ổn định: Mỗi thành phần được thực hiện tuần tự, giúp kiểm soát và theo dõi quá trình xử lý. Nhược điểm của cấu trúc nối tiếp: • Hiệu suất: Có thể gặp vấn đề về hiệu suất nếu có thành phần chậm chạp trong chuỗi. • Mở rộng hạn chế: Khả năng mở rộng có thể bị hạn chế bởi sự liên kết chặt chẽ giữa các thành phần. 5.2.2 Thiết kế cấu trúc tối ưu kiểu song song Trong cấu trúc song song, các thành phần của hệ thống hoạt động đồng thời và độc lập với nhau. Thiết kế cấu trúc tối ưu kiểu song song tập trung vào việc phân tách và xử lý công việc đồng thời để tối ưu hóa hiệu suất và tính mở rộng của hệ thống. Ưu điểm của cấu trúc song song: • Hiệu suất: Cải thiện hiệu suất bằng cách xử lý công việc đồng thời. 45 • Linh hoạt và mở rộng: Dễ dàng mở rộng hệ thống bằng cách thêm các tài nguyên song song. Nhược điểm của cấu trúc song song: • Phức tạp: Thiết kế và triển khai cấu trúc song song thường phức tạp hơn so với cấu trúc nối tiếp. • Đồng bộ hóa: Cần có các cơ chế đồng bộ hóa để đảm bảo tính nhất quán và độ tin cậy của hệ thống. Lựa chọn cấu trúc phù hợp Lựa chọn cấu trúc phù hợp phụ thuộc vào yêu cầu cụ thể của hệ thống, bao gồm hiệu suất, độ tin cậy, tính linh hoạt và khả năng mở rộng. Trong nhiều trường hợp, việc kết hợp cả hai cấu trúc có thể tạo ra một hệ thống tối ưu với sự kết hợp của tính ổn định của cấu trúc nối tiếp và tính linh hoạt của cấu trúc song song. B. Bài tập 3. Viết chương trình thực hiện quá trình phân tích một hệ thống thành các cấu trúc tối giản theo kiểu song song. Hàm có dạng: function [Tuso, Mauso] = cautrucsongsong[a, b] với Tuso, Mauso là ma trận, lưu hệ số của đa thức tử số và mẫu số của các hệ thống thành phần. function [Tuso, Mauso] = cautrucsongsong(a, b) % Hàm này phân tích hệ thống thành các cấu trúc tối giản theo kiểu song song % a: hệ số của tử số đa thức % b: hệ số của mẫu số đa thức % Tuso: ma trận lưu hệ số của đa thức tử số của các hệ thống thành phần % Mauso: ma trận lưu hệ số của đa thức mẫu số của các hệ thống thành phần % Sử dụng phân tích phân số từng phần để phân tích hàm truyền [R, P, K] = residue(a, b); 46 % Số lượng phân số đơn giản numTerms = length(R); % Khởi tạo các ma trận tử số và mẫu số Tuso = zeros(numTerms, length(K)); Mauso = zeros(numTerms, length(b)); % Điền giá trị vào các ma trận tử số và mẫu số for i = 1:numTerms Tuso(i, :) = [R(i), zeros(1, length(K)-1)]; Mauso(i, :) = poly(P(i)); end % Thêm phần tử K vào ma trận tử số if ~isempty(K) Tuso = [Tuso; K]; Mauso = [Mauso; zeros(1, length(b))]; end end 47 Chương 6 ỨNG DỤNG CỦA XỬ LÝ TÍN HIỆU TRONG TẠO HIỆU ỨNG ÂM THANH A. Lý Thuyết 6.1 Âm thanh Âm thanh là các rung động được truyền qua một môi trường, như không khí, chất lỏng, chất rắn hoặc plasma, có tần số nằm trong phạm vi tần số mà con người có thể nghe được, từ khoảng 20 Hz đến 20 kHz. Tuy nhiên, dải tần số âm thanh có thể khác nhau cho các loại vật liệu và môi trường khác nhau. Âm thanh có thể được cảm nhận hoặc nghe thấy thông qua sự thay đổi áp suất trong môi trường truyền qua màng nhĩ của tai. Biên độ (độ lớn), tần số và pha của các thành phần của áp suất không khí (một phần của âm thanh) quyết định cách con người cảm nhận âm thanh. 6.2 Tiếng vọng (Echo) Tiếng vọng là hiện tượng phản xạ âm thanh mà chúng ta nghe được khi âm thanh phản xạ từ các bề mặt cứng trong một không gian đóng (ví dụ như một hội trường hoặc hang động) và trở lại tai người nghe. Khi đó, người nghe có thể nghe được hai hoặc nhiều phiên bản của cùng một âm thanh, mỗi phiên bản đến tai vào một thời điểm khác nhau một chút. Tiếng vọng xảy ra do tốc độ lan truyền của âm thanh trong không khí tương đối chậm, khoảng 340 mét mỗi giây. Do đó, khi âm thanh gặp phải các vật cản trong môi trường, nó có thể bị phản xạ và tạo ra nhiều phiên bản khác nhau của âm thanh mà người nghe có thể nghe thấy. 6.3 Tiếng ngân (Reverberation) Tiếng ngân, hay còn gọi là reverberation, là hiện tượng phản xạ và lan truyền của âm thanh trong một không gian đóng sau khi nguồn âm đã dừng lại. Khi âm thanh phản xạ từ các bề mặt cứng trong một không gian, nó tạo ra một loạt các phiên bản của âm thanh, 48 mỗi phiên bản đến tai người nghe vào thời điểm khác nhau, tạo ra một âm thanh phức tạp và giàu cảm xúc. Tiếng ngân tạo ra cảm giác về không gian, âm sắc và sự sống động cho âm thanh. 6.4 Chipmunks Chipmunks là tên gọi phổ biến cho hiện tượng tăng tốc độ phát lại âm thanh, làm cho giọng nói hoặc âm nhạc nghe có vẻ nhanh hơn và cao hơn so với bình thường. Hiện tượng này thường được sử dụng như một hiệu ứng hoặc trò vui trong công nghệ âm thanh, video hoặc giải trí. 6.5 Optimus Primes Optimus Primes là một tên gọi hài hước được sử dụng để mô tả việc biến đổi giọng nói của con người thành một giọng điện thoại giống như giọng của nhân vật Optimus Prime trong loạt phim hoạt hình Transformers. Điều này thường được thực hiện bằng cách sử dụng các phần mềm hoặc thiết bị xử lý âm thanh để thay đổi tần số và độ cao của giọng nói, tạo ra một hiệu ứng giọng nói mạnh mẽ và trầm ấm, giống như giọng của nhân vật Optimus Prime. 49 Chương 7 THIẾT KẾ BỘ LỌC SỐ IIR, FIR A. Lý Thuyết 7.1 Bộ lọc số Bộ lọc số là một công cụ quan trọng trong xử lý tín hiệu số và hệ thống điều khiển. Nó được sử dụng để loại bỏ hoặc giảm những thành phần không mong muốn hoặc nhiễu từ tín hiệu đầu vào, hoặc để trích xuất thông tin cần thiết từ tín hiệu. Các loại bộ lọc số bao gồm bộ lọc FIR (Finite Impulse Response) và bộ lọc IIR (Infinite Impulse Response). Bộ lọc số có thể được triển khai bằng phần cứng hoặc phần mềm, và chúng có thể thực hiện nhiều chức năng xử lý tín hiệu, bao gồm lọc thông thấp, lọc thông cao, lọc thông băng qua, và lọc thông dãn. 7.2 Lọc IIR Lọc IIR (Infinite Impulse Response) là một loại bộ lọc số trong đó đáp ứng của hệ thống vô hạn khi đầu vào được kích hoạt bởi một xung delta (impulse). Điều này có nghĩa là đầu ra của hệ thống phụ thuộc không chỉ vào đầu vào hiện tại mà còn vào các giá trị trước đó của đầu vào và đầu ra. Cấu trúc của lọc IIR thường gồm các phần tử phản hồi (feedback) và phần tử cấp dữ liệu (feedforward). Phần tử phản hồi cho phép thông tin từ đầu ra quay lại đầu vào, trong khi phần tử cấp dữ liệu xử lý thông tin đầu vào theo hướng truyền thẳng. Ưu điểm của bộ lọc IIR bao gồm: • Độ phức tạp thấp so với bộ lọc FIR khi cùng đạt được đáp ứng tần số mong muốn. • Hiệu suất tính toán cao với cùng một số lượng hệ số. Tuy nhiên, bộ lọc IIR cũng có nhược điểm là: 50 • Dễ gây ổn định nếu không được thiết kế cẩn thận. • Có thể gây nhiễu âm thanh do các vấn đề về ổn định. 7.3 fdatool và fvtool fdatool fdatool là một công cụ trong MATLAB được sử dụng để thiết kế bộ lọc số FIR và IIR. Nó cung cấp giao diện đồ họa dễ sử dụng cho việc thiết kế và phân tích bộ lọc số, cho phép người dùng tinh chỉnh các thông số của bộ lọc để đạt được yêu cầu cụ thể về phản ứng tần số và đáp ứng thời gian. fdatool cung cấp các công cụ và chức năng để thiết kế bộ lọc FIR và IIR, tinh chỉnh hệ số, và phân tích kết quả thiết kế. fvtool fvtool là một công cụ trong MATLAB được sử dụng để hiển thị và phân tích đáp ứng tần số và đáp ứng thời gian của các bộ lọc số FIR và IIR. Nó cho phép người dùng nhập các hệ số của bộ lọc và hiển thị biểu đồ đáp ứng tần số, biểu đồ pha, biểu đồ đáp ứng thời gian và các đặc điểm khác của bộ lọc. fvtool cung cấp giao diện đồ họa dễ sử dụng và cho phép người dùng tinh chỉnh các thông số hiển thị để phân tích và đánh giá bộ lọc một cách chi tiết. Sự kết hợp fdatool và fvtool thường được sử dụng cùng nhau trong quá trình thiết kế và phân tích bộ lọc số trong MATLAB. Người dùng có thể sử dụng fdatool để thiết kế bộ lọc FIR hoặc IIR và tinh chỉnh các thông số của nó, sau đó sử dụng fvtool để phân tích và hiển thị các đáp ứng tần số và đáp ứng thời gian của bộ lọc đã thiết kế. Sự kết hợp của hai công cụ này giúp người dùng dễ dàng thiết kế, tinh chỉnh và phân tích các bộ lọc số một cách hiệu quả. 7.4 Thiết kế bộ lọc số FIR Bộ lọc số FIR (Finite Impulse Response) là một loại bộ lọc số trong đó đáp ứng của hệ thống chỉ tồn tại trong một khoảng thời gian hữu hạn sau khi đầu vào được kích hoạt. Thiết kế bộ lọc số FIR thường được thực hiện bằng cách sử dụng các phương pháp và 51 công cụ khác nhau, trong đó phương pháp cửa số là một trong những phương pháp phổ biến. 7.4.1 Thiết kế sử dụng phương pháp cửa số Phương pháp cửa số thường bắt đầu bằng việc xác định đáp ứng tần số mong muốn cho bộ lọc, sau đó sử dụng các cửa số (window functions) như cửa số Hamming, cửa số Blackman, hoặc cửa số Kaiser để thiết kế các hệ số của bộ lọc sao cho đáp ứng tần số của nó gần với yêu cầu nhất có thể. Các bước cơ bản để thiết kế bộ lọc số FIR bằng phương pháp cửa số là: 1. Xác định yêu cầu về đáp ứng tần số cho bộ lọc, bao gồm đáp ứng tần số thông qua và tần số cắt (cutoff frequency). 2. Chọn cửa số phù hợp dựa trên yêu cầu thiết kế và ứng dụng. 3. Tính toán hệ số của bộ lọc sử dụng cửa số và phương pháp chuyển đổi Fourier ngược (inverse Fourier transform). 4. Tinh chỉnh các thông số của bộ lọc nếu cần thiết và kiểm tra hiệu suất của nó. 7.4.2 Chuyển đổi giữa các bộ lọc Khi cần, có thể chuyển đổi giữa các bộ lọc số FIR và IIR để đáp ứng yêu cầu cụ thể hoặc tối ưu hóa hiệu suất của hệ thống. Có các phương pháp chuyển đổi khác nhau có thể được sử dụng, bao gồm phương pháp tương đương (equivalence methods), phương pháp xấp xỉ (approximation methods) và phương pháp hỗn hợp (hybrid methods). Việc chuyển đổi giữa các bộ lọc thường đòi hỏi kiến thức sâu rộng về lý thuyết và kỹ thuật xử lý tín hiệu số. Trong một số trường hợp, việc chuyển đổi có thể là một quá trình phức tạp và đòi hỏi sự tinh tế và kinh nghiệm. B. Bài tập 2. Tạo tín hiệu x dài 3 giây là tổng của 3 tín hiệu thành phần, có cùng biên độ, lần lượt được cộng thêm vào với độ trễ 0.1 giây. Cụ thể: • Cả 3 tín hiệu phải có tần số lấy mẫu là 8192Hz • Tín hiệu 1 có tần số 220Hz; từ 0 <t <0.3s 52 • Tín hiệu 2 có tần số 300Hz; từ 0.1 <t <0.3s • Tín hiệu 3 có tần số 440Hz; từ 0.2 <t <0.3s • Tín hiệu trên được thêm nhiễu trắng Gaussian: noise = randn(size(t)); y = x + noise; a) Vẽ tín hiệu x ban đầu và tín hiệu y sau khi bị nhiễu. b) Thiết kế bộ phát IIR đáp ứng tùy ý để loại bỏ thành phần 300Hz khỏi tín hiệu ba âm có nhiễu trắng y. Vẽ đáp ứng tần số của bộ lọc. c) Lọc tín hiệu y với bộ chỉnh âm được thiết kế. d) So sánh tín hiệu trong miền thời gian và tần số trước và sau khi lọc. % a) Tạo tín hiệu x ban đầu và tín hiệu y sau khi bị nhiễu Fs = 8192; % Tần số lấy mẫu t = 0:1/Fs:3; % Vector thời gian từ 0 đến 3 giây x1 = sin(2*pi*220*t).*((t>=0)&(t<0.3)); % Tín hiệu thành phần 1 x2 = sin(2*pi*300*t).*((t>=0.1)&(t<0.3)); % Tín hiệu thành phần 2 x3 = sin(2*pi*440*t).*((t>=0.2)&(t<0.3)); % Tín hiệu thành phần 3 x = x1 + x2 + x3; % Tín hiệu x noise = randn(size(t)); % Tạo nhiễu trắng Gaussian y = x + noise; % Tín hiệu y sau khi bị nhiễu % Vẽ tín hiệu x và y figure; subplot(2,1,1); plot(t,x); xlabel('Thời gian (s)'); ylabel('Amplitude'); title('Tín hiệu x ban đầu'); 53 subplot(2,1,2); plot(t,y); xlabel('Thời gian (s)'); ylabel('Amplitude'); title('Tín hiệu y sau khi bị nhiễu'); % b) Thiết kế bộ lọc IIR để loại bỏ thành phần 300Hz khỏi tín hiệu y Fc = 300; % Tần số cắt Wn = Fc/(Fs/2); % Tần số cắt chuẩn hóa [b, a] = butter(4, Wn, 'high'); % Thiết kế bộ lọc IIR % Vẽ đáp ứng tần số của bộ lọc figure; freqz(b, a, 512, Fs); title('Đáp ứng tần số của bộ lọc IIR'); % c) Lọc tín hiệu y với bộ chỉnh âm được thiết kế y_filtered = filter(b, a, y); % Lọc tín hiệu y % d) So sánh tín hiệu trong miền thời gian và tần số trước và sau khi lọc % Vẽ biểu đồ tín hiệu trong miền thời gian và tần số trước và sau khi lọc figure; subplot(2,1,1); plot(t, y, 'b', t, y_filtered, 'r'); xlabel('Thời gian (s)'); ylabel('Amplitude'); 54 title('Tín hiệu y trước và sau khi lọc'); legend('Trước lọc', 'Sau lọc'); subplot(2,1,2); Y = fft(y)/length(y); % FFT của tín hiệu y Y_filtered = fft(y_filtered)/length(y_filtered); % FFT của tín hiệu lọc f = linspace(-Fs/2, Fs/2, length(t)); % Tạo vector tần số plot(f, fftshift(abs(Y)), 'b', f, fftshift(abs(Y_filtered)), 'r'); xlabel('Tần số (Hz)'); ylabel('Magnitude'); title('Biểu đồ tần số của tín hiệu y trước và sau khi lọc'); legend('Trước lọc', 'Sau lọc'); 55 56 Chương 8 XỬ LÝ TIẾNG NÓI A. Lý Thuyết 8.1 Tiếng nói - Speech Tiếng nói là cách chúng ta truyền đạt thông điệp, ý nghĩa và cảm xúc bằng cách sử dụng các âm thanh phát ra từ miệng và cơ quan phát âm khác nhau trong hệ thống tiếng nói của con người. Tiếng nói không chỉ là một phương tiện giao tiếp chính thống mà còn là một phương tiện truyền đạt cảm xúc, ý định và tình cảm. 8.2 Thu tiếng nói Quá trình thu tiếng nói là quá trình ghi lại và lưu trữ âm thanh được phát ra từ miệng của người nói hoặc từ nguồn âm thanh khác. Đối với các ứng dụng ghi âm hoặc nhận dạng tiếng nói, việc thu tiếng nói là một phần quan trọng để nắm bắt thông tin và xử lý sau này. 8.3 Đặc điểm của tiếng nói Tiếng nói có nhiều đặc điểm khác nhau, bao gồm: • Tần số cơ bản (Fundamental Frequency): Tần số cơ bản của âm thanh được phát ra từ dây thanh quản trong tiếng nói, quyết định giọng nói của người nói là nam hay nữ. • Biên độ (Amplitude): Độ lớn của âm thanh, quyết định độ to nhỏ của tiếng nói. • Cường độ (Intensity): Sự mạnh yếu của âm thanh, liên quan đến năng lượng của tiếng nói. • Tốc độ (Rate): Tốc độ phát âm của từng âm và từ trong tiếng nói. • Pha (Phase): Sự thay đổi của âm thanh theo thời gian. 8.4 Loại nhiễu trong file âm thanh Trong file âm thanh, có thể tồn tại nhiều loại nhiễu khác nhau, bao gồm: • Nhiễu âm thanh (Acoustic noise): Nhiễu từ môi trường xung quanh, như tiếng ồn từ xe cộ, tiếng gió, hoặc tiếng động từ thiết bị. • Nhiễu điện (Electrical noise): Nhiễu từ các thiết bị điện tử, như tiếng kêu rít từ loa hoặc tiếng ồn từ các thiết bị điện tử trong quá trình ghi âm. 57 • Nhiễu từ người nói (Speech interference): Nhiễu do sự giao cắt giữa các nguồn âm thanh, như tiếng nói của người khác hoặc tiếng vang từ môi trường. • Nhiễu cơ học (Mechanical noise): Nhiễu từ các thiết bị cơ học, như tiếng rít từ băng đĩa hoặc tiếng cọ xát từ micro khi di chuyển. 58 Chương 9 LỌC NHIỄU VÀ PHÁT HIỆN TÍN HIỆU ĐIỆN TIM BẤT THƯỜNG A. Lý Thuyết 9.1.2 Hình thái học của tín hiệu điện tim Tín hiệu điện tim được ghi lại thông qua các điện cực trên cơ thể và biểu hiện qua các thành phần như sóng P, phức hợp QRS, sóng T và các khoảng thời gian khác nhau. Dưới đây là một tóm tắt về các thành phần chính của tín hiệu điện tim và ý nghĩa của chúng: Sóng P • Ý nghĩa: Sóng P biểu thị quá trình khử cực của tâm nhĩ trái và phải, tương ứng với sự co thắt của tâm nhĩ. • Đặc điểm: Sóng P thường mịn và tròn, có chiều cao không quá 2,5 mm và thời gian kéo dài không quá 0,11 giây. Phức hợp QRS • Ý nghĩa: Phức hợp QRS biểu thị xung điện khi nó truyền qua tâm thất và đại diện cho quá trình khử cực của tâm thất. • Đặc điểm: Bao gồm sóng Q, sóng R và sóng S. Thời gian của phức hợp QRS trong trường hợp bình thường nằm trong khoảng 0,06 đến 0,10 giây. Điểm J • Ý nghĩa: Điểm J là điểm mà phức hợp QRS và đoạn ST gặp nhau, có thể được sử dụng để chẩn đoán nhồi máu cơ tim đoạn ST. Sóng T • Ý nghĩa: Sóng T biểu thị tái cực của tâm thất, thường đi theo hướng tương tự như phức hợp QRS. • Đặc điểm: Thường hơi bất đối xứng, với đỉnh gần điểm cuối của nó hơn so với điểm bắt đầu. Sóng T đi theo cùng hướng với phức hợp QRS đi trước nó. Khoảng PQ • Ý nghĩa: Khoảng thời gian truyền dẫn từ nhĩ đến thất, thường nằm trong khoảng 0,12 đến 0,2 giây. Kéo dài của khoảng PQ có thể gợi ý đến các bệnh lý như hội chứng kích thích sớm. 59 Đoạn ST • Ý nghĩa: Đoạn ST là giai đoạn tái cực thất sớm và rất quan trọng trong việc chẩn đoán nhồi máu cơ tim. Đoạn QT • Ý nghĩa: Đoạn QT biểu thị khoảng thời gian hoạt động của tâm thất và thường phụ thuộc vào tần số nhịp tim. Kéo dài của đoạn QT có thể liên quan đến các vấn đề như tăng nguy cơ loạn nhịp thất. 9.1.3 Nhiễu trong ECG Tín hiệu ECG thường bị nhiễu khi thu được, làm mất đi sự rõ ràng của các đặc điểm trong tín hiệu. Điều này làm cho việc xác định các đặc trưng của tín hiệu trở nên khó khăn. Do đó, quá trình xử lý và lọc nhiễu là cần thiết để tái tạo tín hiệu ECG một cách chính xác. Trong tín hiệu ECG, tỷ lệ công suất tín hiệu so với nhiễu (Signal to Noise Ratio - SNR) thường đủ tốt khi người đó nằm yên. Tuy nhiên, khi người đó vận động, nhiễu có thể bao gồm hơi thở mạnh tác động vào sự dịch chuyển của điện cực (< 5 Hz) và nhiễu từ cơ bị rung (> 100 Hz). Ngoài ra, có thể có cả nhiễu từ dòng điện lưới (60 Hz ở châu Âu và Bắc Mỹ, 50 Hz ở một số nước khác). 9.1.4 Rối loạn nhịp tim (Arrhythmia) Rối loạn nhịp tim là tình trạng hoạt động điện bất thường của tim, có thể là nhanh hơn hoặc chậm hơn hoạt động điện bình thường. Điều này có thể bao gồm nhịp tim quá nhanh (hơn 100 nhịp/phút) hoặc quá chậm (nhỏ hơn 60 nhịp/phút), cũng như sự xen kẽ giữa nhịp bình thường và bất thường. Mức độ nghiêm trọng của rối loạn nhịp tim phụ thuộc vào mức độ ảnh hưởng đến hoạt động tuần hoàn máu và sự nuôi dưỡng của tim và các bộ phận khác của cơ thể. Một nhịp tim bất thường đơn lẻ thường không ảnh hưởng đến tuần hoàn máu, nhưng nhiều nhịp tim bất thường với tần suất cao có thể là vấn đề nghiêm trọng và có thể dẫn đến tử vong nếu không được điều trị kịp thời. 60 Chương 10 XỬ LÝ ẢNH A. Lý Thuyết 10.1 Hiển thị ảnh và chuyển đổi giữa các kênh mầu khác nhau Trong xử lý ảnh, hiển thị và chuyển đổi giữa các không gian màu khác nhau là các phần quan trọng. Điều này giúp cho việc hiểu và thao tác với hình ảnh trở nên linh hoạt hơn, đặc biệt là khi chúng ta muốn thực hiện các phép biến đổi hoặc phân tích dữ liệu màu sắc. 10.1.1 Đọc và hiển thị ảnh Bước đầu tiên trong xử lý ảnh là đọc và hiển thị ảnh. Để làm điều này, chúng ta cần sử dụng các thư viện phổ biến như OpenCV (Open Source Computer Vision Library) trong Python hoặc MATLAB. • Đọc ảnh: Thư viện cung cấp các phương thức để đọc các định dạng tệp ảnh khác nhau như JPEG, PNG, BMP, và TIFF vào một cấu trúc dữ liệu ảnh. • Hiển thị ảnh: Sau khi đọc ảnh, chúng ta có thể sử dụng các chức năng hiển thị để xem ảnh trên màn hình. 10.1.2 Chuyển đổi ảnh trong các không gian mầu (colorspace) Các hình ảnh số thường được biểu diễn trong một không gian màu cụ thể như RGB (Red, Green, Blue), HSV (Hue, Saturation, Value), hoặc GrayScale. Việc chuyển đổi giữa các không gian màu này có thể hữu ích trong nhiều ứng dụng. • RGB to HSV: Chuyển đổi từ không gian màu RGB sang HSV cho phép chúng ta điều chỉnh các thành phần màu sắc, độ bão hòa và giá trị của một hình ảnh. • RGB to Gray: Chuyển đổi từ không gian màu RGB sang GrayScale làm giảm chiều sâu màu sắc của hình ảnh, thích hợp cho một số ứng dụng như nhận diện cạnh và phân đoạn. • HSV to RGB: Chuyển đổi ngược lại từ không gian màu HSV sang RGB sau khi đã thực hiện các thao tác xử lý trên hình ảnh. 61 10.2 Độ phân giải ảnh Đây là khả năng của hình ảnh để hiển thị chi tiết, được đo bằng số lượng điểm ảnh trên mỗi đơn vị diện tích. Độ phân giải cao tạo ra hình ảnh rõ nét và chi tiết hơn. 10.3 Toán tử trong ảnh Là các phép biến đổi trực tiếp áp dụng lên pixel của hình ảnh. Chúng thường được sử dụng để cải thiện chất lượng hình ảnh, phát hiện đặc điểm, hoặc thực hiện các tác vụ khác trong xử lý ảnh như làm mờ, làm nét, gradient, xoay, phóng to, vv. 10.4 Miền tần số Thường ám chỉ miền tần số của biến đổi Fourier của một hình ảnh. Biến đổi Fourier phân tích hình ảnh thành các thành phần tần số khác nhau, từ tần số thấp đại diện cho cấu trúc lớn đến tần số cao đại diện cho chi tiết nhỏ. Xử lý trong miền tần số cho phép thực hiện các tác vụ như lọc tần số, làm sắc nét, và nén hình ảnh. B. Bài tập 1. Ảnh trông như thế nào, nếu ta thay đổi thứ tự các kênh mầu trong ảnh? Kiểm thử lại bằng cách viết lệnh để thực hiện hiển thị ảnh theo thứ tự B-R-G, G-B-R Khi thay đổi thứ tự các kênh màu trong ảnh, màu sắc của ảnh có thể thay đổi đáng kể. Ví dụ, nếu bạn thay đổi thứ tự kênh màu từ RGB (Red-Green-Blue) sang BGR (BlueGreen-Red), màu sắc trong ảnh sẽ bị đảo ngược. % Đọc ảnh từ file img = imread('a.jpg'); % Hiển thị ảnh theo thứ tự kênh màu BGR imshow(img(:,:,[3 2 1])); % BGR % Hiển thị ảnh theo thứ tự kênh màu GBR imshow(img(:,:,[2 3 1])); % GBR 62 2. Viết lệnh để chuyển 1 ảnh RGB sang kiểu ảnh xám, theo các cách nêu trên. Chúng ta có thể chuyển ngược từ ảnh xám sang ảnh mầu được không? Để chuyển ảnh RGB sang ảnh xám, bạn có thể sử dụng phương pháp trung bình của các kênh màu hoặc sử dụng các công thức được khuyến nghị như lấy 30% màu đỏ, 59% màu xanh lá cây và 11% màu lam. % Đọc ảnh từ file img = imread('a.jpg'); % Chuyển ảnh sang ảnh xám theo công thức được khuyến nghị gray_img = 0.2989 * img(:,:,1) + 0.5870 * img(:,:,2) + 0.1140 * img(:,:,3); % Hiển thị ảnh xám imshow(gray_img); 3. Thử chuyển 1 ảnh thành kiểu HSV hoặc YCrCb. Nhận xét kết quả nếu 1 trong các ma trận mầu (H hoặc S hoặc V ...) bằng 0. % Đọc ảnh từ file img = imread('a.jpg'); % Chuyển ảnh sang không gian màu HSV img_hsv = rgb2hsv(img_rgb); % Hiển thị ma trận màu H (hue) figure; imshow(img_hsv(:,:,1)); title('Hue channel (H)'); 63 % Hiển thị ma trận màu S (saturation) figure; imshow(img_hsv(:,:,2)); title('Saturation channel (S)'); % Hiển thị ma trận màu V (value) figure; imshow(img_hsv(:,:,3)); title('Value channel (V)'); % Chuyển ảnh sang không gian màu YCrCb img_ycbcr = rgb2ycbcr(img_rgb); % Hiển thị ma trận màu Y (luminance) figure; imshow(img_ycbcr(:,:,1)); title('Luminance channel (Y)'); % Hiển thị ma trận màu Cr (red chrominance) figure; imshow(img_ycbcr(:,:,2)); title('Red chrominance channel (Cr)'); % Hiển thị ma trận màu Cb (blue chrominance) figure; imshow(img_ycbcr(:,:,3)); title('Blue chrominance channel (Cb)'); 64 4. Viết lệnh chuyển 1 ảnh RGB sang ảnh nhị phân với các giá trị ngưỡng khác nhau và hiển thị ảnh đó. % Đọc ảnh RGB image = imread('input_image.jpg'); % Chuyển ảnh sang grayscale gray_image = rgb2gray(image); % Thiết lập giá trị ngưỡng threshold_value = 127; % Áp dụng ngưỡng nhị phân binary_image = imbinarize(gray_image, threshold_value/255); % Hiển thị ảnh gốc và ảnh nhị phân figure; subplot(1,2,1), imshow(image), title('Original Image'); subplot(1,2,2), imshow(binary_image), title('Binary Image'); 65