c# - 如何找到数组中的峰值?

标签 c# arrays find signal-processing

我正在使用 fft 制作音高检测程序。为了获得音调,我需要找到明显高于本底噪声的最低频率。

所有的结果都在一个数组中。每个位置对应一个频率。我不知道如何找到峰值。

我正在用 C# 编程。

这是 audacity 中频率分析的截图。 alt text

最佳答案

我不会试图找到最低 峰值,而是寻找一个基频,它可以最大化由其前 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/

相关文章:

c# - 返回类中的所有字段

c# - 如何在不遍历元素的情况下将 int 数组转换为可为 null 的 int 数组?

linux - 查找未按预期执行的命令

c# - 如何在 C# 中将对象写入二进制文件?

c# - WPF 简单动画导致性能问题

c - 从字符串数组中的字符串中删除空格

bash - 在查找中使用 -print0 和 -o

Mongodb:在 find() 中使用 $or 时返回匹配的过滤器

c# - 如何配置 C# 程序在操作系统首次启动时运行?

c++ - 数组中的错误功能排序