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

如何从信号中提取精确频率?基于np.fft的一维信号分析求助

使用NumPy FFT分析正弦波信号的完整指南

我来帮你搞定这个问题!用np.fft分析正弦波其实逻辑很清晰,大概率是你在频率轴计算或者振幅还原的环节漏掉了关键细节。下面我给你一步步拆解可运行的完整方案:

步骤1:设置核心参数

首先得明确采样相关的参数,这是FFT分析的基础:

  • 采样率Fs:每秒采集的样本数,必须大于信号频率的2倍(奈奎斯特定理),避免混叠
  • 信号频率f:我们要生成的正弦波频率
  • 采样时长duration:采集信号的总时间
import numpy as np
import matplotlib.pyplot as plt

# 核心参数
Fs = 1000  # 采样率:1000Hz
f = 5      # 正弦波频率:5Hz
duration = 2  # 采样时长:2秒

步骤2:生成正弦波信号

用NumPy生成时间轴和对应的正弦波信号,注意np.sin接收的是弧度值,所以要乘以2π*f*t:

# 生成时间轴
t = np.linspace(0, duration, int(Fs * duration), endpoint=False)
# 生成正弦波信号:振幅为1,频率为f
signal = 1 * np.sin(2 * np.pi * f * t)

步骤3:执行FFT并处理幅度谱

FFT的结果是复数数组,我们需要取绝对值得到幅度信息,同时只保留正频率部分(因为FFT结果是对称的):

# 执行FFT
fft_result = np.fft.fft(signal)
# 计算幅度谱(取绝对值)
magnitude = np.abs(fft_result)
# 获取采样点数
N = len(signal)
# 只保留正频率部分的幅度(前半段)
positive_magnitude = magnitude[:N//2]

步骤4:计算对应频率轴

用np.fft.fftfreq可以直接生成FFT对应的频率轴,同样只保留正频率部分:

# 生成频率轴
freqs = np.fft.fftfreq(N, 1/Fs)
# 只保留正频率部分
positive_freqs = freqs[:N//2]

步骤5:定位主成分并还原振幅

找到幅度谱的峰值位置,对应就是信号的主频率,然后还原原始信号的振幅(FFT的幅度需要除以N/2来还原,直流分量除外):

# 找到幅度峰值的索引
peak_idx = np.argmax(positive_magnitude)
# 获取主频率
main_freq = positive_freqs[peak_idx]
# 还原原始振幅:FFT幅度需要除以N/2
main_amplitude = positive_magnitude[peak_idx] / (N/2)

print(f"识别到的主频率:{main_freq} Hz")
print(f"识别到的主振幅:{main_amplitude:.2f}")

可视化验证(可选)

可以画原始信号和幅度谱,直观确认结果:

plt.figure(figsize=(12, 6))

# 绘制原始信号
plt.subplot(2,1,1)
plt.plot(t, signal)
plt.title("原始正弦波信号")
plt.xlabel("时间 (s)")
plt.ylabel("幅度")

# 绘制幅度谱
plt.subplot(2,1,2)
plt.plot(positive_freqs, positive_magnitude)
plt.scatter(main_freq, positive_magnitude[peak_idx], color='red', label=f"主成分:{main_freq} Hz")
plt.title("FFT幅度谱")
plt.xlabel("频率 (Hz)")
plt.ylabel("幅度")
plt.legend()

plt.tight_layout()
plt.show()

关键注意事项

  • 奈奎斯特定理:采样率必须大于信号最高频率的2倍,否则会出现频率混叠,导致FFT结果错误
  • 振幅还原:FFT的幅度值和采样点数N相关,正频率部分的幅度需要除以N/2才能还原原始信号的振幅;如果是直流信号(频率0),则除以N
  • 端点处理:生成时间轴时用endpoint=False,确保采样点数是Fs*duration,避免FFT结果出现微小偏差

运行上面的代码后,你会看到控制台输出的主频率是5Hz,振幅接近1,完美匹配我们生成的1*sin(x)信号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:29:04