一维矩阵与二维矩阵的 FFTW 结果不同

FFTW result different for one vs two dimensional matrix

提问人:intheweeds 提问时间:10/12/2023 更新时间:10/12/2023 访问量:32

问:

我正在尝试计算矩阵每一行的傅里叶变换,并且根据输入矩阵是有一行还是两行,我得到了不同的输出。我不能直接进行二维傅里叶变换,因为一旦我输入了我需要的其他代码,修改第一行的结果就会影响第二行,所以我需要按顺序进行傅里叶变换。现在,我只是尝试在进行两次傅里叶变换后返回输入。这是我的代码:

std::vector<std::vector<std::complex<double>>> output_mat(numRows, std::vector<std::complex<double>>(numCols));

mxArray *outputMatrix = mxCreateDoubleMatrix(numRows, numCols, mxCOMPLEX);
double *realPart = mxGetPr(outputMatrix);
double *imagPart = mxGetPi(outputMatrix);

std::vector<std::complex<double>> u1(numElements_em);
std::vector<std::complex<double>> u1_pre(numElements_em);
std::vector<std::complex<double>> uip(numCols);
std::vector<std::complex<double>> uhalf_loop(numCols);
std::vector<std::complex<double>> uhalf(numCols);

// ~~~~~~~~~~~~~~~~~~~ BEGINNING LOOP! ~~~~~~~~~~~~~~~~~~~~~~

for (int pulse = 0; pulse < num_pulses; ++pulse) {

    fftw_complex* in_fft = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * numCols);
    fftw_complex* out_fft = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * numCols);

    fftw_plan forward_plan = fftw_plan_dft_1d(numCols, in_fft, out_fft, FFTW_FORWARD, FFTW_ESTIMATE);
    fftw_plan backward_plan = fftw_plan_dft_1d(numCols, out_fft, in_fft, FFTW_BACKWARD, FFTW_ESTIMATE);

    u1 = usArray_mat[pulse];

    std::cout << pulse << std::endl;
    std::cout << u1.size() << std::endl;

    //u1_pre = u1;

    // Initialize in_fft with the real data and set imaginary part to 0
    for (int i = 0; i < u1.size(); i++) {
        in_fft[i][0] = std::real(u1[i]);
        in_fft[i][1] = std::imag(u1[i]); // Set imaginary part to 0
    }

    fftw_execute(forward_plan);

    for (int i = 0; i < u1.size(); ++i) {
        uip[i] = std::complex<double>(out_fft[i][0], out_fft[i][1]);
        uhalf_loop[i] = uip[i]; 
    }

    for (int i = 0; i < uhalf_loop.size(); i++) {
        out_fft[i][0] = std::real(uhalf_loop[i])/uhalf_loop.size();
        out_fft[i][1] = std::imag(uhalf_loop[i])/uhalf_loop.size(); // Set imaginary part to 0
    }

    fftw_execute(backward_plan);

    for (int i = 0; i < u1.size(); ++i) {
        uhalf[i] = std::complex<double>(in_fft[i][0], in_fft[i][1]);
    }

    output_mat[pulse] = uhalf;

    fftw_destroy_plan(forward_plan);
    fftw_destroy_plan(backward_plan);
    fftw_free(in_fft);
    fftw_free(out_fft);
 
}


// ~~~~~~~~~~~~~~~~~~~ Creating output matrices ~~~~~~~~~~~~~~~~~~~~~~

// Create output mxArray

for (mwIndex i = 0; i < numRows; i++) { 
    for (mwIndex j = 0; j < numCols; j++) {
        //std::complex<double> complexValue = us_vector;
        realPart[i + numRows * j] = std::real(output_mat[i][j]);
        imagPart[i + numRows * j] = std::imag(output_mat[i][j]);;
    }
}

当我在一维情况下尝试上述操作时(即一行 x 32768 列代表一个脉冲),我按预期返回了输入。但是当我尝试 2D 情况(即两行 x 32768 列代表两个脉冲)时,频谱发生了变化,脉冲的时域看起来像是被削波了。因此,不知何故,当我包含第二个脉冲时,我正在更改第一个脉冲的输出。我有一种感觉,我错过了一些非常简单的东西,但我试过到处寻找,并且已经盯着这段代码看了一段时间,所以我将不胜感激任何人能提供的任何帮助。谢谢!!

C++ MATLAB MEX FFTW

评论

1赞 Paul R 10/13/2023
您是否期望 2D FFT 只是每行的 1D FFT,因为事实并非如此。请参阅 stackoverflow.com/questions/11333454/2d-fft-using-1d-fft/...

答: 暂无答案