快速傅立叶在matlab中检测钢琴频率

时间:2017-02-18 17:49:05

标签: matlab audio signal-processing fft bandpass-filter

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

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

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条件,如果匹配,然后将密钥的符号写入工作表。

如果有人可以向我解释代码和过程,因为我之前从未使用过matlab,并且在其命令中有点弱

1 个答案:

答案 0 :(得分:2)

音高与频谱频率不同(由裸FFT幅度返回)。重复/周期性(“倾斜”)波形不必看起来像正弦波。

FFT返回的所有频率可能与感知音调完全不同(参见“心理声学”和“缺少基础”)。最有可能是所有高次谐波,但也可能是一些不和谐的泛音。对于带有“大”琴弦(钢琴和低音吉他等)的弦乐器来说尤其如此。

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