如何用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()
结果说明
- 时域波形:合成信号是5Hz和8Hz正弦信号的叠加,波形呈现拍频特征,能直观看到两个频率成分的叠加效果。
- DFT频谱:归一化后的频谱在5Hz和8Hz位置出现明显峰值,可清晰区分合成信号中的两个频率分量。本次参数选择中,采样频率
fs=64Hz和DFT点数N=64刚好让目标频率落在DFT的频率采样点上,避免了频谱泄漏问题。
内容的提问来源于stack exchange,提问作者Someone
相关产品推荐
相关产品推荐

