我正在使用Apples vDSP API来计算音频的FFT。但是,根据我对实际输入的FFT的理解,我的结果(在amp[]
中)在N / 2周围不对称,它们应该是对称的吗?
在下面frame
是一个包含音频样本的浮点数数组[128]。
int numSamples = 128;
vDSP_Length log2n = log2f(numSamples);
FFTSetup fftSetup = vDSP_create_fftsetup(log2n, FFT_RADIX2);
int nOver2 = numSamples/2;
COMPLEX_SPLIT A;
A.realp = (float *) malloc(nOver2*sizeof(float));
A.imagp = (float *) malloc(nOver2*sizeof(float));
vDSP_ctoz((COMPLEX*)frame, 2, &A, 1, nOver2);
//Perform FFT using fftSetup and A
//Results are returned in A
vDSP_fft_zrip(fftSetup, &A, 1, log2n, FFT_FORWARD);
//Convert COMPLEX_SPLIT A result to float array to be returned
float amp[numSamples];
amp[0] = A.realp[0]/(numSamples*2);
for(int i=1;i<numSamples;i++) {
amp[i]=A.realp[i]*A.realp[i]+A.imagp[i]*A.imagp[i];
printf("%f ",amp[i]);
}
如果我将相同的浮点数放入在线FFT计算器中,我会得到一个对称的输出。我上面做错了吗?
出于某种原因,amp[]
中的大多数值都在0到1e-5之间,但我也得到一个大约1e23的值。我在这里没有做任何窗口,只是试图让最初的基本FFT工作。
我使用相同的数据附加了两个FFT输出的图片。您可以看到它们相似,高达64,虽然不是一个恒定的比例因子,所以我不确定它们的区别。然后在64岁以上他们是完全不同的。
答案 0 :(得分:4)
因为实际到复数FFT的数学输出是对称的,所以返回后半部分没有任何价值。传递给vDSP_fft_zrip
的数组中也没有空间。因此vDSP_fft_zrip
仅返回前半部分(除了下面讨论的特殊N / 2点)。下半部分通常不需要明确,如果是,你可以从上半部分轻松计算出来。
用于前向(实数到复数)变换的vDSP_fft_zrip
输出在{{1}中具有H 0 输出(纯粹是真实的;其虚部为零) }}。 H N / 2 输出(也是纯粹的实际)存储在A.realp[0]
中。剩余值H i ,0 <&lt;我&lt; N / 2,通常存储在A.imagp[0]
和A.realp[i]
。
解释此文档的文档为here,在“实数FFT的数据打包”部分中。
答案 1 :(得分:0)
要获得从严格实际输入到基本FFT的对称结果,您的复杂数据输入和输出数组必须与FFT的长度相同。您似乎只将一半数据分配并复制到FFT输入中,这可能会给FFT带来非实际内存垃圾。