我想将前五个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:
它应该仅仅是前五个值的绝对值之和吗?
最佳答案
有人可以解释这两个输出之间的区别吗? rfft
不应该只显示fft的真实部分吗?
rfft
有效地计算实值输入序列的FFT,而fft
计算可能的复数输入序列的FFT。如果输入序列恰好是纯实数,则在某些数值精度和包装方面,fft
将返回等效输出。更具体地说,对于包装,rfft
避免返回在计算实值输入的FFT时恰好对称的频谱的上半部分。它还避免返回DC(0Hz)二进制数和Nyquist频率(一半采样率)二进制数的虚部,因为当处理实值输入时,它们总是为零。
因此,示例的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]
如何从这两个输出计算前五个系数的总和?如果是
rfft
:应该仅仅是前五个值的绝对值之和吗?从输出的不同包装中可以看出,
fft.fft
的前5个复数值系数对应于fft.rfft
返回的前9个浮点值。要计算总和,您将必须分别计算实部和虚部的总和。因此,对于前五个系数的总和,将为您提供: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];
关于python - 在Python中从FFT或RFFT查找FFT系数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42842152/