快速傅里叶检测matlab中的钢琴频率

Fast Fourier to detect piano frequency in matlab

我对快速傅立叶有基本的了解,它将时域转换为频域以获得信号或录制声音中的所有频率样本...

我想创建一个应用程序来检测录制的钢琴曲中的所有频率,并将它们与最初检测到的钢琴音符相匹配,如果它匹配,将根据这个概念编写钢琴 sheet.. .我有这个代码,但我不确定它是否不能正常工作...

C 中音最初在三角钢琴上的频率为 261.7,但当我使用它时,输出随声音的振幅而变化(例如:261/262/270 ...等)

   [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);

但基本上我不明白它以及如何更改频率以捕捉......但我的愿景是将我从录制文件中获得的所有频率传递给所有按键过滤器和使用 if 条件 if 匹配则将键的符号写入 sheet。

请有人能向我解释代码和过程,因为我以前从未使用过 matlab,而且它的命令有点弱

音调与频谱频率不同(由纯 FFT 幅度返回)。 Repeated/periodic ("pitched") 波形不必看起来像正弦波。

FFT 返回的所有频率都可能与感知到的音高完全不同(参见 "psychoacoustics" 和 "missing fundamental")。很可能是所有高次谐波,但也可能是一些不和谐的泛音。对于具有 "big" 弦的弦乐器(钢琴和贝斯吉他等)

尤其如此

所以问题不在于您的代码,而在于您没有使用音调 detection/estimation 算法,而是频谱频率峰值检测器。