2017-01-27 4 views
1

私は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に自分のデータを読み込ませる方法が間違っていると確信していますが、見つけられません。

+0

ように多くの未知の変数.... fftLenとBUFLENとnumChaととと –

+0

ちょうど質問を編集したいただきました!:)変数は入力デバイスの種類に応じて自動的に設定されるので、わかりやすく忘れてしまいました! – Rampartisan

答えて

1

あなたは連続したmalloc呼び出しが連続していると思われるようですが、もちろんそうではありません(おそらくあなたはOS Xでちょうど "運が良かった")。 1つの大きな割り当てを行うことで、これを非常に簡単に修正できます。

void createFFT(struct fft *fft) 
{ 
    const int bufLen = 1024; 
    const int numChan = 4; 

    fft->fftLen = bufLen; 
    fft->numChan = numChan; 

    fft->realSig = fftw_malloc(sizeof(double *) * numChan); 
            // array of numChan pointers 
    fft->realSig[0] = fftw_malloc(sizeof(double) * numChan * bufLen); 
            // one large contiguous block of size `numChan * bufLen` 
    for(int i = 1; i < numChan; i++) // init pointers 
    { 
     fft->realSig[i] = fft->realSig[i - 1] + bufLen; 
    } 

    // ... 

} 

注:完了したら、あなただけのことを行う必要があります。

fftw_free(fft->realSig[0]); 
+1

優秀な答え、私は確かに、連続したmalloc呼び出しが連続したメモリを生成すると仮定していました。 fftw doc [ここ](http://www.fftw.org/doc/Advanced-Complex-DFTs.html)を振り返って、私はfftwプランナーに、私の「マトリックス」が連続していて、istride/1のオーストリア。 – Rampartisan

関連する問題