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

如何修改FFT代码计算指定频率区间(760-765Hz)的峰值强度?

如何从FFT结果中提取760-765Hz区间的峰值强度?

在物理实验室中,教授布置了分析拨弦频率频谱的任务。完成声音采集后,我们得到一段执行FFT的脚本,经FFT处理后得到多个频率峰值。教授要求单独计算每个峰值的强度,我是该领域新手,现求助如何修改给定代码以输出760至765Hz区间的峰值强度。

原代码:

from scipy.fftpack import fft,ifft 
import matplotlib.pyplot as plt 
from scipy.signal import blackman 
data = np.loadtxt("mic.txt") 
x = data[:,0] 
y = data[:,1] 
fy = fft(y) 
print np.sum(y),"==",fy[0] 
n = len(x) 
t = x[-1] 
fx = np.linspace(0,n/t,n) 
plt.plot(fx[0:n/2],np.abs(fy[0:n/2])) 
plt.xlabel("frequency (Hz)") 
plt.show()

嗨Matthew,我来帮你搞定这个问题!你的现有代码已经完成了FFT计算和频谱绘制的核心工作,只需要添加几行逻辑就能提取目标区间的峰值强度。下面是修改后的完整代码,我会逐段解释关键改动:

修改后的完整代码

# 补全numpy导入(原代码用到了np但没声明,会报错)
import numpy as np
from scipy.fftpack import fft, ifft 
import matplotlib.pyplot as plt 
from scipy.fftpack import fft, ifft 
import matplotlib.pyplot as plt 
from scipy.signal import blackman 

data = np.loadtxt("mic.txt") 
x = data[:,0] 
y = data[:,1] 
fy = fft(y) 
# 改成Python3兼容的print函数写法
print(np.sum(y),"==",fy[0])  

n = len(x) 
t = x[-1] 
fx = np.linspace(0, n/t, n) 

# 提取正频率部分的频谱强度(FFT结果的绝对值)
spectrum = np.abs(fy[0:n//2])
freqs = fx[0:n//2]

# 筛选760-765Hz的频率区间
freq_mask = (freqs >= 760) & (freqs <= 765)
target_freqs = freqs[freq_mask]
target_intensities = spectrum[freq_mask]

# 提取该区间内的峰值信息
if len(target_intensities) > 0:
    peak_intensity = np.max(target_intensities)
    peak_freq = target_freqs[np.argmax(target_intensities)]
    print(f"760-765Hz区间的峰值强度: {peak_intensity:.2f}")
    print(f"对应的峰值频率: {peak_freq:.2f}Hz")
else:
    print("760-765Hz区间内未检测到有效频率成分")

# 优化可视化:放大目标区间并标记峰值
plt.plot(freqs, spectrum)
plt.scatter(peak_freq, peak_intensity, color='red', s=50, label='目标区间峰值')
plt.xlabel("frequency (Hz)")
plt.xlim(750, 770)  # 聚焦目标区间,方便观察
plt.legend()
plt.show()

关键改动说明

  1. 补全依赖导入:原代码使用了numpy的np前缀但未导入模块,这会直接报错,所以先添加import numpy as np;
  2. 提取频谱强度:将FFT结果的绝对值作为频谱强度,同时只保留正频率部分(0:n//2),符合实际频谱分析需求;
  3. 区间筛选:用布尔索引freq_mask精准锁定760-765Hz的频率和对应强度;
  4. 峰值计算:用np.max()获取区间内的最大强度,np.argmax()找到对应的频率值;
  5. 可视化优化:添加红色标记点突出峰值,并通过xlim放大目标区间,让结果更直观。

如果你的环境是Python2.x,只需要把print(f"...")改回旧式格式化写法即可,比如print("760-765Hz区间的峰值强度: %.2f" % peak_intensity)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:17:40