私はFFTW3を使用して複数のデータ列(各チャネルの変換が必要なマルチチャネルオーディオ)でfftを実行しています。これはOSX上でうまくいきますが、コードをlinuxに移植すると、segフォールトが発生します。FFTWプラン分割エラー
const int fftwFlags = FFTW_PRESERVE_INPUT|FFTW_PATIENT;
struct fft {
fftw_complex **complexSig;
double **realSig;
fftw_plan forwardR2C;
int fftLen;
int numChan;
}
void create FFT(struct fft *fft) {
int bufLen = 1024;
int numChan = 4;
fft->fftLen = bufLen;
fft->numChan = numChan;
fft->realSig = fftw_malloc(sizeof(double *) * numChan);
for(int i = 0; i < numChan; i++) {
fft->realSig[i] = fftw_malloc(sizeof(double) * bufLen);
}
fft->complexSig = fftw_malloc(sizeof(fftw_complex *) * numChan);
for(int i = 0; i < numChan; i++) {
fft->complexSig[i] = fftw_malloc(sizeof(fftw_complex) * bufLen);
}
fft->forwardR2C = fftw_plan_many_dft_r2c(1, &fft->fftLen, fft->numChan, *fft->realSig, &fft->fftLen, 1, fft->fftLen, *fft->complexSig, &fft->fftLen, 1, fft->fftLen, fftwFlags);
}
valgrindのは、FFTWプランナーは、セグメンテーション障害をもたらす、(8バイト、1つのサンプル)この配列の終端を越えてアクセスしようとしていることを示しています。 realSigに割り当てるメモリの量をbufLen * 2に増やすと、このエラーは発生しません。
FFTWに自分のデータを読み込ませる方法が間違っていると確信していますが、見つけられません。
ように多くの未知の変数.... fftLenとBUFLENとnumChaととと –
ちょうど質問を編集したいただきました!:)変数は入力デバイスの種類に応じて自動的に設定されるので、わかりやすく忘れてしまいました! – Rampartisan