2012-11-27 51 views
2

我對Matlab很新穎,我正在嘗試編寫一個基於簡單頻率的語音檢測算法。最終目標是在wav文件上運行腳本,併爲每個語音段輸出開始/結束時間。如果使用代碼:Matlab:在音頻數據幀中查找主頻率

fr = 128; 
[ audio, fs, nbits ] = wavread(audioPath); 
spectrogram(audio,fr,120,fr,fs,'yaxis') 

我得到一個有用的頻率強度隨時間變化曲線圖是這樣的:

enter image description here

通過看它,它很容易看到,當出現語音。我可以編寫一個算法,通過查看每個x軸幀來自動化檢測過程,計算出哪些頻率占主導地位(具有最高強度),測試主頻率以查看它們是否足夠超過某個強度閾值(圖中黃色和紅色之間的差異),然後將該幀標記爲語音或非語音。一旦幀被標記,就很容易得到每個語音段的開始/結束時間。

我的問題是,我不知道如何訪問該數據。我可以使用代碼:

[S,F,T,P] = spectrogram(audio,fr,120,fr,fs); 

獲得光譜圖的所有功能,但該代碼的結果對我沒有任何意義。 S,F,T,P數組和矩陣的界限與我在圖上看到的任何東西都沒有關係。我瀏覽過幫助文件和API,但是當我們開始討論算法名稱和首字母縮略詞時,我感到困惑 - 我的DSP背景非常有限。

如何獲得頻譜圖分析每幀的頻率強度值數組?我可以從那裏找出其餘部分,我只需要知道如何獲取適當的數據。

回答

1

Why don't you use fft with `fftshift

%% Time specifications: 
    Fs = 100;      % samples per second 
    dt = 1/Fs;      % seconds per sample 
    StopTime = 1;     % seconds 
    t = (0:dt:StopTime-dt)'; 
    N = size(t,1); 
    %% Sine wave: 
    Fc = 12;      % hertz 
    x = cos(2*pi*Fc*t); 
    %% Fourier Transform: 
    X = fftshift(fft(x)); 
    %% Frequency specifications: 
    dF = Fs/N;      % hertz 
    f = -Fs/2:dF:Fs/2-dF;   % hertz 
    %% Plot the spectrum: 
    figure; 
    plot(f,abs(X)/N); 
    xlabel('Frequency (in hertz)'); 
    title('Magnitude Response'); 

爲什麼你想使用複雜的東西?

一個很好的和完整的解決方案可以在https://dsp.stackexchange.com/questions/1522/simplest-way-of-detecting-where-audio-envelopes-start-and-stop

+0

我很困惑 - 哪裏實際音頻數據就進入方程? – Cbas

+0

我的意思是,我知道我可以通過做'q = 10 * log(abs(fftshift(fft(audio))))'來得到方程給我的任何數據,'但是我不確定哪些數據那是。這是一個335570x1矢量,最小值爲0.0218,最大值爲497,它應該表示什麼? – Cbas

+0

你應該將緩衝區分成更小的數據包並分析每個數據包 – 0x90

1

發現有一個看看STFT(短時傅立葉變換)或(甚至更好)的DWT(離散小波變換),這兩者都將估計頻內容數據塊(窗口),如果您想要檢測某些(「語音」)頻率的幅度突然變化,那麼這就是您所需要的。

因爲它計算在信號的整個持續時間的相對頻率含量不要使用FFT,使得不可能確定特定頻率信號中的出錯。

1

你正在做的事叫做言語行爲檢測。對此有很多方法,最簡單的可能是一個簡單的帶通濾波器,它可以傳遞語音最強的頻率,這個頻率在1kHz到8kHz之間。然後,您可以將總信號能量與帶通限制進行比較,如果大部分能量位於語音頻帶中,則將幀分類爲語音。這是一種選擇,但也有其他選擇。

要獲得峯值頻率,您可以使用FFT獲取頻譜,然後使用peakdetect.m。但這是一個非常天真的方法,因爲你會得到很多峯值,屬於基本正弦的諧波頻率。

理論上你應該使用某種倒頻譜(也稱爲頻譜),它將頻譜中諧波頻率的週期性降低到基頻,然後將其用於峯值檢測。或者,您可以使用現有的工具,例如praat

請注意,語音分析通常在30ms左右的幀內完成,步進10ms。通過確保在N個連續幀中檢測到共振峯,您可以進一步濾除錯誤檢測。

0

如果你還在使用內置的STFT功能,然後繪製您可以使用的最大以下命令

plot(T,(floor(abs(max(S,[],1)))))