Matlab Audio
Transcript of Matlab Audio
HƯỚNG DẪN THỰC HÀNH
Dương Chí Nhân
Quách Khả Gia
Bộ môn Khoa học máy tính
Khoa Công nghệ thông tin
Nội dung•Đ
ọc ghi file audio (wav).
•Hiển thị sóng
•Một số thao tác với phần hiển thị sóng
•Chuyển đổi sáng miền tần số DCT, DFT.
Đọc file wav
Để đọc/load một file audio (.wav) dùng hàm wavread với cú pháp như sau:◦ y = wavread(filename) ◦ [y, Fs, nbits] = wavread(filename) ◦ [y, Fs, nbits, opts] = wavread(filename)
Trong đó◦y: dữ liệu các sample của file wav◦Fs : sample rate (Hz)◦nbits: số lượng bit trên 1 sample◦opts: 1 cấu trúc lưu những thông tin khác của file
wav
Đọc file wav
Ví dụ:
Fs
nbits
Đọc file wav
size = wavread(filename, 'size')
siz = [samples channels]
Lấy thông tin khác của file wav
[m d] = wavfinfo(filename)◦m : chuỗi cho biết có phải đây là file wav hay
không◦d: thông tin về số lượng sample và số channel
của file
Ví dụ đọc và play file wav// hfile lưu đường dẫn đến file wav
hfile = 'H:\Vi toi la chang ngoc.wav';
// đọc file wav
[y, Fs, nbits, readinfo] = wavread(hfile);
// play file wav
p = audioplayer(y, Fs);
play(p);
// stop file wave
stop(p);
ghi file wav
Để ghi/lưu một file audio (.wav) dùng hàm wavwrite có cú pháp như sau:
wavwrite(y,filename)wavwrite(y,Fs,filename)wavwrite(y,Fs,N,filename)
Ví dụ ghi file wav
// đường dẫn đến file wav
hfile = 'H:\Vi toi la chang ngoc.wav';
// đọc file wave
[y, Fs, nbits, readinfo] = wavread(hfile);
// đường dẫn file wav lưu
hfile1 = 'H:\Vi toi la chang ngoc1.wav';
// ghi file wave
wavwrite(y, Fs, hfile1)
Hiển thị sóngĐể hiển thị sóng của một file wav, bạn có thể dùng plot
với cú pháp như sau◦ plot(Y)
Ví dụ:
// tên file wave
hfile = 'handel.wav';
// đọc file wave
[y, Fs, nbits, readinfo] = wavread(hfile);
// hiển thị sóng
plot(y)
Một số thao tác khi hiển thị sóng
http://www.mathworks.com/support/2009a/matlab/7.8/demos/LinkedPlotsAndDataBrushing.html
Chuyển đổi sang miền tần số DCTĐể chuyển tín hiệu một chiều sang miền tần số DCT,
dùng hàm dct với cú pháp như sau:
y = dct(u)
◦ u : tín hiệu một chiều.◦ y : kết quả biến đổi dct2 trả về.
Ví dụ:
// phát sinh mảng tín hiệu 1 chiều
a = rand(100,1);
// biến đổi dct 1 chiều
y0 = dct(a);
figure,plot(abs(y0)),title('abs(DCT)');
Chuyển đổi sang miền tần số DCTĐể biến đổi ngược lại từ miền DCT, dùng hàm idct với
cú pháp như sau:
y = idct(u)
◦ u : tín hiệu trong miền dct.◦ y : kết quả trả về của biến đổi dct ngược.
Ví dụ:
// biến đổi dct ngược
arec0 = idct(y0);
figure,plot(abs(arec0)),title('abs(IDCT)');
Chuyển đổi sang miền tần số DCTĐể chuyển tín hiệu 2-chiều sang miền tần số DCT, dùng
hàm dct2 với cú pháp như sau:
y = dct2(u)
◦ u : tín hiệu 2-chiều.◦ y : kết quả biến đổi dct2 trả về.
Ví dụ:
// load một ảnh màu
RGB = imread('Love friend.jpg');
I = rgb2gray(RGB); // chuyển ảnh màu sang gray
J = dct2(I); // biến đổi dct2
// hiển thị log của abs(J)
imshow(log(abs(J)),[]), colormap(jet(64)), colorbar
Chuyển đổi sang miền tần số DCTĐể biến đổi ngược lại từ DCT, dùng hàm idct2 với cú
pháp như sau:
y = idct2(u)
◦ u : tín hiệu 2-chiều từ miền dct.◦ y : kết quả biến đổi dct ngược trả về.
Ví dụ: (tiếp ví dụ trước)
K = idct2(J); // biến đổi dct2 ngược
figure, imshow(I) // hiển thị ảnh I
figure, imshow(K,[0 255]) // hiển thị ảnh biến đổi ngược lại
Chuyển đổi sang miền tần sốChuyển tín hiệu 1 chiều sang miền tần số fourier rời rạc
(DFT), dùng hàm fft với cú pháp như sau:
y = fft(u)◦ u : vector cần chuyển sang DFT.◦ y: kết quả biến đổi DFT.
Ví dụ
// phát sinh mảng tín hiệu 1 chiều
a = rand(100,1);
// biến đổi fft
y0 = fft(a);
figure,plot(abs(y0)),title('abs(DFT)');
Chuyển đổi sang miền tần sốĐể biến đổi ngược lại từ miền tần số fourier rời rac
(DFT), dùng hàm ifft với cú pháp như sau:
y = ifft(u)◦ u : vector biểu diễn giá trị ở miền DFT.◦ y: kết quả biến đổi DFT ngược.
Ví dụ: (tiếp ví dụ trước)
// biến đổi ifft ngược
arec0 = ifft(y0);
figure,plot(abs(arec0)),title('abs(IDFT)');
Chuyển đổi sang miền tần sốChuyển tín hiệu 2 chiều sang miền tần số fourier rời rac
(DFT), dùng hàm fft2 với cú pháp như sau:
y = fft2(u)◦ u : tín hiệu 2 chiều cần chuyển sang DFT.◦ y: kết quả biến đổi DFT.
Ví dụ
// phát sinh mảng tín hiệu 1 chiều
a = rand([100,100]);
// biến đổi fft2
y0 = fft2(a);
Chuyển đổi sang miền tần sốĐể biến đổi ngược lại từ miền tần số fourier rời rạc
(DFT), dùng hàm ifft2 với cú pháp như sau:
y = ifft2(u)◦ u : tín hiệu 2 chiều ở miền DFT.◦ y: kết quả biến đổi DFT ngược.
Ví dụ: (tiếp ví dụ trước)
// biến đổi fft2 ngược
arec0 = ifft2(y0);
Các bộ lọc
Để lọc trên tín hiệu một chiều, người ta dùng hàm filter với cấu trúc như sau
y = filter(b,a,X)[y,zf] = filter(b,a,X)[y,zf] = filter(b,a,X,zi)y = filter(b,a,X,zi,dim)[...] = filter(b,a,X,[],dim)
Ví dụ lọc tín hiệu 1 chiềuhfile = 'handel.wav';
[y, Fs, nbits, readinfo] = wavread(hfile);
// ma trận lọc
windowSize = [0.2 0.2 0.2 0.2 0.2];
// lọc
z = filter(windowSize,1,y);
// hiển thi kết quả
figure, plot(y)
figure, plot(z)
Các bộ lọc
Để lọc trên tín hiệu hai chiều, người ta dùng hàm filter2 với cấu trúc như sau
Y = filter2(h,X) Y = filter2(h,X,shape)
Ví dụ lọc tín hiệu 2 chiềuhfile = 'handel.wav';
[y, Fs, nbits, readinfo] = wavread(hfile);
// ma trận lọc
windowSize = [0.2 0.2 0.2 ; 0.2 0.2 0.2];
// lọc
z = filter2(windowSize,y);
// hiển thi kết quả
figure, plot(y)
figure, plot(z)