在 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:
应该只是前五个值的绝对值之和吗?
- 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]
- 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];
我想使用前五个 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: 应该只是前五个值的绝对值之和吗?
- 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]
- 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];