我使用FFTW3对多列数据(即多声道音频,我希望每个声道的变换)执行fft。这在OSX上运行得很好,但是将代码移植到linux上会给我一个seg错误。

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字节,一个样本),结果导致了一个分段错误。当增加分配给realSig to bufLen*2的内存量时,此错误不存在。
我确信这是我告诉FFTW如何读取我的数据的一个错误,但我无法发现它!

最佳答案

您似乎假设连续的malloc调用是连续的,当然它们不太可能是连续的(您可能只是在OS X上“走运了”)。你可以很容易地解决这个问题,尽管通过一个大的分配,例如。

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]);

关于c - FFTW计划分段故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41892764/

10-11 21:31