首先感谢韩昊同学,他的傅里叶分析入门给我们对数学公式不熟悉的人了解傅里叶算法打开了一扇窗户,其原文发表于知乎: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);
频谱显示数据如下:
10_20_FFT
10_FFT
20_fft
//反fft 生成新的序列 _20Hz_new保存新的序列
ippsFFTInv_PackToR_32f( _10_20Hzfft, _20Hz_new, pFFTSec, pBuffer);
结果图:
原文地址:http://www.cnblogs.com/zhangzhiming/p/5745972.html
技术分享QQ群:527698177 (限四川地区)