KissFFT (1.2.9) を正しく使用する方法を理解するのに苦労しています。今のところ達成しようとしているのは、FFT を実行し、すぐに 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 );
}
私が見つけたのは、これが実際に実行時にクラッシュすることです。KissFFT構成を作成するときにサイズを2で割ると、クラッシュが停止することがわかりました。
kiss_fftr_cfg fftConfiguration = kiss_fftr_alloc( length / 2, 0, NULL, NULL );
kiss_fftr_cfg ifftConfiguration = kiss_fftr_alloc( length / 2, 1, NULL, NULL );
ただし、再構築されたオーディオ データを再生すると、奇妙なパチパチ音を立ててほとんど無音になります。
誰かが私を正しい方向に向けることができますか?
どうもありがとう、P
編集 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