【问题标题】:Vector and RMS averaging in FFTFFT 中的矢量和 RMS 平均
【发布时间】:2021-04-04 00:37:18
【问题描述】:

我有一个执行 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 中执行这两种方法,或者有任何文档/链接可以参考吗?

【问题讨论】:

    标签: python python-3.x signals signal-processing fft


    【解决方案1】:

    your reference所示:

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

    显然,要能够执行任一平均,您需要有多个数据集来平均。在您的示例代码中,您有一个单列向量data。假设您有多个这样的列向量排列为二维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)
    ...
    

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

    【讨论】:

    • 非常感谢@SleuthEye 的宝贵反馈。
    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2019-02-14
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    相关资源
    最近更新 更多