2017-02-18 89 views
-1

我有快速傅立葉變換的基本知識和它轉換時域到頻域獲得或在信號中的所有頻率樣本錄製的聲音......快速傅立葉檢測鋼琴頻率在MATLAB

我想創建一個應用程序,檢測錄製的鋼琴樂譜中的所有頻率,並將它們與原始檢測到的鋼琴音符匹配,如果它捕捉到匹配,則會根據此概念寫入鋼琴樂譜...我有此代碼,但我不是確定它是否工作不正常...

C中音最初在一個三角鋼琴頻率爲261.7,但是當我使用它時,輸出改變了聲音的幅度(例如:261/262/270 ... E TC)

[x,Fs]= readaudio('c4,wav'); 
    xdft = fft(readaudio(c4.wav); 
    [~,index] = sort(abs(xdft() , 'descend')); 
    (index(1)*Fs)/length(x) - (fs/length(x)); 

此外,我曾試圖實現這樣的代碼訪問的許多問題和論壇,但我不知道如何將它應用到我的總體思路。(這裏是代碼)

[y,Fs] =audioread('49.wav'); 
    fcuts = [430 438 442 450];    % Frequency Vector (Hz) 
    mags = [0 1 0];  % Magnitude (Defines Passbands & Stopbands) 
    devs = [0.05 0.01 0.05];     % Allowable Deviations 
    [n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,Fs); 
    n = n + rem(n,2); 
    hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'scale'); 
    figure(1) 
    freqz(hh, 1, 2^14, Fs) 
    set(subplot(2,1,1), 'XLim', [0 500])% Set Frequency Axis To Show0-500    Hz 
    set(subplot(2,1,2), 'XLim', [0 500])% Set frequency Axis To Show 0-500 Hz 
    y_filtered = fftfilt(hh, y); 

但基本上我不明白它,以及如何改變頻率捕捉...但我的願景,我會做的是將所有的頻率我從記錄文件傳遞到所有鍵過濾器和使用條件如果然後匹配會將該鍵的符號寫入表單。

請,如果有人可以解釋代碼和過程對我來說,因爲我從來沒有在命令中使用MATLAB前一種弱

+3

首先你需要了解頻率和音調之間的差異。 –

+0

是與第一個代碼還是第二個?請詳細說明我需要的路徑:)因爲我通常在matloab編程方面遇到麻煩:D –

+1

與Matlab沒有關係 - 您對頻率和音高有什麼基本的誤解。 –

回答

2

間距不一樣的光譜頻率(如裸FFT幅度返回) 。重複/週期性(「傾斜」)波形不必看起來像正弦波。

FFT返回的所有頻率都可能與感知的音高完全不同(請參閱「心理聲學」和「缺失基頻」)。最可能的是所有高次諧波,但也可能有一些不諧波泛音。對於帶有「大」弦(鋼琴和低音吉他等)的絃樂器尤其如此。

所以問題不在於你的代碼,而在於你沒有使用基音檢測/估計算法,而是一個光譜頻率峯值檢測器。