要提取与FFT值相关的频率,需要进行以下步骤:
- 首先,利用FFT函数计算FFT值。在Python中,可以使用NumPy库中的rfft()函数完成此操作。如果我们有一个由n个样本组成的时间序列,可以使用以下代码计算FFT值:
import numpy as np
N = 1000
data = np.random.random(N)
fft_vals = np.abs(np.fft.rfft(data))
这将计算长度为N的随机样本数据的FFT值,并将结果存储在fft_vals数组中。这个数组的长度为(N/2)+1,其中(N/2)是FFT的对称性,加上1是因为我们只需要保留正半轴的FFT值。
- 接下来,要从FFT值中获取频率信息。可以通过以下公式计算每个FFT值所对应的频率:
frequencies = np.fft.rfftfreq(N, d=1.0)
这将计算每个频率点的频率,其中d是时间序列中每个样本之间的时间差。如果我们有一个长度为N的时间序列,d的值通常为1.0。这将返回一个长度为(N/2)+1的频率数组,对应于计算得到的FFT数组。
这样就完成了从FFT值中提取与频率相关的信息的过程。下面是两个示例:
- 使用一个sin波进行示例:
“`
import numpy as np
import matplotlib.pyplot as plt
N = 200
fs = 1000
freq = 50
t = np.linspace(0, (N-1)/fs, N)
data = np.sin(2np.pifreqt) + 0.1np.random.randn(N)
fft_vals = np.abs(np.fft.rfft(data))
freqs = np.fft.rfftfreq(N, d=1.0/fs)
plt.plot(freqs, fft_vals)
plt.xlabel(‘Frequency (Hz)’)
plt.ylabel(‘Amplitude’)
plt.show()
“`
这个示例创建了一个50 Hz的正弦波,并添加了少量噪声。计算FFT值并从中提取频率信息,在绘制FFT值的频谱图中可以看到,FFT值在50 Hz处具有峰值,对应于输入信号的频率。
- 使用心电图进行示例:
“`
import numpy as np
import matplotlib.pyplot as plt
ecg = np.loadtxt(‘ecg.txt’)
N = len(ecg)
fs = 250
fft_vals = np.abs(np.fft.rfft(ecg))
freqs = np.fft.rfftfreq(N, d=1.0/fs)
plt.plot(freqs, fft_vals)
plt.xlabel(‘Frequency (Hz)’)
plt.ylabel(‘Amplitude’)
plt.xlim([0, 80])
plt.show()
“`
这个示例加载一个含有心电图数据的文件,并计算FFT值并提取频率信息。在绘制的FFT频谱图中可以看到,在0-80 Hz范围内有几个明显的峰值,这些峰值对应于心跳的基本频率和其谐波。