曼巴贸易 发表于 2024-11-28 11:36:02

用fft对信号作频谱分析

在Python中,可以使用numpy库的fft模块来进行傅立叶变换,并使用matplotlib库来绘制信号的频谱图。以下是一个简单的示例,演示如何对一个简单的正弦波信号进行频谱分析:
import numpy as np
import matplotlib.pyplot as plt

# 定义信号参数
A = 1.0                  # 振幅
fs = 1000.0            # 采样频率
T = 1.0/fs               # 采样间隔
L = 1000               # 信号长度
t = np.arange(L) * T   # 时间向量
f = 50.0               # 信号频率

# 生成正弦波信号
signal = A * np.sin(2 * np.pi * f * t)

# 计算FFT
fft_signal = np.fft.fft(signal)

# 计算双边频谱(默认情况下,fft给出的是单边频谱)
fft_magnitude = np.abs(fft_signal)

# 为了得到正确的频率轴,我们需要在fft_magnitude的前半部分和后半部分分别乘以两边对应的频率
N = len(fft_magnitude)
freqs = np.fft.fftfreq(N, T)

# 绘制频谱图
plt.figure()
plt.stem(freqs[:N // 2], fft_magnitude[:N // 2] * 2 / N, 'b', markerfmt=" ", basefmt="-b")
plt.stem(freqs[-N // 2:], fft_magnitude[-N // 2:] * 2 / N, 'r', markerfmt=" ", basefmt="-r")
plt.title('Frequency spectrum of a sine wave')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude')
plt.grid()
plt.show()https://eb118-file.cdn.bcebos.com/upload/122ef1e7977a49e9947317a6d3bfd0f2_2053270916.png

这段代码首先定义了一个简单的正弦波信号,然后使用numpy.fft.fft计算信号的快速傅立叶变换(FFT)。接着,计算了FFT的幅度,并使用matplotlib.pyplot.stem绘制了频谱图。注意,由于FFT是对信号进行周期性扩展的,因此我们只需要考虑频率轴的正半轴即可。双边频谱的幅度是单边频谱幅度的两倍,除以FFT点数的一半可以归一化到单边频率范围内。最后,使用matplotlib.pyplot.show()显示结果。

西湖的水 发表于 2024-12-4 17:07:13

楼上总结得真好,我完全赞同。

这一路鸟语花香 发表于 2024-12-5 17:56:07

这个解决方案听起来很有前景。
页: [1]
查看完整版本: 用fft对信号作频谱分析