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

标签 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 条件如果然后 match 会将 key 的符号写入工作表。

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

最佳答案

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

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

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

关于matlab - 快速傅里叶在matlab中检测钢琴频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42318599/

相关文章:

matlab - 生成有限差分的矩阵

matlab - 在 MATLAB 中绘制 3D 空间中的矩阵,而不使用网格和冲浪类型的绘图

c# - 如何在Windows Phone 8.1的本地存储中将SpeechSynthesisStream保存为音频

matlab - fft(DFT) x 轴的单位

matlab - 为什么需要在 Matlab 中调用 rng() 两次

matlab - 在矩阵的每一行中找到前 N 个非零元素

比较这两个音频文件

firefox - 在Firefox中使用SoundJS播放文件

signal-processing - 作为 DSP 编程初学者,我应该怎么做?

匹配追踪原子的 MATLAB Wigner 图