You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除音频FFT结果中的最高频率值以获取第二高频?

问题原因

你写的frequency1 = frequencies - np.argmax(frequencies)完全搞错了逻辑:np.argmax(frequencies)返回的是最大值所在的索引(4561),不是最大值的实际幅值。你把整个幅值数组都减去这个索引值,原最大值位置的幅值大概率还是数组里最大的(毕竟FFT的幅值远大于4561),所以第二次np.argmax自然还是返回原索引。

正确解决方法

这里给两种实用的实现方式:

方式一:清零最大值位置的幅值

直接定位到最大值的索引,把该位置的幅值设为0(或数组最小值),这样第二次找最大值就能拿到第二高的频率:

data_fft = np.fft.fft(data)
frequencies = np.abs(data_fft)

# 拿到最高频率的索引
max_idx = np.argmax(frequencies)
print("最高频率索引:{}".format(max_idx))

# 拷贝原数组,避免修改原始数据,然后把最大值位置设为0
freqs_no_max = frequencies.copy()
freqs_no_max[max_idx] = 0

# 找第二高频率的索引
second_max_idx = np.argmax(freqs_no_max)
print("第二高频率索引:{}".format(second_max_idx))

方式二:排序取前N个高频索引

如果之后还需要找第三、第四高的频率,用排序的方法更方便——对数组索引按幅值从大到小排序,直接取对应位置的索引即可:

data_fft = np.fft.fft(data)
frequencies = np.abs(data_fft)

# 按幅值降序排列索引
sorted_indices = np.argsort(frequencies)[::-1]

# 第一个是最高频,第二个就是第二高频
max_idx = sorted_indices[0]
second_max_idx = sorted_indices[1]

print("最高频率索引:{}".format(max_idx))
print("第二高频率索引:{}".format(second_max_idx))
补充提醒

别搞混索引和实际频率:np.argmax返回的是数组下标,要得到真实的频率值,得用公式计算:实际频率 = 索引 * 采样率 / 音频数据长度。

内容的提问来源于stack exchange,提问作者thiccdan69

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:40:48