用窗口位移和带通计算FFT

时间:2014-05-26 16:06:12

标签: python fft windowing

我有一个包含1000个传感器读数值的列表(采样率= 10Hz):

sensor = [100,100,200,...,100]

我需要通过窗口函数(即Kaiser窗口)对该列表的子集进行频谱分析。

所以,我想得到一个列表,其中 FFT 是通过这些数据的多个子采样器计算的(让我们说100个结果),带有位移窗口< / strong> 50个读数(每个限制重叠25个读数),因此,在频域上获得20个结果。

然后,我想对3个频段应用带通加权函数(让我们说1-2Hz,2-4Hz,4-8Hz)。

结尾的结果应该是 2D列表,其中第一个维度是&#34; band&#34;在第二个中表示该频段的幅度(实部)的值。

bands = [[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],[1,...],[1,...]]

任何人都可以帮助我吗?

编辑:好的,让我们分开问题:

1)给出一个列表= [1,2,3,4,5,6,7,8]。如何创建这种2D列表:list2D = [[1,2,3,4],[3,4,5,6],[5,6,7,8]]?这是制作位移窗口的第一个问题。

2)对于这个list2D的每个元素(第一维):我如何与窗口函数一起进行FFT分析(FFT需要更多考虑&#34;考虑&#34;中间值)?

3)对于每个FFT结果,如何将带通滤波器(例如频谱实部的离散结果)转换为频率间隔的平均值?

1 个答案:

答案 0 :(得分:4)

对于第1部分和第2部分,请看下面的例子:

import numpy as np
import scipy as sci
from scipy.signal import blackman
from scipy.signal import hanning

a = np.array([1,2,3,4,5,6,7,8])


b = np.empty([2, int(len(a)/2)], dtype=complex)
b[0,:] = a[0:int(len(a)/2)]
b[1,:] = a[(int(len(a)/2)-1):-1]

res = np.empty([2, int(len(a)/2)], dtype=complex)

# create blackman window
w = blackman(int(len(a)/2))
# you could also use a hanning window:
# w = hanning(int(len(a)/2))

for i in range(2):
    res[i,:] = sci.fftpack.fft(b[i,:] * w)

这是你想要的吗?至于第3部分)我不太清楚你需要什么。