我有一个1000传感器读数值的列表(采样率= 10Hz):
sensor = [100,100,200,...,100]
我需要用窗口函数(即Kaiser窗口)获得该列表子集的频谱分析。
所以,我想得到一个列表,其中FFT是在该数据的多个子采样器(假设100个结果)上计算的,位移窗口为50个读数(在每个限制中重叠25个读数),因此,在频域上获得20个结果。然后,我想对3个频段(假设1-2Hz, 2-4Hz, 4-8Hz)应用带通加权函数。
最终结果应该是一个2D列表,其中第一个维度是"波段",第二个维度表示该波段的振幅(实部)值。
bands = [[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],[1,...],[1,...]]
有人能帮我吗?
编辑:好的,让我们把问题分开:
1)给定一个list=[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结果,如何使带通滤波器将频谱实部的离散结果转换为某个频率区间的平均值?
对于第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)
这是你想要的吗?至于第三部分,我不太清楚你需要什么。