我正在使用 fft 制作音高检测程序。为了获得音调,我需要找到明显高于本底噪声的最低频率。
所有的结果都在一个数组中。每个位置对应一个频率。我不知道如何找到峰值。
我正在用 C# 编程。
这是 audacity 中频率分析的截图。
最佳答案
我不会试图找到最低 峰值,而是寻找一个基频,它可以最大化由其前 5 个整数倍捕获的光谱能量。请注意,每个峰值都是最低峰值的整数倍。这是对倒谱方法的破解。不要判断 :)。
注意从你的图中,我假设一个 1024 样本窗口和 44.1kHZ 采样率。这产生的频率粒度仅为 44.1kHz/1024 = 43Hz。给定一个 44.1kHz 的音频,我建议使用 ~50 毫秒或 2048 个样本的较长分析窗口。这将产生约 21 Hz 的更精细的频率粒度。
假设一个大小为 2048 且具有 PSD 值的 Matlab 向量“psd”。
% 50 Hz (Dude) -> 50Hz/44100Hz * 2048 -> ~2 Lower Lim
% 300 Hz (Baby) -> 300Hz/44100Hz * 2048 -> ~14 Upper Lim
lower_lim = 2;
upper_lim = 14
for fund_cand = lower_lim:1:upper_lim
i_first_five_multiples = [1:1:5]*fund_cand;
sum_energy = sum(psd(i_first_five_multiples));
end
我会找到使 sum_energy 值最大化的频率。
关于c# - 如何找到数组中的峰值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4238618/