是的。Kiss_fftr 只生成 Nfft/2+1 个 bin 的原因是因为实信号的 DFT 是共轭对称的。对应于负频率的系数( -pi:0 或 pi:2pi ,无论以何种方式考虑),是来自 [0:pi) 的共轭系数。
注意 out[0] 和 out[Nfft/2] 箱(DC 和 Nyquist)的虚部为零。我已经看到一些库在第一个复合体中将这两个真实部分打包在一起,但我认为这是一种违约行为,会导致难以诊断、几乎正确的错误。
提示:如果您使用 float 作为数据类型(默认),您可以将输出数组转换为 float complex* (c99) 或 std::complex* (c++)。Kiss_fft_cpx 结构的包装是兼容的。它默认不使用这些的原因是因为kiss_fft 可以与除浮点和双精度之外的其他类型以及缺少这些功能的旧ANSI C 编译器一起使用。
这是一个人为的例子(假设 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;
}