首先感谢韩昊同学,他的傅里叶分析入门给我们对数学公式不熟悉的人了解傅里叶算法打开了一扇窗户,其原文发表于知乎:https://zhuanlan.zhihu.com/p/19763358

在了解其基本原理的基础下,我们采用IPP库对FFT的实现进行一个简单的仿真,以便更感性的认识何为傅里叶变换,他能做什么,废话不多,下面开始。

IPP版本:w_ipp_9.0.3.207.exe

可以在intel官网进行下载,该文件是开发库,是免费的

下载地址:https://registrationcenter.intel.com/en/forms/?productid=2558&licensetype=2

采样率设置为100,构建10Hz,20Hz,以及10Hz,20Hz叠加数据三份

Ipp32f *_10Hz = ippsMalloc_32f(len);
Ipp32f *_20Hz = ippsMalloc_32f(len);
Ipp32f *_10_20Hz = ippsMalloc_32f(len);

Ipp32f pPhase = 0;
ippsTone_32f(_10Hz, len, 5000, 0.1, &pPhase,ippAlgHintNone);
ippsTone_32f(_20Hz, len, 5000, 0.2, &pPhase,ippAlgHintNone);

ippsAdd_16s(_10Hz, _20Hz, _10_20Hz, len);

以上代码由IPP库的方法生成两个正弦信号,一个叠加信号。

10Hz

20Hz

10Hz_20Hz

生成fft序列并实现滤波

int pSpecSize;
int pSpecBufferSize;
int pBufferSize;
ippsFFTGetSize_R_32f(order, IPP_FFT_DIV_INV_BY_N, ippAlgHintFast, &pSpecSize, &pSpecBufferSize, &pBufferSize);
Ipp8u* pSpec = NULL;
Ipp8u* pSpecBuffer = NULL;
Ipp8u* pBuffer = NULL;
pSpec = ippsMalloc_8u ( pSpecSize );
if ( pSpecBufferSize > 0 )
{
pSpecBuffer = ippsMalloc_8u ( pSpecBufferSize );
}

if ( pBufferSize > 0 )
{
pBuffer = ippsMalloc_8u ( pBufferSize );
}

IppsFFTSpec_R_32f *pFFTSec;
ippsFFTInit_R_32f(&pFFTSec, order, IPP_FFT_DIV_INV_BY_N, ippAlgHintFast, pSpec, pSpecBuffer);

//生成FFT序列

ippsFFTFwd_RToPack_32f(_10Hz, _10Hzfft, pFFTSec, pBuffer);//10
ippsFFTFwd_RToPack_32f(_10_20Hz, _10_20Hzfft, pFFTSec, pBuffer);//10_20

//滤波 20Hz保存在_10_20Hzfft

ippsSub_32f(_10Hzfft,  _10_20Hzfft, len);

//反fft 生成新的序列 _20Hz_new保存新的序列

ippsFFTInv_PackToR_32f( _10_20Hzfft, _20Hz_new, pFFTSec, pBuffer);

结果图:

--------------------------------------------------------------------------------------------------追加一个信号转频率的函数

///
/// 执行内存数据fft变换
///
void __stdcall ExecuteMemory(unsigned char *data, int len, int fftNum, unsigned char *res)
{
int nfft = pow(2.0, fftNum);
float *resTmp = (float *)res;

int pSpecSize;
int pSpecBufferSize;
int pBufferSize;
ippsFFTGetSize_R_32f(fftNum, IPP_FFT_DIV_INV_BY_N, ippAlgHintFast, &pSpecSize, &pSpecBufferSize, &pBufferSize);

Ipp8u* pSpec = NULL;
Ipp8u* pSpecBuffer = NULL;
Ipp8u* pBuffer = NULL;

pSpec = ippsMalloc_8u ( pSpecSize );
if ( pSpecBufferSize > 0 )
{
pSpecBuffer = ippsMalloc_8u ( pSpecBufferSize );
}

if ( pBufferSize > 0 )
{
pBuffer = ippsMalloc_8u ( pBufferSize );
}

IppsFFTSpec_R_32f *pFFTSec;
ippsFFTInit_R_32f(&pFFTSec, fftNum, IPP_FFT_DIV_INV_BY_N, ippAlgHintFast, pSpec, pSpecBuffer);

//生成FFT序列
Ipp32f *out = ippsMalloc_32f(nfft);
ippsFFTFwd_RToCCS_32f((float*)data, out, pFFTSec, pBuffer);//10

for(int j = 0; j < nfft / 2; ++ j)
{
resTmp[j] = 20 * log10(AbsComplex(out[2 * j], out[2 * j + 1]) / (nfft/2));
}

ippsFree(out);

if(pSpec)
{
ippsFree(pSpec);
}
if(pSpecBuffer)
{
ippsFree(pSpecBuffer);
}
if(pBuffer)
{
ippsFree(pBuffer);
}
}

