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

发布于 2021-01-29 16:47:13

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

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

是否只是创建一个从0开始到fft’d数据长度的线性x?我看到很多人在创建从0到采样点乘以采样间隔的linspace。但是在这种情况下我的样本间距是多少?只是采样/采样率?还是完全其他的东西?

关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是一个例子。

    首先创建一个具有预定采样间隔的正弦波。我们将结合两个频率为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()
    

    在此处输入图片说明

    注意图中的两个正弦波是叠加的。与频率一。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()
    

    在此处输入图片说明

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

    您可以改为使用 tom10*fftpack.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()
    

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看