python - 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 中执行这两种方法,或者是否有任何文档/链接可以参考?
解决方案
正如您的参考所示:
如果您取样本光谱平方平均值的平方根,则您正在执行RMS Averaging。另一种选择是矢量平均,您可以分别对实数和复数分量进行平均。
显然,要能够执行任一平均,您需要有多个数据集来平均。在您的示例代码中,您有一个单列 vector data
。假设您有多个这样的列向量排列为 2D N
xM
矩阵,其中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
了绝对值的缩放比例。
但是,如果我真的只有一个数据集,我该怎么办?
如果该数据集恰好是固定的并且足够大,那么您可以将数据集分解为更小的块。这可以通过将向量重塑为N
xM
矩阵来完成,如下所示:
data = data.reshape(N,M)
...
然后,您可以使用任何一种方法进行平均。
推荐阅读
- python - “UnboundLocalError:局部变量'?' 在赋值前引用“大量迭代错误
- javascript - 当我多次运行该函数时,有没有办法保留使用 Math.random 生成的变量
- matlab - 无法解决 Simulink FOC 模型中的端口尺寸错误
- mysql - 在 mySQL 中自动递减一个值
- amazon-web-services - Kinesis 用于将 DynamoDB 流中的作业分组到数据存储
- algorithm - 寻找间隔点的替代贪婪策略:这种方法有效吗?
- grails - Grails 承诺丢失数据 - 似乎不等待对方完成
- unity3d - 为什么旋转的 X 值与 Unity 对象上的 Y 和 Z 表现不同?
- php - AWS 剥离 HTTP 标头?
- javascript - 打字稿Angular中的数组问题