提问人:intheweeds 提问时间:10/12/2023 更新时间:10/12/2023 访问量:32
一维矩阵与二维矩阵的 FFTW 结果不同
FFTW result different for one vs two dimensional matrix
问:
我正在尝试计算矩阵每一行的傅里叶变换,并且根据输入矩阵是有一行还是两行,我得到了不同的输出。我不能直接进行二维傅里叶变换,因为一旦我输入了我需要的其他代码,修改第一行的结果就会影响第二行,所以我需要按顺序进行傅里叶变换。现在,我只是尝试在进行两次傅里叶变换后返回输入。这是我的代码:
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 列代表两个脉冲)时,频谱发生了变化,脉冲的时域看起来像是被削波了。因此,不知何故,当我包含第二个脉冲时,我正在更改第一个脉冲的输出。我有一种感觉,我错过了一些非常简单的东西,但我试过到处寻找,并且已经盯着这段代码看了一段时间,所以我将不胜感激任何人能提供的任何帮助。谢谢!!
答: 暂无答案
评论