如何移除音频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
相关产品推荐
相关产品推荐

