如何修改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()
关键改动说明
- 补全依赖导入:原代码使用了
numpy的np前缀但未导入模块,这会直接报错,所以先添加import numpy as np; - 提取频谱强度:将FFT结果的绝对值作为频谱强度,同时只保留正频率部分(
0:n//2),符合实际频谱分析需求; - 区间筛选:用布尔索引
freq_mask精准锁定760-765Hz的频率和对应强度; - 峰值计算:用
np.max()获取区间内的最大强度,np.argmax()找到对应的频率值; - 可视化优化:添加红色标记点突出峰值,并通过
xlim放大目标区间,让结果更直观。
如果你的环境是Python2.x,只需要把print(f"...")改回旧式格式化写法即可,比如print("760-765Hz区间的峰值强度: %.2f" % peak_intensity)。
内容的提问来源于stack exchange,提问作者washersl
相关产品推荐
相关产品推荐

