2

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

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

我需要使用窗口函数(即 Kaiser 窗口)对此列表的子集进行光谱分析。

所以,我想得到一个列表,其中FFT是在该数据的多个子采样器上计算的(假设 100 个结果),位移窗口为 50 个读数(每个限制重叠 25 个读数),因此,得到 20 个结果在频域上。

然后,我想为 3 个频段(比如说 1-2Hz、2-4Hz、4-8Hz)应用带通加权函数。

最终结果应该是一个二维列表,其中第一个维度是“波段”,第二个维度表示该波段的幅度值(实部)。

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需要更多地“考虑”中间值)?

3)对于每个 FFT 结果,我怎样才能使带通滤波器,例如来自频谱实部的离散结果转换为频率间隔的平均值?

4

1 回答 1

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 部分)我不太确定您需要什么。

于 2014-05-26T20:19:28.790 回答