VS + QT +FFTW


最近帮助其他人搞个小东西,用QT实现快速傅里叶正逆变换


网上很多需要的C++ fft ifft 有个限定条件,采样点数为2的N次幂,


这就导致取任意个数的时候,得出的结果跟matlab的结果不一致。


原因是matlab在做变换的时候进行了修正,具体方法不详。


这样一来,封装fft  ifft 就不太现实了。


那么怎么办呢?


万能的网络,要知道你想做的,99%的都有人做过了。FFTW 可以满足你的需求


网上QT + FFTW 的配置及使用有很多




通用流程:“下载”“创建lib”“配置”“使用”
1、
http://fftw.org/


2、进入fftw目录,
 
lib /def:libfftw3-3.def
l
lib /def:libfftw3f-3.def
l
lib /def:libfftw3l-3.def


默认x86 ,编译x64如下
    
lib /machine:x64 /def:libfftw3-3.def
l
lib /machine:x64 /def:libfftw3f-3.def
l
lib /machine:x64 /def:libfftw3l-3.def


3、QT是嵌入VS使用


属性配制方法,跟其他库在使用时一样。


include、lib、依赖性、dll拷到执行目录






void test()
{
QFile file("1.txt");
if (!file.open(QIODevice::ReadOnly)){
return;
}
int i = 0;


int N = 2000;
fftw_complex *in, *out, *o2i;
fftw_plan p;//正运算
fftw_plan b;//逆运算
//add code;
in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)* N);
out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)* N);
o2i = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)* N);
p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);//正FFTW_FORWARD
b = fftw_plan_dft_1d(N, out, o2i, FFTW_BACKWARD, FFTW_ESTIMATE);//逆FFTW_BACKWARD
//add code;


while (!file.atEnd())
{
QString lineString = QString(file.readLine());
qDebug() << lineString.toDouble();


in[i][0] = lineString.toDouble();//real
in[i][1] = 0;//image
i++;
}


N = i;
qDebug() << "正=============================";
fftw_execute(p); /* repeat as needed */
for (int i = 0; i < N; i++)
{
qDebug() << out[i][0] << "," << out[i][1];
}


qDebug() << "逆=============================";
fftw_execute(b);
for (int i = 0; i < N; i++)
{
qDebug() << o2i[i][0] / N << "," << o2i[i][1] / N;  //逆运算,一定要除采样数
}
fftw_destroy_plan(p);
fftw_destroy_plan(b);
fftw_free(in);
fftw_free(out);
fftw_free(o2i);
}




1.txt 内容如下


0.27219
0.26913
0.26107
0.25366
0.25576
0.25721
0.2498
0.24303
0.23627
0.23047
0.22371
0.21807
0.21259
0.20776
0.20229
0.20035
0.26027
0.2659
0.2593
0.25141
0.24481
0.26075
0.25463
0.24722
0.24013
0.23401
0.22757
0.22242
0.21598
0.2105
0.20535
0.20067
0.21356
0.26574
0.26252
0.25447
0.24754
0.24883
0.2564


补充几个参考:
http://blog.csdn.net/cyh706510441/article/details/46676123
http://blog.csdn.net/whhxp/article/details/54375339

http://blog.csdn.net/congwulong/article/details/7576012


工程已上传

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值