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

如何用np.fft.fft实现信号傅里叶变换及频谱分析

合成正弦信号的DFT分析实现

完整代码

import numpy as np
import matplotlib.pyplot as plt

# 信号参数
f1 = 5  # 第一个正弦信号频率(Hz)
f2 = 3  # 第二个正弦信号的频率分量(Hz)
T = 1   # 信号时长(秒)

# 采样参数
fs = 64  # 采样频率(Hz)
N = 64   # DFT点数

# 生成时间轴
t = np.linspace(0, T, N, endpoint=False)  # 共N个采样点,覆盖0到T秒(不包含T)

# 生成两个正弦信号及合成信号
x1 = np.sin(2 * np.pi * f1 * t)
x2 = np.sin(2 * np.pi * (f1 + f2) * t)
x = x1 + x2

# 进行DFT计算
X = np.fft.fft(x)

# 计算频率轴(仅取正频率部分)
freq = np.fft.fftfreq(N, 1/fs)
positive_freq_idx = freq >= 0
positive_freq = freq[positive_freq_idx]
positive_X = np.abs(X[positive_freq_idx]) / (N/2)  # 幅度归一化

# 绘制时域波形
plt.figure(figsize=(12, 6))

plt.subplot(2, 1, 1)
plt.plot(t, x, label='合成信号 x(t)')
plt.plot(t, x1, '--', label='x1(t) = sin(2π*5t)')
plt.plot(t, x2, ':', label='x2(t) = sin(2π*8t)')
plt.xlabel('时间 t (秒)')
plt.ylabel('幅度')
plt.title('时域波形')
plt.legend()
plt.grid(True)

# 绘制频谱图
plt.subplot(2, 1, 2)
plt.stem(positive_freq, positive_X, basefmt='b-')
plt.xlabel('频率 f (Hz)')
plt.ylabel('幅度')
plt.title('DFT频谱(正频率部分)')
plt.xlim(0, fs/2)  # 显示奈奎斯特频率以内的部分
plt.grid(True)

plt.tight_layout()
plt.show()

结果说明

  1. 时域波形:合成信号是5Hz和8Hz正弦信号的叠加,波形呈现拍频特征,能直观看到两个频率成分的叠加效果。
  2. DFT频谱:归一化后的频谱在5Hz和8Hz位置出现明显峰值,可清晰区分合成信号中的两个频率分量。本次参数选择中,采样频率fs=64Hz和DFT点数N=64刚好让目标频率落在DFT的频率采样点上,避免了频谱泄漏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:40:26