要在Python中提取与FFT值相关的频率,需要借助NumPy和SciPy这两个常用的科学计算库。
下面是详细的步骤和示例说明:
步骤一:生成信号数据
首先我们需要生成一个信号数据,作为后续FFT分析的输入。可以使用NumPy库中的fft模块中提供的fftfreq方法来生成一个符合条件的信号数据。
import numpy as np
# 生成一个长度为 N 的输入信号
N = 1000
timestep = 0.01
t = np.linspace(0, (N-1)*timestep, N)
# 生成一个信号,模拟正弦波形状
f = 2 # 正弦波频率
signal = np.sin(2 * np.pi * f * t)
这里生成了一个长度为 1000 的信号,信号由 t 矩阵和 signal 矩阵组成。t 矩阵代表时间,signal 矩阵代表不同时间点上的信号取值。
步骤二:进行FFT分析
得到信号的数据之后,我们需要对其进行FFT分析,使用Scipy库中提供的FFT模块,在代码中使用fft方法来获取FFT值。
from scipy.fft import fft
# 做FFT分析
fft_result = fft(signal)
这里的 fft_result 就是对原始信号进行FFT分析之后得到的FFT值。
步骤三:获取FFT值相关的频率
得到FFT值之后,我们可以通过NumPy库提供的freqs方法来获取FFT值相关的频率。
from scipy.fft import fftfreq
# 获取FFT值相关的频率
frequencies = fftfreq(N, timestep)
这里的 frequencies 数组存储了与FFT值相关的频率。
示例一
下面是示例代码,使用以上三个步骤进行FFT分析,然后绘制FFT值随频率变化的图像。
import matplotlib.pyplot as plt
# 生成一个长度为 N 的输入信号
N = 1000
timestep = 0.01
t = np.linspace(0, (N-1)*timestep, N)
# 生成一个信号,模拟正弦波形状
f = 2 # 正弦波频率
signal = np.sin(2 * np.pi * f * t)
# 做FFT分析
fft_result = fft(signal)
# 获取FFT值相关的频率
frequencies = fftfreq(N, timestep)
# 绘制FFT值随频率变化的图像
plt.plot(frequencies, np.abs(fft_result))
plt.xlabel('Frequency / Hz')
plt.ylabel('Amplitude')
plt.show()
示例代码运行结果如下图所示,可以看到在该正弦波频率为 2Hz 的情况下,FFT值最大点所对应的频率确实是 2Hz:
示例二
下面是一个更加复杂的信号数据的示例代码,分析过程类似于示例一。
# 生成一个长度为 N 的输入信号
N = 1024
timestep = 0.05
t = np.linspace(0, (N-1)*timestep, N)
# 生成一个信号,由两个不同频率的正弦波叠加而成
f1 = 3 # 正弦波1频率
f2 = 7 # 正弦波2频率
signal = np.sin(2 * np.pi * f1 * t) + np.sin(2 * np.pi * f2 * t+np.pi/4)
# 做FFT分析
fft_result = fft(signal)
# 获取FFT值相关的频率
frequencies = fftfreq(N, timestep)
# 绘制FFT值随频率变化的图像
plt.plot(frequencies, np.abs(fft_result))
plt.xlabel('Frequency / Hz')
plt.ylabel('Amplitude')
plt.xlim(0, 10)
plt.show()
示例代码运行结果如下图所示,可以看出:
- 由于我们在信号中添加了两个不同频率的正弦波,因此在频谱图上出现了两个峰。
- 第一个正弦波的频率为 3Hz,对应的峰位于横轴 3 的位置。
- 第二个正弦波的频率为 7Hz,对应的峰位于横轴 7 的位置。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何在Python中提取与fft值相关的频率 - Python技术站