繁体   English   中英

FFTW - 计算真实的2D FFT,特殊要求

[英]FFTW - computing real 2D FFT, special requirements

我正在使用FFTW3来计算c ++中的2D实数FFT。 我已阅读手册但有一些问题。 来自手册: http//www.fftw.org/fftw3_doc/One_002dDimensional-DFTs-of-Real-Data.html#One_002dDimensional-DFTs-of-Real-Data

为了换取这些速度和空间优势,用户牺牲了FFTW复杂变换的一些简单性。 首先,输入和输出数组具有不同的大小和类型:输入是n个实数,而输出是n / 2 + 1个复数(非冗余输出); 这也需要对输入阵列进行轻微的“填充”以进行就地变换。 其次,默认情况下,逆变换(复数到实数)具有覆盖其输入数组的副作用。 这些不便都不会给用户带来严重问题,但重要的是要了解它们。

  1. 我知道我需要将输入的2D矩阵转换为行级1D向量。 但是输出是什么样的? n / 2 + 1数字是什么意思? 换句话说,如何重新排序输出以获得2D矩阵?

  2. 具体来说,我需要做些什么来创建这个“填充”?

  1. 如果您的输入已经在普通的C ++ 2D数组中,那么您需要做的就是对它进行类型转换:

     double twoDarray[10][10]; double *oneDarrayPointer = (double *)twoDarray; 

    如果输入为100(如上例所示),则输出数组将为51个复数。 这些数字的格式应由您的库描述,但可能是102个doubles的数组 - 51个条目乘以2(实/虚部分)。

    编辑:已确认 - fftw_complex定义为:

     typedef double fftw_complex[2]; 

    所以他们只是连续配对doubles代表复数的实部和虚部。

  2. 如果你不想这样做,你不需要填充任何东西 - 只需分配一个适当大小的输出数组。 如果你确实需要这样做,你的输入缓冲区必须有2个额外的双倍空间与输入大小。 假设上面的声明,你想要的东西如下:

     double *inPlaceFFTPointer = malloc(sizeof twoDarray + 2*sizeof(double)); memcpy(inPlaceFFTPointer, oneDarrayPointer, sizeof twoDarray); 

    我不确定你是否需要确保在最后两个条目中有0.0 ,但这很容易添加。

您可以查看FFTW3中的实际变换,它完全符合您的要求。 这些不需要填充并且考虑到波数0和表示奈奎斯特频率的波数仅具有实际分量。 看看这里:

FFTW3 Real-to-Real变换

并为内存中的布局:

FFTW3 Real-to-Real转换种类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM