使用 FFTW 对二维复数数组进行 FFT
FFT of 2D complex array using FFTW
我在 C 中有一个大小为 1001(行)*144(列)的二维双精度复数数组。我想对每一行应用 FFT,最后希望输出为 4096*144 格式。这里 N 点 = 4096。最后将结果与 matlab 输出进行比较。
我正在使用著名的 FFTW C 库。我已阅读 tutorials 但无法理解如何正确使用。我应该使用哪个例程,例如一维例程或二维例程,然后如何使用?
#更新
double complex reshaped_calib[1001][144]={{1.0 + 0.1 * I}};
double complex** input; //[4096][144];
// have to take dynamic array as I was getting segmentation fault here
input = malloc(4096 * sizeof(double complex*));
for (i = 0; i < 4096; i++) {
input[i] = malloc(144* sizeof(double complex));
}
// input is array I am sending to fftw to apply fft
for (i= 0; i< 1001; i++)
{
for (j= 0; j< 144; j++)
{
input[i][j]=reshaped_calib[i][j];
}
}
// Pad the extra rows
for (i= 1001; i< 4096; i++)
{
for (j= 0; j< 144; j++)
{
input[i][j] = 0.0;
}
}
int N=144, howmany=4096;
fftw_complex* data = (fftw_complex*) fftw_malloc(N*howmany*sizeof(fftw_complex));
i=0,j=0;
int dataCount=0;
for(i=0;i<4096;i++)
{
for(j=0;j<144;j++)
{
data[dataCount++]=CMPLX(creal(input[i][j]),cimag(input[i][j]));
}
}
int istride=1, idist=N;// as in C data as row major
// ... if data is column-major, set istride=howmany, idist=1
// if data is row-major, set istride=1, idist=N
fftw_plan p = fftw_plan_many_dft(1,&N,howmany,data,NULL,howmany,1,data,NULL,howmany,1,FFTW_FORWARD,FFTW_MEASURE);
fftw_execute(p);
您尝试用
填充数组
int pad = 4096;
memset(reshaped_calib, 0.0, pad * sizeof(double complex)); //zero padding
实质上覆盖了数组 reshaped_calib
的前 4096 个值。对于适当的填充,您需要将二维数组的大小扩展到所需的 4096 x 144 大小,并仅将输入 1001 x 144 范围之外的条目设置为零。
由于您只是扩展行数,因此可以使用以下填充:
double complex input[1001][144]={{1.0 + 0.1 * I}};
// Allocate storage for the larger 4096x144 2D size, and copy the input.
double complex reshaped_calib[4096][144];
for (int row = 0; row < 1001; row++)
{
for (int col = 0; col < 144; col++)
{
reshaped_calib[row][col] = input[row][col];
}
}
// Pad the extra rows
for (int row = 1001; row < 4996; row++)
{
for (int col = 0; col < 144; col++)
{
reshaped_calib[row][col] = 0.0;
}
}
就是说,如果您想要分别对每一行进行 1D FFT,您应该使用 fftw_plan_dft_1d
并多次调用 fftw_execute
,或者使用 fftw_plan_many_dft
。这在 in this answer by @Dylan.
中有更详细的描述
我在 C 中有一个大小为 1001(行)*144(列)的二维双精度复数数组。我想对每一行应用 FFT,最后希望输出为 4096*144 格式。这里 N 点 = 4096。最后将结果与 matlab 输出进行比较。 我正在使用著名的 FFTW C 库。我已阅读 tutorials 但无法理解如何正确使用。我应该使用哪个例程,例如一维例程或二维例程,然后如何使用?
#更新
double complex reshaped_calib[1001][144]={{1.0 + 0.1 * I}};
double complex** input; //[4096][144];
// have to take dynamic array as I was getting segmentation fault here
input = malloc(4096 * sizeof(double complex*));
for (i = 0; i < 4096; i++) {
input[i] = malloc(144* sizeof(double complex));
}
// input is array I am sending to fftw to apply fft
for (i= 0; i< 1001; i++)
{
for (j= 0; j< 144; j++)
{
input[i][j]=reshaped_calib[i][j];
}
}
// Pad the extra rows
for (i= 1001; i< 4096; i++)
{
for (j= 0; j< 144; j++)
{
input[i][j] = 0.0;
}
}
int N=144, howmany=4096;
fftw_complex* data = (fftw_complex*) fftw_malloc(N*howmany*sizeof(fftw_complex));
i=0,j=0;
int dataCount=0;
for(i=0;i<4096;i++)
{
for(j=0;j<144;j++)
{
data[dataCount++]=CMPLX(creal(input[i][j]),cimag(input[i][j]));
}
}
int istride=1, idist=N;// as in C data as row major
// ... if data is column-major, set istride=howmany, idist=1
// if data is row-major, set istride=1, idist=N
fftw_plan p = fftw_plan_many_dft(1,&N,howmany,data,NULL,howmany,1,data,NULL,howmany,1,FFTW_FORWARD,FFTW_MEASURE);
fftw_execute(p);
您尝试用
填充数组int pad = 4096;
memset(reshaped_calib, 0.0, pad * sizeof(double complex)); //zero padding
实质上覆盖了数组 reshaped_calib
的前 4096 个值。对于适当的填充,您需要将二维数组的大小扩展到所需的 4096 x 144 大小,并仅将输入 1001 x 144 范围之外的条目设置为零。
由于您只是扩展行数,因此可以使用以下填充:
double complex input[1001][144]={{1.0 + 0.1 * I}};
// Allocate storage for the larger 4096x144 2D size, and copy the input.
double complex reshaped_calib[4096][144];
for (int row = 0; row < 1001; row++)
{
for (int col = 0; col < 144; col++)
{
reshaped_calib[row][col] = input[row][col];
}
}
// Pad the extra rows
for (int row = 1001; row < 4996; row++)
{
for (int col = 0; col < 144; col++)
{
reshaped_calib[row][col] = 0.0;
}
}
就是说,如果您想要分别对每一行进行 1D FFT,您应该使用 fftw_plan_dft_1d
并多次调用 fftw_execute
,或者使用 fftw_plan_many_dft
。这在 in this answer by @Dylan.