c语言fftw函数调用,fftw中文使用说明

多维复数据的DFT同一维复数据的DFT用法类似,数组in/out为行优先方式存储。fftw_plan_dft是一个通用的复DFT函数,可以执行任意维复DFT。比如对于图像(2维数据),其变换fftw_plan_dft_2d(height,width,85),因为原始图像数据为height×width的矩阵,即第一维(n0)为行数

height。

3.

一维实数据的DFT

在许多应用中,输入数据in是纯实数,此时DFT输出满足Hermitian冗余:out[i]

是out[n-i]的共轭。利用这个性质可以从速度和存储两方面改进算法。

实数的fftw调用过程与复数的基本相同,差别只在in/out是double型并且创建方案是用以下函数:

fftw_plan fftw_plan_dft_r2c_1d(int n, double *in, fftw_complex *out, unsigned flags);

fftw_plan fftw_plan_dft_c2r_1d(int n, fftw_complex *in, double *out, unsigned flags);

r2c版本:实输入数据,复Hermitian输出,正变换。

c2r版本:复Hermitian输入数据,实输出,逆变换。

对于单精度或长双精度版本,double型应替换为float型或long

double型。

n:逻辑长度,不必为数组的物理长度。由于实数据的DFT具有Hermitian对称性,所以只需要计算n/2+1(除法向下取整)个复数输出就可以了。比如对于r2c,输入in有n个数据,输出out有floor(n

/2)+1个数据。对于原位运算,in和out为同一数组(out须强制类型转换),必须足够大以容纳所有数据,因而长度为2*(n/2+1),数组前n个之后的元素未用,是给输出填充的。

c2r逆变换在任何情况下(不管是否为原位运算)都破坏输入数组in,如果有必要可以通过在flags中加入FFTW_PRESERVE_INPUT来阻止,但这会损失一些性能。这个标志位目前在多维实数DFT中已不被支持。

比如对于n=4,in=[1 2 3 4],out=[10 -2+2i -2

-2-2i],out具有共轭对称性,out的实际内存为10 0 -2 2 -2 0,共3个复数数据。对于n=5,in=[1 2 3 4

5],out=[15 -2.5+3.44i -2.5+0.81i -2.5-0.81i -2.5-3.44i]

,out的实际内存为15 0 -2.5 3.44 -2.5 0.81,共3个复数数据。

实数据DFT中,第0个变换数据为DC分量,为实数;如果n为偶数,由

Nyquist采样定理,第n/2个变换数据也为实数;所以可以把这两个数据组合在一起,即将第n/2个变换数据作为第0个变换数据的虚部,这样一来输入数组就和输出数组的个数相等(n=n/2*2)。一些FFT的实现就是这么做的,但FFTW没有这么做,因为它并不能很好地推广到多维DFT中,而且存储空间的节省也是非常小以至于可以忽略不计。

一个一维r2c和c2r

DFT的替代接口可以在r2r接口中找到,它利用了半复数输出类型(即实部和虚部分开放在不同的区域里),使输出数组具有和输入数组同样的长度和类型。该接口尽管在多维变换中用处不大,但有时可能会有一些性能的提升。

4.多维实数的DFT

fftw_planfftw_plan_dft_r2c_2d( int n0, int n1, double *in, fftw_complex *out, unsigned flags);

fftw_plan fftw_plan_dft_r2c_3d( int n0, int n1, int n2, double *in, fftw_complex *out, unsigned flags);

fftw_plan fftw_plan_dft_r2c( int rank, const int *n, double *in, fftw_complex *out, unsigned flags);

这是r2c接口(正变换),c2r接口(逆变换)只是简单的将输入/输出类型交换一下。用法大致同1d情况一样,需要特别注意的是复数据的存放方式。对于n0×n1×n2×…×nd-1的实输入数组(行优先),经过r2c正变换后,输出为一个n0×n1×n2×…×(nd-1/2+1)的

fftw_complex

型复数数组(行优先),其中除法向下取整。由于复数数据的总长度要大于实数据,所以如果需要进行原位运算则输入实数组必须扩展以能够容纳所有复数据,即实数组的最后一维必须包含2(floor(nd-1/2)+1)个double元素。比如,对于一个2维实正DFT,输入数组为n0×n1大小,输出复数组大小为n0×floor(n1/2+1)(由对称性),其需要的内存大于实输入数组。所以对于原位运算,输入数组要扩展到n0×2floor(n1/2+1)。如果n1为偶数,扩展为n0×(n1+2);如果n1为奇数,扩展为n0×(n1+1);这些扩展的内存不需要赋初值,它们只用来存放输出数据。

比如对于3×3的实正DFT,in=[0

2 4; 6 1 3; 5 7 4],out=[32 0.5+0.86i 0.5-0.86i; -7+5.2i -1-1.73i

-8.5-6.06i; -7-5.2i -8.5+6.06i

-1+1.73i];out的实际内存为32,0,0.5,0.86,-7,5.2,-1,-1.73,-7,-5.19,-8.5,6.06;即为

3×2的复数组,换算成double类型为3×4ÿ

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值