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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:28:20