はい。Kiss_fftr が Nfft/2+1 ビンのみを作成する理由は、実信号の DFT が共役対称であるためです。負の周波数 ( -pi:0 または pi:2pi 、それについて考えるのが好きな方) に対応する係数は、[0:pi) からの共役係数です。
out[0] および out[Nfft/2] ビン (DC およびナイキスト) の虚部はゼロであることに注意してください。私はいくつかのライブラリがこれら 2 つの実際の部分を最初の複合体にまとめているのを見てきましたが、それは診断が難しく、ほぼ正しいバグにつながる契約違反だと私は考えています。
ヒント: データ型に float を使用している場合 (デフォルト)、出力配列を float complex* (c99) または std::complex* (c++) にキャストできます。kiss_fft_cpx 構造体のパッキングは互換性があります。デフォルトでこれらを使用しない理由は、kiss_fft が float と double 以外の他の型で動作し、これらの機能がない古い 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;
}