資源簡介
C語言的卷積/相關程序代碼,本人圖像處理工程中使用的代碼,正確可靠!

代碼片段和文件信息
/**************************************************************************
?*??文件名:CONV&CORR.cpp
?*
?*??函數:
?*
?*??CONV() -?快速卷積
?*??CORR() -?快速相關
?*??CONV2() -?圖像快速卷積
?*??CORR2() -?圖像快速相關
?*
?*************************************************************************/
#include?“stdafx.h“
#include?“CONV&CORR.h“
#include?“FFT&IFFT.h“
#include?
#include?
using?namespace?std;
//?常數π
#define?PI?3.1415926535
/*************************************************************************
?*
?*?函數名稱:
?*???CONV()
?*
?*?參數:
?*???complex?*?TD1 ????-?指向時域序列數組1的指針
?*???complex?*?TD2 ????-?指向時域序列數組2的指針
?*???complex?*?TDout -?指向時域結果數組的指針
?*???M ????-?序列1的長度
?*???N??????????????????????????-?序列2的長度
?*
?*?說明:
?*???該函數利用FFT實現快速卷積。
?*
?************************************************************************/
void?CONV(complex?*?TD1?complex?*?TD2?complex?*?TDout?int?M?int?N)
{
//?卷積結果長度
int count?=?M+N-1;
//?便于使用FFT,把count擴展為2的冪
int?Lcount;
????int?r=0;??//?2的冪數,即FFT迭代次數,2的r次方=Lcount
int?temp;
if?(log(count)/log(2)-int(log(count)/log(2))==0)
??????temp?=?log(count)/log(2);
else
??temp?=?log(count)/log(2)+1;
r?=?temp;
Lcount?=?1<
//?分配運算所需存儲器
????complex?*X1?*X2?*FD1?*FD2?*FD12?*TD12;
X1?=?new?complex[Lcount];??//補齊后的序列1
X2?=?new?complex[Lcount];??//補齊后的序列2
FD1?=?new?complex[Lcount];???//序列1的傅立葉變換結果
FD2?=?new?complex[Lcount];???//序列2的傅立葉變換結果
FD12?=?new?complex[Lcount];???//序列12的頻域相乘結果
TD12?=?new?complex[Lcount];???//序列12的傅立葉反變換結果
????//將序列補齊為Lcount長度
complex?*X?*Y;
X?=?new?complex[M];??//臨時存儲器
Y?=?new?complex[N];
//?將時域點寫入XY
memcpy(X?TD1?sizeof(complex)?*?M);
memcpy(Y?TD2?sizeof(complex)?*?N);
//?循環變量
int i;
????for?(i=0;?i ????{
????????X1[i]?=?complex(X[i].real()?X[i].imag());?????????????????????????????????????????????
????}
????for?(i=M;?i ????{
????????X1[i]?=?complex(0?0);
????}
for?(i=0;?i ????{
????????X2[i]?=?complex(Y[i].real()?Y[i].imag());
????}
????for?(i=N;?i ????{
????????X2[i]?=?complex(0?0);
????}
????//?釋放內存
delete?X;
delete?Y;
????//序列1的FFT
FFT(X1?FD1?r);
//序列2的FFT
????FFT(X2?FD2?r);
????//序列12的頻域相乘
????for?(i=0;?i ????{
????????FD12[i]?=?complex(FD1[i].real()*FD2[i].real()-FD1[i].imag()*FD2[i].imag()?FD1[i].real()*FD2[i].imag()+FD1[i].imag()*FD2[i].real());
????}
//序列12的頻域相乘的IFFT
????IFFT(FD12?TD12?r);
//TD12中的前M+N-1項為真正卷積結果寫入TDout
????memcpy(TDout?TD12?sizeof(complex)*count);
//?釋放內存
delete?X1;
delete?X2;
delete?FD1;
delete?FD2;
delete?FD12;
????delete?TD12;
}
/***********************
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????14465??2006-09-26?10:25??CONV&CORR\CONV&CORR.cpp
?????文件????????501??2006-09-15?10:51??CONV&CORR\CONV&CORR.h
?????目錄??????????0??2013-03-23?23:36??CONV&CORR
-----------?---------??----------?-----??----
????????????????14966????????????????????3
- 上一篇:mfc 物業管理系統
- 下一篇:圖書管理系統MFC+SQL+VC
評論
共有 條評論