【问题标题】:Getting the peak frequency of a note in MATLAB在 MATLAB 中获取音符的峰值频率
【发布时间】:2019-01-04 23:17:15
【问题描述】:

我正在尝试使用MATLAB 中存在的 FFT 函数来获取音符的峰值频率。我只是复制粘贴了数学函数的 FFT 代码,并用音频文件替换了该函数。

Fs = 44100;                    % Sampling frequency
T = 1/Fs;                     % Sample time
L = 1000;                     % Length of signal
t = (0:L-1)*T;                % Time vector
% Sum of a 50 Hz sinusoid and a 120 Hz sinusoid
y = wavread('c-note2.wav');     
plot(Fs*t(1:50),y(1:50))

xlabel('time (milliseconds)')

NFFT = 2^nextpow2(L); % Next power of 2 from length of y
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);

% Plot single-sided amplitude spectrum.
plot(f,2*abs(Y(1:NFFT/2+1))) 
title('Single-Sided Amplitude Spectrum of y(t)') 
xlabel('Frequency (Hz)')
ylabel('|Y(f)|')

在这里,我们用y=0.15sin(5x)+0.32cos(50t)+rand(I) 代替y=wavread('c-note2.wav')(为信号添加噪声)。

我们正在尝试做的事情是否正确?我们可以用 wavread 代替数学信号吗?

从获得的图表中,我想得到c-note 的峰值频率并检查它是否与c-note 的实际频率匹配,但我得到的结果很荒谬。

【问题讨论】:

  • 你试过原码吗?它奏效了吗? range(y) 有多大?
  • 哦,是的,请解释一下究竟什么是“荒谬的结果”,以及为什么。你有没有绘制你的y?它看起来好吗?让声音被一条平线包围真的可以改变 fft 的输出。
  • 声音的实际频率应该是 63 赫兹,但我们得到的 c 音符是 5 赫兹。
  • 另外,我们尝试了原始代码,它给出了一些峰值频率的图,但我无法检查这是否正确。而且,对于两个完全不同的音符,我们还获得了相同的峰值频率值。我有一个在键盘上听起来像 F2 的数据文件,当我执行 fft 时,我在 172.3 处得到一个峰值,这仅比正确频率低一个八度。但是当我们尝试执行 C 音符的 fft 时,可能是 C3,我们再次在 172.3 处达到峰值。我们通过绘制一首我们得到完全不同频谱的歌曲来确保我们没有使用相同的图表。

标签: matlab fft


【解决方案1】:

音符的音高通常与 FFT 返回的峰值频率不同。音符通常包含大量泛音,许多泛音通常比音高频率更强,有些甚至可能在频率上略微不和谐。搜索音高检测或估计算法,而不仅仅是查看 FFT 频谱。

此外,当使用 FFT 查看音频频谱时,FFT 的长度必须长于感兴趣的最低频率的几个周期。您的 FFT 长度似乎太短,无法解析 50 Hz(20 mS 周期)。

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2013-09-11
    相关资源
    最近更新 更多