IPP库下FFT的基本实现

首先感谢韩昊同学,他的傅里叶分析入门给我们对数学公式不熟悉的人了解傅里叶算法打开了一扇窗户,其原文发表于知乎: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 (限四川地区)

posted @ 2016-08-07 12:57  zhangzming  阅读(4224)  评论(1编辑  收藏  举报