用于3d传感器信号的FFT

问题描述 投票:3回答:1

我有加速度信号数据的3d数组,其采样频率为50赫兹,这意味着时间步长为1/50 = .02。我的目标是使用Numpy或Scipy计算此传感器的主频率。我的问题是,我应该分别计算每列的频率,使用多维fft或计算单个Vector,然后计算fft。

我使用以下函数来计算主频率。


from scipy import fftpack
import numpy as np
def fourier(signal, timestep):
    data = signal - np.mean(signal)
    N = len(data) // 2  # we need half of data
    freq = fftpack.fftfreq(len(data), d=timestep)[:N]
    fft = fftpack.fft(data)[:N]
    amp = np.abs(fft) / N
    order = np.argsort(amp)[::-1]  ## sort based on the importance
    return freq[order][0]

python fft sensor
1个回答
0
投票

加速计传感器的3D阵列产生5维的阵列:空间坐标,时间和加速度的分量。

在Qazxswpoi维度上采用DFT对应于一次分析一个传感器:每个传感器将产生主频率,可能从一个传感器到另一个传感器略微不同,就好像传感器是分开的一样。

作为替代方案,让我们考虑在空间坐标和时间上进行DFT。它对应于将复合信号写为qazxsw poi的总和:

其中time是通过将点数乘以时间样本数得到的比例因子。在续集中,我将从x,y,z,t,k_x,k_y,k_z和w中独立地删除此全局缩放。

在这一点上,对产生这种加速度的物理进行建模将是一项重要的资产。实际上,如果这种现象是分散的,使用这种DFT几乎没有意义。无论如何,均匀材料中的扩散,弹性或声学是非分散的:每个频率独立于其他频率。此外,知道物理学是有用的,因为可以定义能量。例如,与波k_x,k_y,k_z,w相关的动能写入:

因此,与给定频率sinusoidal plane waves相关的动能写道:

因此,这种推理提供了一种基于物理的方式来合并逐点DFT。确实,根据Parseval的身份:

关于实际考虑因素,如你所做的那样减去平均数确实是一个好的开始。如果通过乘以1 / w ^ 2来考虑计算速度,则零频率(即平均值)将被归零,以避免无限或Nan的出现。

此外,在计算时间DFT之前应用窗口可以帮助限制与Ǹ相关的问题。 DFT设计用于与帧的周期一致的周期信号。更具体地说,它计算通过一次又一次地重复帧构建的信号的傅里叶变换。结果,人为的不连续性可能出现在边缘处,从而引起误导的不存在的频率。 w靠近框架边缘靠近零点,从而减少了不连续性及其影响。因此,可以建议将窗口应用于空间维度,以保持与物理平面波分解的一致性。这将导致给3D阵列中心的加速器增加更多的重量。

平面波分解还要求传感器的空间间隔必须比预期波长小约两倍。否则,会出现另一种叫做spectral leakage的现象。然而,功率谱W(w)对该问题的敏感性可能低于平面波分解。相反,如果从加速度开始计算弹性应变能量,则混叠可能成为一个真正的问题,因为计算应变需要相对于空间坐标的导数,即乘以k_x,k_y或k_z,并且空间混叠对应于使用错了k_x。

一旦计算出W(w),就可以通过计算相对于功率密度的峰值上的平均频率来估计对应于每个峰值的频率,如Windows

下面是一个示例代码,生成一些与帧大小(时间和空间)不一致的频率平面波。应用汉宁窗,计算动能并且回溯对应于每个峰的频率。

aliasing

Why are frequency values rounded in signal using FFT?

© www.soinside.com 2019 - 2024. All rights reserved.