物理研究实习中酒杯共振频率傅里叶变换绘图出现额外水平线的问题咨询
关于FFT绘图出现异常水平线的原因及解决方法
嘿,很高兴你已经通过fftshift解决了这个问题!我来帮你拆解一下这条异常水平线出现的原因,方便你以后遇到类似问题能快速定位~
为什么会出现这条水平线?
这其实是FFT输出的默认顺序导致的:
scipy.fftpack.fft的输出结果是非中心化的,顺序为:[0Hz, 正频率1, 正频率2, ..., 最高正频率, 最高负频率, ..., 负频率2, 负频率1]- 对应的
fftfreq生成的频率轴也是同样的顺序,负频率部分紧跟在正频率之后,而非在0Hz左侧 - 当你设置
plt.xlim(1200,1400)只显示正频率的一小段时,绘图函数其实还是会绘制整个频率轴的所有点。负频率部分的点x值远小于1200,被x轴截断后,它们的连线会在视图中呈现为一条稳定的“水平线”——因为这些负频率点的归一化幅值(Fourier_ynorm)波动很小,刚好落在y=0.3左右
用fftshift解决的原理
fftshift的核心作用是把FFT的结果和频率轴中心化:
- 它会把频率轴调整为从负频率到正频率的自然顺序(0Hz居中)
- 同时对应调整FFT幅值的顺序,让幅值和频率一一匹配
- 这样当你设置
xlim(1200,1400)时,只会显示正频率区间内的有效数据点,那些负频率的点会被放在x轴左侧的视图外,不会再干扰你的频谱曲线
修改后的代码示例
你可以参考这个调整后的规范代码:
import matplotlib.pyplot as plt from scipy.io import wavfile as wav from scipy.fftpack import fft, fftfreq, fftshift import numpy as np # 读取.wav文件 rate, data = wav.read('C:\\Users\\ilike\\OneDrive\\Documenten\\RP\\RP2\\Bewerkte .wav files\\0 ml_bewerkt.wav') # 傅里叶变换并处理幅值 Fourier_y = np.log(abs(fft(data[:,0]))) Fourier_ynorm = Fourier_y / max(Fourier_y) Fourier_x = fftfreq(len(data), 1/rate) # 使用fftshift中心化频率轴和幅值 Fourier_x_shifted = fftshift(Fourier_x) Fourier_ynorm_shifted = fftshift(Fourier_ynorm) # 绘制处理后的频谱 plt.plot(Fourier_x_shifted, Fourier_ynorm_shifted) plt.xlim(1200, 1400) plt.xlabel('频率 (Hz)') plt.ylabel('归一化对数幅值') plt.show()
新手问题根本不用抱歉呀!谁都是从踩这些小细节的坑过来的,能自己摸索出解决方法已经超棒啦 😊
内容的提问来源于stack exchange,提问作者Vinh N
相关产品推荐
相关产品推荐

