如何从 fft 函数获取频率轴?

Tin*_*fin 6 python numpy fft

所以,我可能错过了一些明显的东西,但我搜索了很多教程和文档,似乎找不到直接的答案。如何找到在 Python 中执行 fft 的函数(特别是 scipy 库中的 fft)的频率轴?

我正在尝试获取原始 EMG 信号,对其执行带通滤波器,然后执行 fft 以查看剩余的频率分量。但是,我不确定如何找到准确的 x 组件列表。我当前正在处理的特定信号以 1000 Hz 采样,有 5378 个样本。

它只是创建一个从 0 开始并达到 fft 数据长度的线性 x 吗?我看到很多人创建一个从 0 到样本点乘以样本间距的 linspace。但在这种情况下我的样本间距是多少?它只是样本/采样率吗?或者完全是另外一回事?

Kha*_*oti 4

这是一个例子。

首先创建一个具有预先确定的采样间隔的正弦波。我们将组合频率为 20 和 40 的两个正弦波。请记住,如果时间间隔较大,高频可能会出现混叠。

#Import the necessary packages
from scipy import fftpack
import matplotlib.pyplot as plt
import numpy as np

# sampling freq in herts 20Hz, and 40Hz
freq_sampling1 = 10
freq_sampling2 = 20
amplitude1 = 2 # amplitude of first sine wave
amplitude2 = 4 # amplitude of second sine wave
time = np.linspace(0, 6, 500, endpoint=True) # time range with total samples of 500 from 0 to 6 with time interval equals 6/500
y = amplitude1*np.sin(2*np.pi*freq_sampling1*time) + amplitude2*np.sin(2*np.pi*freq_sampling2*time)

plt.figure(figsize=(10, 4))
plt.plot(time,y, 'k', lw=0.8)
plt.xlim(0,6)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意图中两个正弦波是叠加的。一个有频率。10 和幅度 2 以及另一个频率。20,振幅4。

# apply fft function
yf = fftpack.fft(y, time.size)

amp = np.abs(yf) # get amplitude spectrum 
freq = np.linspace(0.0, 1.0/(2.0*(6/500)), time.size//2) # get freq axis

# plot the amp spectrum

plt.figure(figsize=(10,6))
plt.plot(freq, (2/amp.size)*amp[0:amp.size//2])
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

请注意,在幅度谱中,两个频率被恢复,而其他频率的幅度为零。振幅值也分别为 2 和 4。

您可以使用tom10fftpack.fftfreq建议的方法来获取频率轴 因此,代码更改为

yf = fftpack.fft(y, time.size)
amp = np.abs(yf) # get amplitude spectrum 
freq = fftpack.fftfreq(time.size, 6/500)
plt.figure(figsize=(10,6))
plt.plot(freq[0:freq.size//2], (2/amp.size)*amp[0:amp.size//2])
plt.show()
Run Code Online (Sandbox Code Playgroud)

我们只绘制振幅谱的正部分[0:amp.size//2]