在 Python 中从 FFT 或 RFFT 中查找 FFT 系数

Finding FFT coefficients from FFT or RFFT in Python

我想使用前五个 fft 系数的总和作为分类器的特征(在 Python 语言中)。我尝试了一些资源,但无法理解这个概念。例如,我有一个包含 10 个元素的数组。

a = [ 1, 2, 3, 4, 1, 1, 1, 1, 1, 1] # Lets say, it represent discrete values of the x-axis of an accelerometer  

如果我将 Python 中的 fft 应用到这个数组,我会得到以下输出:

array([ 16.00000000+0.j        ,   0.50000000-5.34306783j,
        -3.73606798-0.36327126j,   0.50000000+1.98786975j,
         0.73606798-1.53884177j,  -2.00000000+0.j        ,
         0.73606798+1.53884177j,   0.50000000-1.98786975j,
        -3.73606798+0.36327126j,   0.50000000+5.34306783j])

如果我将 Python 中的 rfft(真正的 fft)应用到这个数组,我得到以下输出:

array([ 16.        ,   0.5       ,  -5.34306783,  -3.73606798,
        -0.36327126,   0.5       ,   1.98786975,   0.73606798,
        -1.53884177,  -2.        ])

如何计算这两个输出的前五个系数之和?

如果是 rfft: 应该只是前五个值的绝对值之和吗?

  1. Can someone explain the difference between these two outputs? Shouldn't rfft just display the real part of the fft?

rfft 有效计算实值输入序列的 FFT,而 fft 计算可能为复值输入序列的 FFT。如果输入序列恰好是纯实数,fft 将 return 一个等效的输出,在一些数值精度和包装方面的考虑。更具体地说,对于封装,rfft 避免 return 在计算实值输入的 FFT 时碰巧是对称的频谱的上半部分。它还避免了 returning DC (0Hz) bin 和 Nyquist 频率(采样率的一半)bin 的虚部,因为在处理实值输入时它们始终为零。

因此,您的示例 fft.fft 的输出可以映射到 fft.rfft 的以下输出:

16.00000000+0.j         -> rfft[0]        
0.50000000-5.34306783j  -> rfft[1], rfft[2]
-3.73606798-0.36327126j -> rfft[3], rfft[4]
0.50000000+1.98786975j  -> rfft[5], rfft[6]
0.73606798-1.53884177j  -> rfft[7], rfft[8]
-2.00000000+0.j         -> rfft[9]
  1. How can I calculate the sum of first five coefficients from these two outputs? In case of rfft: should it be just the sum of absolute values of the first five values?

从输出的不同包装来看,fft.fft 的前 5 个复数值系数对应于 fft.rfft 编辑的前 9 个浮点值 return。要计算总和,您必须分别计算实部和虚部的总和。所以,对于前五个系数的总和,这会给你这样的东西:

A = np.fft.rfft(a);
sum_re = A[0] + A[1] + A[3] + A[5] + A[7];
sum_im =        A[2] + A[4] + A[6] + A[8];