MATLAB cơ bản 9: Vecto (mảng) với file âm thanh

Lu ROm

Administrator
Staff member
25 Tháng bảy 2014
481
119
43
32
One piece
vimach.net
1. Giới thiệu:
- Trong bài này, mình sẽ giới thiệu về xử lý các tệp âm thanh bằng vecto trên matlab. Bài này sẽ giới thiệu cơ bản về sử dụng vecto trên âm thanh và sâu hơn thì sẽ viết tiếp ở bài sau.hi
2. Nội dung:
a, Đọc file âm thanh trên matlab.
- Đầu tiên ta cần phải đọc các file âm thanh cần xử lý và đưa chúng vào matlab. Câu lệnh đọc file: wavread()
- Ví dụ:
Mã:
>> mantle = wavread('C:\SOUND\Clock_mantle.wav');
>> drum = wavread('C:\SOUND\Bogos_Drum.wav');
>> flag = wavread('C:\SOUND\FlagRaising.wav');
>> taps = wavread('C:\SOUND\Taps.wav');
Các bạn có thể tải file âm thanh tại đây

b, Tín hiệu audio - Segment, plot và play

-Ta có nột tín hiệu âm thanh như sau:
Mã:
>> mantle
         0
   -0.0000
         0
   -0.0000
         0
   -0.0000
         0
   -0.0001
   -0.0003
    ...
    0.0006
   -0.0009
    0.0002
    0.0018
- Tín hiệu âm thanh là một tín hiệu khá dài, bây giờ mình sẽ kiểm tra độ dài của tín hiệu một file âm thanh bằng câu lệnh sau:
Mã:
>> length(mantle)
ans =
      302697
- Âm thanh có tỷ lệ lấy mẫu là 22050 ( nó không phải là đĩa CD chất lượng 44,1 kHz), nên chúng ta có thể tính toán thời gian với câu lệnh:
Mã:
>> dur = length(mantle)/22050
dur =
   13.7278
- Vậy thời gian tính được là 13.7278s. Nếu chúng ta muốn lấy một đoạn trong file âm thanh, ví dụ lấy từ giây thứ 5 đến giấy thứ 10, thì ta sử dụng dấu ":" với câu lệnh:
Mã:
>> rate = 22050;
>> m_seg = mantle(rate*5:rate*10);
- Muốn hiển thị hình ảnh tín hiệu của âm thanh, ta dùng lệnh plot:
Mã:
>> plot(m_seg)
mantle_seg_audio_signal.png

- Còn muốn nghe âm thanh thì chúng ta dùng lệnh sound() :
Mã:
>> sound(m_seg, rate);
- Chúng ta có thể nghe ở những tốc độ khác nhau, chất lượng khác nhau, câu lệnh:
Mã:
>> sound(m_seg, rate*2);
>> sound(m_seg, rate*0.5);

c, Âm thanh có 2 kênh tín hiệu.
- Mở một file âm thanh khác, ở đây mình mở file Bogos_Drum.wav :
Mã:
>> [d, fs] = wavread('C:\SOUND\Bogos_Drum.wav');
>> fs
fs =
       11025
- Với fs là tỷ lệ lấy mẫu.
- Hình ảnh tín hiệu âm thanh file âm thanh:
Mã:
>> plot(d);
W76a1CQh3EJTDisV9H9QNxhw6hBb0xTDz4T0oXhLifI=w840-h630-no

- Không giống file âm thanh trên, file này có 2 kênh tín hiệu. Sau đây mình sẽ kiểm tra kích thước:
Mã:
>> size(d)
ans =
       88600           2
- Chúng ta sẽ tách 2 kênh ra: trái và phải. Sau đó hiển thị lê giản đồ với thời gian là trục x. CODE:
Mã:
left = d(:,1);
right = d(:,2);

time = (1/fs)*length(d);
t = linspace(0, time, length(left));
plot(t,left, t, right);
xlabel('time(sec)');
ylabel('signal strength');
DrumAudioTwoChannels_2.png

- Bạn có thể nghe âm thanh ở cả 2 dạng: mono và stereo:
Mã:
>> sound(left, fs);     % mono
>> sound(right, fs);   % mono
>> sound(d, fs);        % stereo
- Chú ý: cần phải lắng nghe thật kỹ thì mới cảm nhận được.hi
- Gía trị mảng của từng kênh:
Mã:
>> left(10:15)
ans =
    0.0023
   -0.0052
    0.0231
    0.0658
    0.0559
    0.0604

>> right(10:15)
ans =
    0.0053
   -0.0115
    0.0527
    0.1541
    0.1322
    0.1362

>> d(10:15,:)
ans =
    0.0023    0.0053
   -0.0052   -0.0115
    0.0231    0.0527
    0.0658    0.1541
    0.0559    0.1322
    0.0604    0.1362
- Như chúng ta thấy, cấu trúc của mảng d được tạo thành từ 2 mảng left và right. Vậy làm thế nào để tạo mảng d từ 2 mang left và right phí trên, chúng ta sẽ sử dụng câu lệnh sau:
Mã:
>> d_stereo = [left right];
>> size(d)
ans =
       88600
- Muốn nghe file âm thanh lặp lại nhiều lần thì chúng ta dùng câu lệnh sau:
Mã:
>> d_repeat = [d_stereo ; d_stereo; d_stereo];
>> sound(d_repeat, fs);

MORE....