首先感謝韓昊同學,他的傅里葉分析入門給我們對數學公式不熟悉的人了解傅里葉算法打開了一扇窗戶,其原文發表於知乎: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 (限四川地區)