原文地址:http://www.cnblogs.com/zhangzhiming/p/5745972.html

技术分享QQ群:527698177 (限四川地区)

IPP库下FFT的基本实现的更多相关文章

  1. 【玩转单片机系列002】 如何使用STM32提供的DSP库进行FFT

    前些日子,因为需要在STM32F103系列处理器上,对采集的音频信号进行FFT,所以花了一些时间来研究如何高效并精确的在STM32F103系列处理器上实现FFT.在网上找了很多这方面的资料做实验并进行 ...

  2. STM32F4使用FPU+DSP库进行FFT运算的测试过程二

    原文地址:http://www.cnblogs.com/NickQ/p/8541156.html 测试环境:单片机:STM32F407ZGT6 IDE:Keil5.20.0.0 固件库版本:STM32 ...

  3. BCG界面库下的Windows8 UI界面样式www.webui8.com

    BCG界面库下的Windows8 UI界面样式(Metro风格)控件主要有以下一些功能: 规则的大块磁贴 支持完整键盘导航 Tile组 标题(Caption) 标题按钮(Caption buttons ...

  4. Python的numpy库下的几个小函数的用法

    numpy库是Python进行数据分析和矩阵运算的一个非常重要的库,可以说numpy让Python有了matlab的味道 本文主要介绍几个numpy库下的小函数. 1.mat函数 mat函数可以将目标 ...

  5. 第一百三十二节,JavaScript,封装库--下拉菜单

    JavaScript,封装库--下拉菜单 封装库,增加了3个方法 shu_biao_yi_ru_yi_chu()方法,给元素设置鼠标移入移出事件,接收两个参数,参数是移入和移出时的执行函数(包含代码) ...

  6. 基于jsmpeg库下使用ffmpeg创建视频流连接websocket中继器传输视频并播放

    这个功能的基本工作是这样的: 1.使用node运行jsmpeg库下的websocket-relay.js文件,这个文件的作用是创建一个websocket视频传输中继器 2.运行ffmpeg,将输出发送 ...

  7. sqlserver查询当前库下,一张表的表名,字段名,字段类型,字段长度

    sqlserver版: 查询当前数据库下所有表名: select * from sys.tables; 查询当前库下,一张表的表名,字段名,字段类型,字段长度: select a.name 表名,b. ...

  8. mysql下批量清空某个库下的所有表(库不要删除,保留空库)

    总所周知,mysql下要想删除某个库下的某张表,只需要切换到该库下,执行语句"drop table tablename"即可删除!但若是该库下有成百上千张表,要是再这样一次次执行d ...

  9. mysql通过mysqldump工具,对某个库下的表进行备份

    需求描述: 使用mysqldump工具对某个库下的表进行备份的方法. 操作过程: 1.通过mysqldump工具完成此目的 [mysql@redhat6 MysqlDb_Backup]$ mysqld ...

随机推荐

  1. win10下安装并启动zookeeper

    下载直接到zk的官网(zookeeper.apache.org)即可,点击右边的Releases,在Download下再点Download进入镜像下载页面,在给出的链接列表里选择一个镜像地址,进去后选 ...

  2. linux网络编程、系统编程

    http://blog.csdn.net/lianghe_work/article/category/2871247

  3. GOF23设计模式之解释器模式(interpreter)

    一.解释器模式概述 (1)它是一种不常用的设计模式: (2)由于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器的设计: (3)当我们需要开发一种新的语言时,可以考虑使用 ...

  4. Linnx 服务器中mysql 无法正常访问问题

    本机连接远程Linnx服务器不通 1. 检测防火墙 -- 保证防火墙关闭 查看到iptables服务的当前状态:service iptables status. 但是即使服务运行了,防火墙也不一定起作 ...

  5. Hibernate学习11——配置Hibernate二级缓存

    一.缓存的概念: 以空间换时间:   二.Hibernate缓存的分类: 前面我们讲的缓存都是session缓存:也叫一级缓存:get,load等缓存都是内置的,一级缓存: SessionFactor ...

  6. SQL 函数:树结构指定父节点遍历所有的子节点

    CREATE function [dbo].[Get_DepChildren] ( @ID int ) , ),PID ), Name )) as begin --declare @ID Int -- ...

  7. Oracle定时值执行存储过程

    declare      jobno number;    begin      dbms_job.submit(     jobno,     'p_dosomething;',  --what   ...

  8. 【UVALive】3029 City Game(悬线法)

    题目 传送门:QWQ 分析 以前见到过差不多的这题. xhk说是单调栈水题,但我又不会单调栈,于是当时就放下了. 这么久过去了我还是不会用单调栈做这题,用的是悬线法. 非常好写 代码 #include ...

  9. 什么是java序列化,如何实现java序列化?

    http://veryti.com/question/539 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间 ...

  10. window.location和window.open的区别

    window.location = "http://www.baidu.com" 跳转后有后退功能 window.location.replace("http://www ...