开发环境:

系统:Windows 10

QT版本:5.10

编译器:mingw32

1.下载fftw

http://www.fftw.org/install/windows.html,根据自已编译器版本下载32位或64位

2.生成lib库

使用visual studio里面的lib.exe工具(已管理员权限运行CMD),进入fftw-3.3.5-dll32目录,运行:

lib /def:libfftw3-3.def
lib /def:libfftw3f-3.def
lib /def:libfftw3l-3.def

会生成对应的lib和exp文件,如果需要.a库文件,把.lib直接重命名为.a即可

3.qt工程设置

在pro文件中添加lib和头文件

将libfftw3-3.dll,libfftw3f-3.dll和libfftw3l-3.dll拷贝到工程的build目录下

4.测试

读一个48K,16bit,单声道的pcm文件,然后通过fft变换后显示振幅谱和相位谱。

/*** @brief MainWindow::show_amplitude_waveform 显示频域的幅度* @param file_path 数据文件* @param polt_1    显示振幅* @param polt_2    显示相位* @return*/
int MainWindow::show_amplitude_waveform(char * file_path, QCustomPlot *polt_1, QCustomPlot *polt_2)
{double val_max = 0;size_t result;char  *buf;short *in_buf;FILE *fp1=fopen(file_path, "rb");   //打开读权限fseek(fp1,0,SEEK_END);  //文件指针从0挪到尾部long filesize;filesize=ftell(fp1);    //ftell求文件指针相对于0的便宜字节数,就求出了文件字节数int N = filesize/2;     //计算数据个数if(fp1==NULL)   //判断文件是否打开{QMessageBox::critical(NULL, "错误", "\"" + QString(QLatin1String(file_path)) + "\"" + "文件打开失败!", QMessageBox::Yes, QMessageBox::Yes);return -1;}rewind(fp1);    //还原指针位置buf=(char *)malloc(filesize);   //开辟空间给缓存数组if(buf==NULL){QMessageBox::critical(NULL, "错误", "\"" + QString(QLatin1String(file_path)) + "\"" + "内存分配失败!", QMessageBox::Yes, QMessageBox::Yes);return -1;}result =fread(buf, 1, filesize, fp1);//每次读一个字节到buf,同时求读的次数if(result != filesize)  //判断读的次数和文件大小是否一致{QMessageBox::critical(NULL, "错误", "\"" + QString(QLatin1String(file_path)) + "\"" + "文件读取失败!", QMessageBox::Yes, QMessageBox::Yes);return -1;}in_buf = (short *)buf;  //强转为short,因为采样深度是16bit//为fft输入计算分配空间double * in = (double*)fftw_malloc(sizeof(double) * N);for(int i=0; i<N; i++){in[i] = in_buf[i];  //将pcm文件中的数据复制到fft的输入}//为fft输出算分配空间fftw_complex * out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);//进行fft变换,fftw_plan_dft_c2r_1d函数进行反变换fftw_plan p = FFTW3_H::fftw_plan_dft_r2c_1d(N, in, out, FFTW_ESTIMATE);fftw_execute(p);double dx3 = (double)SAMPLE_RATE / N;polt_1->xAxis->setRange(0, SAMPLE_RATE/2, Qt::AlignLeft);//根据FFT计算的复数计算振幅谱for( int i=0; i<N/2; i++ ){double val = sqrt(out[i][0] * out[i][0] + out[i][1] * out[i][1]);val = val / (N / 2);polt_1->graph(0)->addData( dx3 * i, val );if( val > val_max ){val_max = val;}double db = log(val);//qDebug("frequency = %f, amplitude = %f, db = %f", dx3 * i, val / (N / 2), db);}polt_1->yAxis->setRange(val_max*0.6, val_max*1.2, Qt::AlignBottom);polt_1->replot();polt_2->xAxis->setRange(0, SAMPLE_RATE/2, Qt::AlignLeft);polt_2->yAxis->setRange(0, 10, Qt::AlignBaseline);//根据FFT计算的复数计算相位谱for( int i=0; i<N/2; i++ ){double val = atan2(out[i][1], out[i][0]);polt_2->graph(0)->addData( dx3 * i, val );}polt_2->replot();fclose(fp1);    //关闭文件指针fftw_destroy_plan(p);free(buf);      //释放buffftw_free(in);fftw_free(out);return 0;
}

