3

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
4

3 に答える 3

0

あなたがショートパンツを送っていることに気づきました。int16_t を DATATYPE として使用するようにすべてをコンパイルしましたか? プリプロセッサ環境の不一致が問題を引き起こす場合があります。

また、固定小数点バージョンは、両方向 (fwd、inv) で下方にスケーリングされます。したがって、信号を再構築する予定がある場合は、合計 nfft を乗算する必要があります。彩度を 2 段階で乗算することをお勧めします。

たとえば、サイズ 1024 の FFT+IFFT を実行している場合、FFT の後に 32 を掛け、IFFT の後に再び 32 を掛けます。

于 2012-06-08T12:36:11.167 に答える
0

私はAndroidで同じことをするのに苦労しています. その理由は、周波数の大きさ/位相ではなく、生の変換であるためです...と思いますか?それとも私はそれを間違っていますか?

于 2012-06-09T01:11:15.670 に答える
0

沈黙についてはわかりませんが、多くのパチパチ音がする場合は、Overlap-Addを使用するのではなく、隣接するブロックを個別に処理しているためである可能性があります。各ブロック間で効果的にクロスフェードして、より滑らかな特性を得る.

于 2012-06-08T12:48:30.597 に答える