Да. Причина, по которой kiss_fftr создает только двоичные элементы Nfft / 2 + 1, заключается в том, что ДПФ реального сигнала сопряженно-симметричен. Коэффициенты, соответствующие отрицательным частотам (-pi: 0 или pi: 2pi, в зависимости от того, что вам нравится думать об этом), являются сопряженными коэффициентами из [0: pi).
Обратите внимание, что выходные [0] и выходные [Nfft / 2] ячейки (DC и Nyquist) имеют ноль в мнимой части. Я видел, как некоторые библиотеки упаковывают эти две реальные части в первый комплекс, но я рассматриваю это как нарушение договора, которое приводит к трудным для диагностики, почти правильным ошибкам.
Совет: Если вы используете float для своего типа данных (по умолчанию), вы можете преобразовать выходной массив в float complex * (c99) или std :: complex * (c ++). Упаковка для структуры kiss_fft_cpx совместима. Причина, по которой он не использует их по умолчанию, заключается в том, что kiss_fft работает с другими типами, кроме float и double, и на старых компиляторах ANSI C, в которых отсутствуют эти функции.
Вот надуманный пример (предполагается, что компилятор c99 и тип == 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;
}