FFT 中的矢量和 RMS 平均
Vector and RMS averaging in FFT
我有一个数据数组,我对其执行了 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
但是,我经历了以下 link:https://www.dsprelated.com/showarticle/1159.php
这里说,为了提高信噪比,我们可以应用“RMS-averaged FFT”和“Vector Averaged FFT”。
有人可以告诉我我们如何着手在 Python 中执行这两种方法,或者是否有任何 documentation/links 我们可以参考?
如your reference所示:
If you take the square root of the average of the squares of your sample spectra, you are doing RMS Averaging. Another alternative is Vector Averaging in which you average the real and complex components separately.
显然,要能够执行任一平均,您需要有多个数据集才能进行平均。在您的示例代码中,您有一个列向量 data
。假设您有多个这样的列向量排列为 2D N
xM
矩阵,其中 N
是每个数据集的点数,M
是数据集的数量。由于数据集存储在列中,因此在计算 FFT 时,您需要指定参数 axis=0
来计算列的 FFT。
RMS 平均 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)
...
然后你可以用任何一种方法进行平均。
我有一个数据数组,我对其执行了 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
但是,我经历了以下 link:https://www.dsprelated.com/showarticle/1159.php
这里说,为了提高信噪比,我们可以应用“RMS-averaged FFT”和“Vector Averaged FFT”。
有人可以告诉我我们如何着手在 Python 中执行这两种方法,或者是否有任何 documentation/links 我们可以参考?
如your reference所示:
If you take the square root of the average of the squares of your sample spectra, you are doing RMS Averaging. Another alternative is Vector Averaging in which you average the real and complex components separately.
显然,要能够执行任一平均,您需要有多个数据集才能进行平均。在您的示例代码中,您有一个列向量 data
。假设您有多个这样的列向量排列为 2D N
xM
矩阵,其中 N
是每个数据集的点数,M
是数据集的数量。由于数据集存储在列中,因此在计算 FFT 时,您需要指定参数 axis=0
来计算列的 FFT。
RMS 平均 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)
...
然后你可以用任何一种方法进行平均。