如何用Python将FFT频率轴缩至[-1,1]范围?
如何将FFT频率轴缩放到[-1,1]区间?
核心思路是对fftfreq生成的频率轴做归一化处理——将原始频率值除以奈奎斯特频率(即采样率的一半),就能把频率范围映射到[-1,1]区间,不需要修改采样率参数(修改采样率会改变FFT的物理频率意义,不是我们要的归一化效果)。
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt # 替换为你的信号数据 ds = ... contour_fft = np.fft.fft(ds) contour_fft = np.fft.fftshift(contour_fft) magnitude = abs(contour_fft) sample_rate = 1.0 N = len(ds) # 生成原始频率轴并移位 freq = np.fft.fftfreq(N, sample_rate) freq = np.fft.fftshift(freq) # 关键:归一化频率轴到[-1,1] freq_normalized = freq / (sample_rate / 2) # 绘图 plt.figure(figsize=(50, 5)) plt.plot(freq_normalized, magnitude) plt.axhline(0, color='black', linestyle='--', linewidth=1, label='Zero Magnitude') plt.xlabel('Normalized Frequency ([-1, 1])') plt.ylabel('Contour FFT Magnitude') plt.legend() plt.title('Contour FFT Magnitude Plot (Normalized Frequency Axis)') plt.grid(True) plt.xlim([-1, 1]) # 可选:强制x轴严格显示目标区间 plt.show()
关键细节解释
freq_normalized = freq / (sample_rate / 2):奈奎斯特频率是采样率的一半,是离散信号能表示的最高频率。除以它之后,所有频率值会被线性映射到[-1,1]区间:1对应正奈奎斯特频率,-1对应负奈奎斯特频率,0对应直流分量。- 不管你的采样率是多少,这个方法都通用。比如采样率为1000时,原始频率范围是[-500,500],除以500后就得到[-1,1]。
- 添加
plt.xlim([-1, 1])是为了避免因浮点精度问题,导致x轴显示超出[-1,1]的微小偏移,让绘图更规范。
内容的提问来源于stack exchange,提问作者Rotem Gal
相关产品推荐
相关产品推荐

