Python 用加窗位移和带通计算FFT

Python 用加窗位移和带通计算FFT,python,fft,windowing,Python,Fft,Windowing,我有一个包含1000个传感器读数的列表(采样率=10Hz): 我需要使用一个窗口函数(即Kaiser窗口)来获得该列表子集的光谱分析 因此,我想得到一个列表,其中,FFT是通过该数据的多个子采样器计算的(比如说100个结果),位移窗口为50个读数(每个极限重叠25个读数),因此,在频域上得到20个结果 然后,我想对3个频带(比如1-2Hz,2-4Hz,4-8Hz)应用带通加权函数 最终结果应该是一个二维列表,其中第一个维度是“频带”,第二个维度是该频带的振幅值(实部) bands = [[1,2

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

我需要使用一个窗口函数(即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) 对于这个列表2D的每个元素(第一维度):我怎样才能将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)
这是你想要的吗?至于第三部分,我不太确定你需要什么

对于第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)


这是你想要的吗?至于第三部分,我不太确定你需要什么

您可能想看看OpenCV。我没有在Python中使用它,但是C/C++中的FFT(或者更确切地说是离散傅立叶变换)看起来相当公平。问题是我所有的其他代码都是用Python开发的(而且有很多)。。。我已经在与numpy和scipy合作完成这项工作……我很确定OpenCV有Python绑定/库,但我还没有尝试过。比如,看看这里的库:除此之外,“有人能帮我吗”太宽泛了,你需要完善你的问题。我的上一个版本就足够了?请给我一个“元帮助”,这样我可以进一步完善我的疑问。你可能想看看OpenCV。我没有在Python中使用它,但是C/C++中的FFT(或者更确切地说是离散傅立叶变换)看起来相当公平。问题是我所有的其他代码都是用Python开发的(而且有很多)。。。我已经在与numpy和scipy合作完成这项工作……我很确定OpenCV有Python绑定/库,但我还没有尝试过。比如,看看这里的库:除此之外,“有人能帮我吗”太宽泛了,你需要完善你的问题。我的上一个版本就足够了?请给我一个“元帮助”,这样我就可以进一步完善我的疑问……这几乎是完美的!很多THK!对于3)我想要的是得到一个“频带”内所有频率的平均振幅(即1Hz和4Hz之间所有频率的平均振幅值),对于该频带,取数组res,求和np.abs(res[I,j])**2,并根据求和的单元数进行偏差。正当当然,首先你需要定义一个时间轴,否则不管怎样,用赫兹来谈论一个频率是没有意义的。频率步长至少与-df=2*np.pi/(int(len(a)/2)*dt成正比,其中dt是时间步长和时间阵列中的int(len(a)/2)点数。另外请注意,如果时域信号是实信号,则FFT信号将是对称的。这意味着你得到了正频率和负频率。只需选择积极的一面,然后你就可以进入第三部分了!非常感谢!这是天衣无缝的!我已经使用了abs值进行FFT。这几乎是完美的!很多THK!对于3)我想要的是得到一个“频带”内所有频率的平均振幅(即1Hz和4Hz之间所有频率的平均振幅值),对于该频带,取数组res,求和np.abs(res[I,j])**2,并根据求和的单元数进行偏差。正当当然,首先你需要定义一个时间轴,否则不管怎样,用赫兹来谈论一个频率是没有意义的。频率步长至少与-df=2*np.pi/(int(len(a)/2)*dt成正比,其中dt是时间步长和时间阵列中的int(len(a)/2)点数。另外请注意,如果时域信号是实信号,则FFT信号将是对称的。这意味着你得到了正频率和负频率。只需选择积极的一面,然后你就可以进入第三部分了!非常感谢!这是天衣无缝的!我已经使用了abs值进行FFT。