Hướng dẫn
thực hành
Bộ môn Khoa học máy tính
Khoa Công nghệ thông tin
•
Đọ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.
Nội dung
Đọ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
Fs
nbits
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
/>sAndDataBrushing.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ều
hfile = '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ều
hfile = '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)