聲音檔和 Video 檔的讀與寫 (by Matlab) 作者: 丁建均 國立台灣大學電信工程學研究所
一、聲音檔 (*.wav) 的讀取 電腦中,大部分的聲音檔都是 *.wav 的型態 讀取: wavread 例: [x, fs] = wavread('C:\WINDOWS\Media\ringin.wav'); 可以將 ringin.wav 以數字向量 x 來呈現。 fs: sampling frequency 這個例子當中 size(x) = 9981 1 fs = 11025 思考: 所以,取樣間隔多大? 這個聲音檔有多少秒?
畫出 x 的波型: time = [0:length(X)-1]/fs; plot(time, x) 注意: *.wav 檔中所讀取的資料,值都在 1 和 +1 之間
一個聲音檔如果太大,我們也可以只讀取它部分的點 [x, fs]=wavread('C:\WINDOWS\Media\ringin.wav', [4001 5000]); % 讀取第4001至5000點 [x, fs, nbits] = wavread('C:\WINDOWS\Media\ringin.wav'); nbits: x(n) 的bit 數 第一個bit : 正負號,第二個bit : 21,第三個bit : 22, ….., 第 n 個bit : 2nbits +1, 所以 x 乘上2nbits 1 是一個整數 以鈴聲的例子, nbits = 8,所以 x 乘上 128是個整數
有些聲音檔是 雙聲道 (Stereo)的型態 (俗稱立體聲) 例: [x, fs]=wavread('C:\WINDOWS\Media\notify.wav'); size(x) = 29823 2 fs = 22050
二、聲音的播放 (1) wavplay(x): 將 x 以 11025Hz 的頻率播放 (時間間隔 = 1/11025 = 9.07 105 秒) (2) sound(x): 將 x 以 8192Hz 的頻率播放 (3) wavplay(x, fs) 或 sound(x, fs) 或 audioplayer(x , fs): 將 x 以 fs Hz 的頻率播放 Note: (1)~(3) 中 x 必需是1 個column (或2個 columns),且 x 的值應該 介於 1 和 +1 之間 (4) soundsc(x, fs): 自動把 x 的值調到 1 和 +1 之間 再播放
三、製作 *.wav 檔: 用 wavwrite wavwrite(x, fs, waveFile) 將數據 x 變成一個 *.wav 檔,取樣速率為 fs Hz x 必需是1 個column (或2個 columns) x 值應該 介於 1 和 +1 之間 若沒有設定fs,則預設的fs 為 8000Hz
四、錄音 範例程式: 錄音之前,要先將電腦接上麥克風,且確定電腦有音效卡 (部分的 notebooks 不需裝麥克風即可錄音) Sec = 3; Fs = 8000; recorder = audiorecorder(Fs, 16, 1); recordblocking(recorder, Sec); audioarray = getaudiodata(recorder); 執行以上的程式,即可錄音。 錄音的時間為三秒,sampling frequency 為 8000 Hz 錄音結果為 audioarray,是一個 column vector (如果是雙聲道,則是兩個 column vectors)
範例程式 (續): 指令說明: wavplay(audioarray, Fs); % 播放錄音的結果 t = [0:length(audioarray)-1]./Fs; plot (t, audioarray‘); % 將錄音的結果用圖畫出來 xlabel('sec','FontSize',16); wavwrite(audioarray, Fs, ‘test.wav’) % 將錄音的結果存成 *.wav 檔 指令說明: recorder = audiorecorder(Fs, nb, nch); (提供錄音相關的參數) Fs: sampling frequency, nb: using nb bits to record each data nch: number of channels (1 or 2)
recordblocking(recorder, Sec); (錄音的指令) recorder: the parameters obtained by the command “audiorecorder” Sec: the time length for recording audioarray = getaudiodata(recorder); (將錄音的結果,變成 audioarray 這個 column vector,如果是雙聲道,則 audioarray 是兩個 column vectors) 以上這三個指令,要並用,才可以錄音
五、MP3 檔的讀和寫 要先去這個網站下載 mp3read.m, mp3write.m 的程式 http://www.mathworks.com/matlabcentral/fileexchange/13852-mp3read-and-mp3write 程式原作者:Dan Ellis mp3read.m : 讀取 mp3 的檔案 mp3write.m : 製作 mp3 的檔案 不同於 *.wav 檔 (未壓縮過的聲音檔),*.mp3 是經過 MPEG-2 Audio Layer III的技術壓縮過的聲音檔
範例: %% Write an MP3 file by Matlab fs=8000; % sampling frequency t = [1:fs*3]/3; filename = ‘test’; Nbit=32; % number of bits per sample x= 0.2*cos(2*pi*(500*t+300*(t-1.5).^3)); mp3write(x, fs, Nbit, filename); % make an MP3 file test.mp3 %% Read an MP3 file by Matlab [x1, fs1]=mp3read('phase33.mp3'); x2=x1(577:end); % delete the head sound(x2, fs1)
六、影像檔和 Video 檔的讀和寫 Image 檔讀取: imread Image 檔顯示: imshow, image, imagesc Image 檔製作: imwrite 基本概念:灰階影像在 Matlab 當中是一個矩陣 彩色影像在 Matlab 當中是三個矩陣,分別代表 Red, Green, Blue Video 檔讀取: aviread
範例一: im=imread('C:\Program Files\MATLAB\R2007a\pic\Pepper.bmp'); (注意,如果 Pepper.bmp 是個灰階圖,im 將是一個矩陣) size(im) ans = 256 256 (用 size 這個指令來看 im 這個矩阧的大小) image(im); colormap(gray(256)) (如果是灰階的圖,可以用這兩行指令將圖顯示出來)
範例二: im1=double(im)*0.5; (注意:若要對影像作加減乘除,要加 double( )) imwrite(im1, 'C:\Program Files\MATLAB\R2007a\pic\Pepper1.bmp') (將 im1 存成另外一個圖檔) 範例二: im2=imread('C:\Program Files\MATLAB\R2007a\pic\Pepper512c.bmp'); (讀取另一個圖檔,這個圖檔是個彩色檔) size(im2) ans = 512 512 3 (注意,由於這個圖檔是個彩色的,所以 im2 將由三個矩陣複合而成)
image(im2); (如果是彩色的圖,用這個指令就可以將圖顯示出來) image(im2(:, :, 1)); colormap(gray(256)) (如果只想顯示其中紅色的部分,可以用這二行指令)
im3=zeros(512, 512, 3); im3(:, :, 1) = double(im2(:, :, 1))*0.6 + double(im2(:, :, 2))*0.4; im3(:, :, 2) = double(im2(:, :, 2))*0.6 + double(im2(:, :, 3))*0.4; im3(:, :, 3) = double(im2(:, :, 3))*0.6 + double(im2(:, :, 1))*0.4; (im3 和 im2 相似,只是將顏色改變) imwrite(im3/256, 'C:\Program Files\MATLAB\R2007a\pic\Pepper2c.bmp') (將 im3 存成另外一個圖檔,注意,要先 除以 256) (im3 必需是由 3 個二維矩陣複合而成的函式)