1)用mp3錄音,生成檔案cricket.wav,把該檔案放到matlab資料夾裡面(就是你開啟matlab後中間頂部的地址)。
2)使用如下程式,做波形顯示以及fft變換。[y,Fs,bits]=wavread("cricket.wav");%讀出訊號,取樣率和取樣位數。y=y(:,1);%我這裡假設你的聲音是雙聲道,我只取單聲道作分析,如果你想分析另外一個聲道,請改成y=y(:,2)sigLength=length(y);Y = fft(y,sigLength);Pyy = Y.* conj(Y) / sigLength;halflength=floor(sigLength/2);f=Fs*(0:halflength)/sigLength;figure;plot(f,Pyy(1:halflength+1));xlabel("Frequency(Hz)");t=(0:sigLength-1)/Fs;figure;plot(t,y);xlabel("Time(s)");
3)頻率看頻譜就有了,聲音間隔看聲音波形,週期看聲音波形。
4)關於去噪聲。a)如果噪聲是特定頻率的週期噪聲(periodic noise),比如說50hz,那麼你可以用matlab的filter,作一個低通、高通、帶通或者帶阻濾波。b)如果聲音是高斯白噪聲。那就用自適應濾波(adaptive filter,wiener filter)。這裡涉及到對噪聲的取樣、計算特徵值以及決定階數的問題。c)幸好我們可以“耍賴”——用cool editor。用它開啟wav檔案,用滑鼠把一段噪聲圈起來,取樣,然後直接選擇去噪就可以了。各大網站有介紹。例子:matlab去除50hz噪聲。我用電腦錄了一段聲音,裡面有50hz的週期噪聲(因為受交流電干擾)。而我自己的聲音訊率最低是90hz。我使用了一個10階butterworth高通濾波器,邊帶是70hz(介於50跟90之間)。問題是,這不能直接用。因為聲音檔案的取樣率是22k,70相對於22k來說太小了。所以我得先把我的聲音欠取樣,然後再濾波,然後再插值。程式如下。[k,Fs,bits]=wavread("mywav.wav");k=k(:,1);y_temp=k(1:90000);dfactor=3;y=decimate(y_temp,dfactor);[b,a] = butter(10,70/(Fs/(dfactor*2)),"high");y=filter(b,a,y);y=interp(y,dfactor);sigLength=length(y);Y = fft(y,sigLength);Pyy = Y.* conj(Y) / sigLength;halflength=floor(sigLength/2);f=Fs*(0:halflength)/sigLength;figure;plot(f,Pyy(1:halflength+1));xlabel("Frequency(Hz)");sigLength=length(y_temp);Y = fft(y_temp,sigLength);Pyy = Y.* conj(Y) / sigLength;halflength=floor(sigLength/2);f=Fs*(0:halflength)/sigLength;figure;plot(f,Pyy(1:halflength+1));xlabel("Frequency(Hz)");t=(0:sigLength-1)/Fs;figure;plot(t,y,t,y_temp);xlabel("Time(s)");wavplay(y,Fs);wavplay(y_temp,Fs);5)回放:使用wavplay函式wavplay(y,Fs);
1)用mp3錄音,生成檔案cricket.wav,把該檔案放到matlab資料夾裡面(就是你開啟matlab後中間頂部的地址)。
2)使用如下程式,做波形顯示以及fft變換。[y,Fs,bits]=wavread("cricket.wav");%讀出訊號,取樣率和取樣位數。y=y(:,1);%我這裡假設你的聲音是雙聲道,我只取單聲道作分析,如果你想分析另外一個聲道,請改成y=y(:,2)sigLength=length(y);Y = fft(y,sigLength);Pyy = Y.* conj(Y) / sigLength;halflength=floor(sigLength/2);f=Fs*(0:halflength)/sigLength;figure;plot(f,Pyy(1:halflength+1));xlabel("Frequency(Hz)");t=(0:sigLength-1)/Fs;figure;plot(t,y);xlabel("Time(s)");
3)頻率看頻譜就有了,聲音間隔看聲音波形,週期看聲音波形。
4)關於去噪聲。a)如果噪聲是特定頻率的週期噪聲(periodic noise),比如說50hz,那麼你可以用matlab的filter,作一個低通、高通、帶通或者帶阻濾波。b)如果聲音是高斯白噪聲。那就用自適應濾波(adaptive filter,wiener filter)。這裡涉及到對噪聲的取樣、計算特徵值以及決定階數的問題。c)幸好我們可以“耍賴”——用cool editor。用它開啟wav檔案,用滑鼠把一段噪聲圈起來,取樣,然後直接選擇去噪就可以了。各大網站有介紹。例子:matlab去除50hz噪聲。我用電腦錄了一段聲音,裡面有50hz的週期噪聲(因為受交流電干擾)。而我自己的聲音訊率最低是90hz。我使用了一個10階butterworth高通濾波器,邊帶是70hz(介於50跟90之間)。問題是,這不能直接用。因為聲音檔案的取樣率是22k,70相對於22k來說太小了。所以我得先把我的聲音欠取樣,然後再濾波,然後再插值。程式如下。[k,Fs,bits]=wavread("mywav.wav");k=k(:,1);y_temp=k(1:90000);dfactor=3;y=decimate(y_temp,dfactor);[b,a] = butter(10,70/(Fs/(dfactor*2)),"high");y=filter(b,a,y);y=interp(y,dfactor);sigLength=length(y);Y = fft(y,sigLength);Pyy = Y.* conj(Y) / sigLength;halflength=floor(sigLength/2);f=Fs*(0:halflength)/sigLength;figure;plot(f,Pyy(1:halflength+1));xlabel("Frequency(Hz)");sigLength=length(y_temp);Y = fft(y_temp,sigLength);Pyy = Y.* conj(Y) / sigLength;halflength=floor(sigLength/2);f=Fs*(0:halflength)/sigLength;figure;plot(f,Pyy(1:halflength+1));xlabel("Frequency(Hz)");t=(0:sigLength-1)/Fs;figure;plot(t,y,t,y_temp);xlabel("Time(s)");wavplay(y,Fs);wavplay(y_temp,Fs);5)回放:使用wavplay函式wavplay(y,Fs);