У меня возникли проблемы с пониманием того, как правильно использовать KissFFT (1.2.9). Все, чего я пытаюсь добиться на данный момент, это выполнить БПФ, а затем немедленно выполнить iFFT, чтобы снова восстановить исходный сигнал. Фрагмент кода ниже демонстрирует, что я делаю:
void test(short* timeDomainData, int length)
{
// Create the configurations for FFT and iFFT...
kiss_fftr_cfg fftConfiguration = kiss_fftr_alloc( length, 0, NULL, NULL );
kiss_fftr_cfg ifftConfiguration = kiss_fftr_alloc( length, 1, NULL, NULL );
// Allocate space for the FFT results (frequency bins)...
kiss_fft_cpx* fftBins = new kiss_fft_cpx[ length / 2 + 1 ];
// FFT...
kiss_fftr( fftConfiguration, timeDomainData, fftBins );
// iFFT...
kiss_fftri( ifftConfiguration, fftBins, timeDomainData );
}
Я обнаружил, что это на самом деле падает во время выполнения. Я обнаружил, что, разделив размер на 2 при создании конфигураций KissFFT, я остановил сбой:
kiss_fftr_cfg fftConfiguration = kiss_fftr_alloc( length / 2, 0, NULL, NULL );
kiss_fftr_cfg ifftConfiguration = kiss_fftr_alloc( length / 2, 1, NULL, NULL );
Однако, когда я проигрываю реконструированные аудиоданные, они в основном тихие со странным потрескиванием.
Может кто-то указать мне верное направление?
Большое спасибо, П
Изменить 1: вот как я включаю заголовочный файл KissFFT и определяю переменную FIXED_POINT:
#define FIXED_POINT 16
#include "kiss_fftr.h"
Это гарантирует, что тип typedef 'kiss_fft_scalar' будет принудительно установлен на int16_t (short).
Изменить 2: целевой платформой является Android, поэтому я также добавил в свой файл Android.mk следующее:
LOCAL_CPPFLAGS += -DFIXED_POINT