fftwf库的使用C11,fftwf_complex乘法

       参考:从傅里叶变换进阶到小波变换(一) - 知乎

 

https://www.cnblogs.com/warmbeast/p/7809286.html

        发现关于fftw这个库的使用者很少啊,特别是这个库在c99与c11下的使用竟有不同之处。比如C11对fftwf_complex数据取实部虚部直接[0]、[1]就可以,C99中却不行要按下面做?

printf("w:(%f,%f) !!!\n",crealf(w[i]),cimagf(w[i]));

比如C99下两个fftwf_complex相乘直接用*就行,C11中却不行,如果改用C11中对复数的乘法算出来也与C99下直接*的结果有差别,小数点后的结果不一致?!如下所示:

//C11下写的对fftwf_complex两个数的乘法,但下面两种写法都与C99下z[i]*x[i]的略不一致,即小数点后不一致
void pointwise_complex_multiplication(fftwf_complex *z,fftwf_complex *x,int n,fftwf_complex *w)
{
	for(int i=0;i<n;i++)
	{
		//dismatch c11
		w[i][0]=z[i][0]*x[i][0]-z[i][1]*x[i][1];
		w[i][1]=z[i][0]*x[i][1]+z[i][1]*x[i][0];

		//dismatch c11
		//w[i][0]=z[i][0]*(x[i][0]+x[i][1]);
		//w[i][1]=z[i][1]*(x[i][0]+x[i][1]);
	}
}

然后C99下:

//C99下的正确写法,直接用操作符*就可以了

//在这句之前输出z[i]、x[i]的实部、虚部与C11下的一致,哪怕小数点后5位也一致
w[i] = z[i] * x[i];
//但在这句之后输出w[i]的实部、虚部就与C11下略有不同了,小数点后不一致。

通过调试可以看到:左边是C99的结果,右边是C11的结果,可以看到小数点后的数据没对上:

 贴出来:

c99 fftwf_complex operator * result:
(30967.490234,0.000000) 
(-1950.387451,-166.434525)
(-1158.038940,756.193054) 
(-1334.538818,-1130.796631) 
(-819.429626,39.296997) 
(-91.523949,809.191223) 
(13.948779,-110.528328) 
(-164.385590,-66.933281) 
(-160.344788,-117.937607) 
(-0.095748,144.198303) 
(-376.043976,-250.734467) 
(21.665018,-106.575714) 
(144.692795,196.289780) 
(-99.489304,-80.197296) 
(28.306635,37.939674) 
(-19.775280,145.093063) 
(51.476357,19.221403) 
(45.006618,-76.846252) 
(-27.557671,-13.154622) 
(12.989132,52.029812) 
(29.180330,-8.284921) 
(13.214874,-14.672416) 
(-3.598421,56.043770) 
(-24.226379,12.638783) 
(2.625340,36.174389) 
(13.441189,-18.405294) 
(-4.093601,-4.841472) 
(29.325947,-0.767191) 
(4.521169,11.830598) 
(-8.554667,6.131295) 
(-2.915850,-15.778939) 
(-6.854457,-3.191259) 

C11下:

c11 fftwf_complex multiply:
(30967.492188,0.000000) !!!
(-1950.387451,166.434509) !!!
(-1158.038940,-756.193115) !!!
(-1334.539062,1130.796387) !!!
(-819.429626,-39.296921) !!!
(-91.524086,-809.191162) !!!
(13.948624,110.528366) !!!
(-164.385712,66.933235) !!!
(-160.344864,117.937614) !!!
(-0.095818,-144.198318) !!!
(-376.044067,250.734482) !!!
(21.664967,106.575706) !!!
(144.692764,-196.289764) !!!
(-99.489372,80.197304) !!!
(28.306610,-37.939674) !!!
(-19.775333,-145.093018) !!!
(51.476337,-19.221386) !!!
(45.006584,76.846252) !!!
(-27.557659,13.154646) !!!
(12.989131,-52.029797) !!!
(29.180319,8.284931) !!!
(13.214869,14.672392) !!!
(-3.598404,-56.043751) !!!
(-24.226360,-12.638774) !!!
(2.625357,-36.174358) !!!
(13.441205,18.405296) !!!
(-4.093592,4.841476) !!!
(29.325951,0.767207) !!!
(4.521188,-11.830579) !!!
(-8.554657,-6.131292) !!!
(-2.915827,15.778945) !!!
(-6.854446,3.191261) !!!

为什么会有这个差别?!如果直接C11下用*操作符,则是不支持的,会报下面的错误:

‘fftwf_complex’ {aka ‘float [2]’}和‘fftwf_complex’ {aka ‘float [2]’}对双目‘operator*’而言无效

大家有遇到这个问题吗?

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气少女缘结神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值