首页 > 解决方案 > FFT 中的矢量和 RMS 平均

问题描述

我有一个数据数组,我在上面执行了 FFT。这是我应用的代码。

import numpy as np

# "data" is a column vector on which FFT needs to be performed
# N = No. of points in "data" 
# dt = time interval between two corresponding data points

FFT_data         = np.fft.fft(data)       # Complex values
FFT_data_real    = 2/N*abs(FFT_data)      # Absolute values

但是,我浏览了以下链接:https ://www.dsprelated.com/showarticle/1159.php

这里说,为了提高 SNR,我们可以应用“RMS 平均 FFT”和“矢量平均 FFT”。

有人可以让我知道我们如何在 Python 中执行这两种方法,或者是否有任何文档/链接可以参考?

标签: pythonpython-3.xsignalssignal-processingfft

解决方案


正如您的参考所示:

如果您取样本光谱平方平均值的平方根,则您正在执行RMS Averaging。另一种选择是矢量平均,您可以分别对实数和复数分量进行平均。

显然,要能够执行任一平均,您需要有多个数据集来平均。在您的示例代码中,您有一个单列 vector data。假设您有多个这样的列向量排列为 2D NxM矩阵,其中N是每个数据集的点数,M是数据集的数量。由于数据集存储在列中,因此在计算 FFT 时,您需要指定参数axis=0以沿列计算 FFT。

均方根平均 FFT

顾名思义,对于这种方法,您需要取平方幅度平均值的平方根。由于不同的集合存储在列中,因此您需要沿轴 1(与用于 FFT 的轴不同的轴)进行平均。

FFT_data        = np.fft.fft(data, axis=0)  # Complex values
FFT_data_real   = 2/N*abs(FFT_data)         # Absolute values
rms_averaged    = np.sqrt(np.mean(FFT_data_real**2, axis=1))

矢量平均 FFT

在这种情况下,您需要获取 FFT 数据的实部和虚部,然后分别计算每个的平均值:

FFT_data        = np.fft.fft(data, axis=0)  # Complex values
real_part_avg   = 2/N*np.mean(np.real(FFT_data),axis=1)
imag_part_avg   = 2/N*np.mean(np.imag(FFT_data),axis=1)
vector_averaged = np.abs(real_part_avg+1j*imag_part_avg)

请注意,我保留2/N了绝对值的缩放比例。

但是,如果我真的只有一个数据集,我该怎么办?

如果该数据集恰好是固定的并且足够大,那么您可以将数据集分解为更小的块。这可以通过将向量重塑为NxM矩阵来完成,如下所示:

data = data.reshape(N,M)
...

然后,您可以使用任何一种方法进行平均。


推荐阅读