HỌC VIỆN KỸ THUẬT QUÂN SỰ KHOA VÔ TUYẾN ĐIỆN TỬ BÀI THỰC HÀNH XỬ LÝ TÍN HIỆU SỐ VỚI MATLAB – BÀI HÀ NỘI - 2013 BÀI THỰC HÀNH 2: Ứng dụng phép biến đổi Fourier rời rạc (DFT) phân tích phổ cho tín hiệu rời rạc có chiều dài hữu hạn: Hàm phân tích phổ fft Cú pháp thường dùng: X=fft(x) Với x tín hiệu rời rạc có chiều dài N, X DFT x, số mẫu X N Để lấy phổ biên độ, sử dụng hàm abs(X); phổ pha- dùng hàm angle(X) Bài 1: Mỗi học viên lấy ngày, tháng, năm sinh để tạo dãy rời rạc theo qui tắc sau: Năm – tháng - ngày sinh Sau sử dụng DFT phân tích phổ cho dãy Vẽ đồ thị ghi đầy đủ theo hướng dẫn, bao gồm tên học viên Tên học viên là: ĐẶNG SONG TOÀN, sinh năm 1980, tháng 05, ngày 10 dãy rời rạc x= [1 0 0] Bài làm : Nhập ngày tháng năm sinh vào dãy x theo yêu cầu ta có: >>x=[1 0 0] ; >> X=fft(x) X= Columns through 24.0000 3.8284 - 9.8284i -8.0000 -14.0000i -1.8284 + 4.1716i -4.0000 Columns through -1.8284 - 4.1716i -8.0000 +14.0000i 3.8284 + 9.8284i >>pho_bien_do=abs(X) pho_bien_do = 24.0000 10.5477 16.1245 4.5547 4.0000 4.5547 16.1245 10.5477 >>pho_pha=angle(X) pho_pha = -1.1994 -2.0899 1.9839 3.1416 -1.9839 2.0899 * Nhận xét : tín hiệu thực nên phổ biên độ đối xứng Sử dụng hàm stem để vẽ đồ thị phổ biên độ phổ pha : >>stem(pho_bien_do) >>title('pho bien do,DANG SONG TOAN, 10/05/1980'); Hình 13: Phổ biên độ 1.1994 >>stem(pho_pha) >> title('pho pha,DANG SONG TOAN, 10/05/1980'); Hình 14 Phổ pha Khi thực DFT, ta nhận mẫu phổ cách quãng 2π / N (tính theo tần số chuẩn hóa) Số thứ tự mẫu phổ 07 Như ta cần tạo lưới tần số (tương tướng với số đo trục hoành) sau: Trên matlab ta thực lệnh sau: >>f=2*pi/8*[0:1:7] f= 0.7854 1.5708 2.3562 3.1416 3.9270 4.7124 >> stem(f,pho_bien_do) >> title('pho bien do,DANG SONG TOAN, 10/05/1980'); >>xlabel('tan so chuan hoa f'); 5.4978 Hình 15: Phổ biên độ với trục hoành tần số chuẩn hóa >> stem(f,pho_pha) >> title('pho pha,DANG SONG TOAN, 10/05/1980'); >>xlabel('tan so chuan hoa f'); Hình 16: Phổ pha với trục hoành tần số chuẩn hóa Bài : - Hãy nêu rõ tác dụng ý nghĩa dòng lệnh phân tích phổ cho tín hiệu thoại Vì lại cần lấy nửa số mẫu? - Mỗi học viên tự tạo file wav , sau thực phân tích phổ cho file Vẽ đồ thị phổ biên độ theo hướng dẫn Nội dung file: “ Tên là…… Lớp…….” Bài làm : MatLab làm việc với file âm có phần mở rộng “wav”, mã hóa kiểu PCM (Pulse Code Modulation) Để thực hành phần này, file âm thanh, chẳng hạn example.wav, cần phải copy vào thư mục hành Thư mục hành thông thường thư mục WORK, thư mục MATLAB…(copy file vào thư mục Matlab Document) Lý phân tích phổ ta cần lấy nửa số mẫu là: âm ( tiếng nói ) tín hiệu thực nên phổ chúng có tính đối xứng, thực phân tích phổ ta cần lấy nửa số mẫu Chẳng hạn thư mục hành MATLAB có chứa file âm song toan.wav , file mang nội dung: “Tên ĐẶNG SONG TOÀN lớp đa - Bài tập xử lý tín hiệu số” Sử dụng lệnh wavread để đọc file: >> [s,fs]= wavread(‘song toan.wav’); >> [s,fs]= wavread(‘song toan’); (Lưu ý đặt dấu ; đằng sau lệnh!) Sau thực lệnh này, biến s chứa liệu âm thanh, biến fs chứa tần số rời rạc hóa Để xem tần số rời rạc hóa, ta nhập vào: >>fs Fs=8000 Như file âm song toan.wav có tần số rời rạc hóa 8Khz Bây thực phân tích phổ cho tín hiệu s: Trên cửa sổ lệnh Matlab ta gõ lệnh sau: >> N=length(s); >> M=round(N/2); >> S=fft(s); >> f=fs*(1:M)/N; % Lấy lưới tần số vật lý ( đo Hz) >> PhoBD=abs(S); >> Pho=PhoBD(1:M);% Chỉ lấy nửa số mẫu >> plot(f,Pho) >> title('pho cua file am Song toan.wav,DANG SONG TOAN M-T-A'); Ta nhận : Đồ thị phổ âm sau: Hình 17: Phổ pha âm than * Nhận xét: Từ hình ta nhận thấy phổ file âm song toan.wav tập trung chủ yếu khu vực 500-1000 Hz, tần số cực đại phổ khoảng 4000 Hz ... 3. 828 4 - 9. 828 4i -8.0000 -14.0000i -1. 828 4 + 4.1716i -4.0000 Columns through -1. 828 4 - 4.1716i -8.0000 +14.0000i 3. 828 4 + 9. 828 4i >>pho_bien_do=abs(X) pho_bien_do = 24 .0000 10.5477 16. 124 5 4.5547... ta thực lệnh sau: >>f =2* pi/8*[0:1:7] f= 0.7854 1.5708 2. 35 62 3.1416 3. 927 0 4.7 124 >> stem(f,pho_bien_do) >> title('pho bien do,DANG SONG TOAN, 10/05/1980'); >>xlabel('tan so chuan hoa f'); 5.4978... file âm song toan.wav , file mang nội dung: “Tên ĐẶNG SONG TOÀN lớp đa - Bài tập xử lý tín hiệu số” Sử dụng lệnh wavread để đọc file: >> [s,fs]= wavread(‘song toan.wav’); >> [s,fs]= wavread(‘song