我用KissFFT的实数函数来转换一些真实的音频信号。我很困惑,因为我输入了一个真正的信号与nfft样本,但结果是nfft/2+1复杂的频率箱。
来自KissFFT的自述:
真正的(即不复杂的)优化代码只适用于偶数长度fft。它并行地做两个半长的FFT(打包成real&imag),然后通过缠绕将它们结合起来。计算结果为nfft/2+1复频箱从直流到奈奎斯特。
因此,对于如何解释结果,我没有具体的知识。我的假设是数据被打包成r[0]i[0]r[1]i[1]...r[nfft/2]i[nfft/2],其中r是DC,i是第一个频率bin,r1是第二个,等等。是这种情况吗?
发布于 2011-11-02 11:15:57
是。kiss_fftr之所以只制作Nfft/2+1桶,是因为实信号的DFT是共轭对称的。负频率对应的系数( -pi:0或pi:2pi,无论从哪种角度来考虑它)都是[0:pi]的共轭系数。
注意,out和outNfft/2回收箱(DC和Nyquist)的虚部为零。我见过一些库在第一个复杂的部分中将这两个真实的部分组合在一起,但我认为这是一种违约,导致难以诊断、几乎正确的错误。
提示:如果您对数据类型(默认)使用浮点数,则可以将输出数组转换为浮点数* (c99)或std::complex* (c++)。kiss_fft_cpx结构的包装是兼容的。默认情况下,它不使用这些特性的原因是kiss_fft与浮点和双机以及缺乏这些特性的旧ANSI编译器的其他类型一起工作。
下面是一个精心设计的示例(假设c99编译器和type==float)
float get_nth_bin_phase(const float * in, int nfft, int whichbin )
{
kiss_fftr_cfg st = kiss_fftr_alloc(1024,0,0,0);
float complex * out = malloc(sizeof(float complex)*(nfft/2+1));
kiss_fftr(st,in,(kiss_fft_cpx*)out);
whichbin %= nfft;
if ( whichbin <= nfft/2 )
ph = cargf(out[whichbin]);
else
ph = cargf( conjf( out[nfft-whichbin] ) );
free(out);
kiss_fft_free(st);
return ph;
}发布于 2011-11-01 23:09:11
结果的r1and i1构成复向量。它们一起给出一个震级(两个分量平方和的平方和)和第一个频率桶的相位(通过atan2())。
https://stackoverflow.com/questions/7972952
复制相似问题