QT中使用fftw库相关推荐

  1. Ubuntu下Qt中使用pcl库

    pcl依赖及安装 1.一般不用到qt或vtk显示点云 ###pcl通过ppa安装步骤 //这样安装,目前默认安装的是pcl1.7.2 sudo add-apt-repository ppa:v-lau ...

  2. qt中怎样添加库文件

    qmake -project qmake name.pro 在Qt中工程通过.pro文件管理,所以库文件要在.pro文件中添加. 1.添加库文件 静态库 linux:LIBS += your_lib_ ...

  3. linux下静态编译mupdf,在Qt中调用Mupdf库进行pdf显示

    2018.5.10 更新内存对齐说明 感谢知乎网友@孤独子狮指出QImage处需要考虑内存对齐的问题.因为本人缺乏跨平台.图形库开发经验,所以在调试成功后就没有深入探究. 主要修改了QImage的构造 ...

  4. QT中引用动态库(.so) 和 静态库 (.a)

    1 增加动态库 pro文件中LIBS一行中添加 如新增libvlc.so LIBS += -L/usr/local/lib -lvlc 其中/usr/local/lib为libvlc.so所处的绝对路 ...

  5. window10 Qt 中使用boost库

    由于网上的资料比较零散,这里进行汇总一下. boost下载地址如下:可以选择不同的版本Version 1.67.0https://www.boost.org/users/history/version ...

  6. 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

     一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件可以指定父对象 QTimer *timer = QTime ...

  7. 在Qt 中如何使用OpenCV库

    OpenCV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时 ...

  8. Qt中调用OpenCV函数库时Crashed问题的解决。

    这几天想在虚拟机上搭建Ubuntu的开发环境,包括了Matlab和QT(C++)的开发工具安装等,同时由于做图像处理,所以还必须要安装FFMPEG和OpenCV库.下面就讲讲我们安装时出现qt中调用O ...

  9. 如何在Qt中使用zlib

    前言 环境:qt5.9.9 . zlib1.2.1. windows10.QtCreator4.11.0 本文介绍了在Qt中使用zlib的方式.使用的场景是在上位机软件中使用解压缩功能. 点击此处下载 ...

最新文章

  1. MySQL基础篇:设置大小写不敏感
  2. 做程序员的苦恼,智办事助力团队协作更简单
  3. 爬取我主良缘,获取个人图片及其信息
  4. javascript高精度计算解决方案
  5. python里 try里怎么用int函数_如何在不使用try / catch的情况下测试Python枚举中是否存在int值?...
  6. php判断百度ua展示不同页面,PHP 如何根据UA展示不同的前端模板
  7. css编写加载页面动画效果
  8. java pdf替换文字_java 查找替换pdf中的指定文本
  9. JAVA开发的人力资源管理系统
  10. 点击reset按钮失效,不能清空输入框。
  11. 双十一大促过后怎么维护淘宝店铺数据
  12. Hadoop 安装指南
  13. 【Unity使用UGUI实现王者荣耀UI界面(四)】游戏开始界面
  14. CRM-客户关系管理(Customer Relationship Management)
  15. 2020年有寓意的领证日期_2020年领结婚证的好日子,2020年领证寓意好日子
  16. openssl验证证书是否由CA证书颁发的问题
  17. COM笔记-Widows 注册表
  18. 前端工程师高手说说CSS学习中的瓶颈
  19. PhotoShop如何导出线性空间下的图片
  20. BERT与知识图谱的结合——ERNIE模型浅析

热门文章

  1. 使用SceneKit编写VR全景播放器
  2. element-ui 官方文档内网部署方法
  3. 一文搞懂人脸识别技术的三种应用模式
  4. 【dubbo系列】dubbo协议与http协议对比
  5. 一键生成印章,印章助手,这个软件是真的实用!
  6. debian+linux百度云,Linux Centos/Ubuntu/Debian系统图形化界面挂BT、PT一键包(rtorrent+rutorrent)...
  7. 什么是单页面应用(SPA)和多页面应用(MPA)
  8. lenovo L480 进入bios_NVIDIA显卡刷BIOS教程,秒变超频显卡,将显卡性能发挥到极致!...
  9. Polygon Cruncher——3ds Max减面工具的使用方法
  10. NOI OJ 1.6 10:大整数加法 C语言