c语言数学函数fft
\u6c42FFT\u7684c\u8bed\u8a00\u7a0b\u5e8f\u5feb\u901f\u5085\u91cc\u53f6\u53d8\u6362 \u8981\u7528C++ \u624d\u884c\u5427 \u4f60\u53ef\u4ee5\u7528MATLAB\u6765\u5b9e\u73b0\u66f4\u65b9\u4fbf\u70b9\u554a
\u6b64FFT \u662f\u7528VC6.0\u7f16\u5199\uff0c\u7531FFT.CPP\uff1bSTDAFX.H\u548cSTDAFX.CPP\u4e09\u4e2a\u6587\u4ef6\u7ec4\u6210\uff0c\u7f16\u8bd1\u6210\u529f\u3002\u7a0b\u5e8f\u53ef\u4ee5\u7528\u6587\u4ef6\u8f93\u5165\u548c\u8f93\u51fa\u4e3a\u6587\u4ef6\u3002\u6587\u4ef6\u683c\u5f0f\u4e3aTXT\u6587\u4ef6\u3002\u6d4b\u8bd5\u7ed3\u679c\u5982\u4e0b\uff1a
\u8f93\u5165\u6587\u4ef6\uff1a8.TXT \u6216\u624b\u52a8\u8f93\u5165
8 //N
1
2
3
4
5
6
7
8
\u8f93\u51fa\u7ed3\u679c\u4e3a\uff1a\u6216\u4fdd\u5b58\u4e3aTXT\u6587\u4ef6\u3002\uff088OUT.TXT\uff09
8
(36,0)
(-4,9.65685)
(-4,4)
(-4,1.65685)
(-4,0)
(-4,-1.65685)
(-4,-4)
(-4,-9.65685)
\u4e0b\u9762\u4e3aFFT.CPP\u6587\u4ef6\uff1a
// FFT.cpp : \u5b9a\u4e49\u63a7\u5236\u53f0\u5e94\u7528\u7a0b\u5e8f\u7684\u5165\u53e3\u70b9\u3002
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
#include
using namespace std;
bool inputData(unsigned long &, vector >&); //\u624b\u5de5\u8f93\u5165\u6570\u636e
void FFT(unsigned long &, vector >&); //FFT\u53d8\u6362
void display(unsigned long &, vector >&); //\u663e\u793a\u7ed3\u679c
bool readDataFromFile(unsigned long &, vector >&); //\u4ece\u6587\u4ef6\u4e2d\u8bfb\u53d6\u6570\u636e
bool saveResultToFile(unsigned long &, vector >&); //\u4fdd\u5b58\u7ed3\u679c\u81f3\u6587\u4ef6\u4e2d
const double PI = 3.1415926;
int _tmain(int argc, _TCHAR* argv[])
{
vector > vecList; //\u6709\u9650\u957f\u5e8f\u5217
unsigned long ulN = 0; //N
char chChoose = ' '; //\u529f\u80fd\u9009\u62e9
//\u529f\u80fd\u5faa\u73af
while(chChoose != 'Q' && chChoose != 'q')
{
//\u663e\u793a\u9009\u62e9\u9879
cout << "\nPlease chose a function" << endl;
cout << "\t1.Input data manually, press 'M':" << endl;
cout << "\t2.Read data from file, press 'F':" << endl;
cout << "\t3.Quit, press 'Q'" << endl;
cout << "Please chose:";
//\u8f93\u5165\u9009\u62e9
chChoose = getch();
//\u5224\u65ad
switch(chChoose)
{
case 'm': //\u624b\u5de5\u8f93\u5165\u6570\u636e
case 'M':
if(inputData(ulN, vecList))
{
FFT(ulN, vecList);
display(ulN, vecList);
saveResultToFile(ulN, vecList);
}
break;
case 'f': //\u4ece\u6587\u6863\u8bfb\u53d6\u6570\u636e
case 'F':
if(readDataFromFile(ulN, vecList))
{
FFT(ulN, vecList);
display(ulN, vecList);
saveResultToFile(ulN, vecList);
}
break;
}
}
return 0;
}
bool Is2Power(unsigned long ul) //\u5224\u65ad\u662f\u5426\u662f2\u7684\u6574\u6570\u6b21\u5e42
{
if(ul < 2)
return false;
while( ul > 1 )
{
if( ul % 2 )
return false;
ul /= 2;
}
return true;
}
bool inputData(unsigned long & ulN, vector >& vecList)
{
//\u9898\u76ee
cout<< "\n\n\n==============================Input Data===============================" << endl;
//\u8f93\u5165N
cout<< "\nInput N:";
cin>>ulN;
if(!Is2Power(ulN)) //\u9a8c\u8bc1N\u7684\u6709\u6548\u6027
{
cout<< "N is invalid (N must like 2, 4, 8, .....), please retry." << endl;
return false;
}
//\u8f93\u5165\u5404\u5143\u7d20
vecList.clear(); //\u6e05\u7a7a\u539f\u6709\u5e8f\u5217
complex c;
for(unsigned long i = 0; i < ulN; i++)
{
cout << "Input x(" << i << "):";
cin >> c;
vecList.push_back(c);
}
return true;
}
bool readDataFromFile(unsigned long & ulN, vector >& vecList) //\u4ece\u6587\u4ef6\u4e2d\u8bfb\u53d6\u6570\u636e
{
//\u9898\u76ee
cout<< "\n\n\n===============Read Data From File==============" << endl;
//\u8f93\u5165\u6587\u4ef6\u540d
string strfilename;
cout << "Input filename:" ;
cin >> strfilename;
//\u6253\u5f00\u6587\u4ef6
cout << "open file " << strfilename << "......." <<endl;
ifstream loadfile;
loadfile.open(strfilename.c_str());
if(!loadfile)
{
cout << "\tfailed" << endl;
return false;
}
else
{
cout << "\tsucceed" << endl;
}
vecList.clear();
//\u8bfb\u53d6N
loadfile >> ulN;
if(!loadfile)
{
cout << "can't get N" << endl;
return false;
}
else
{
cout << "N = " << ulN << endl;
}
//\u8bfb\u53d6\u5143\u7d20
complex c;
for(unsigned long i = 0; i < ulN; i++)
{
loadfile >> c;
if(!loadfile)
{
cout << "can't get enough infomation" << endl;
return false;
}
else
cout << "x(" << i << ") = " << c << endl;
vecList.push_back(c);
}
//\u5173\u95ed\u6587\u4ef6
loadfile.close();
return true;
}
bool saveResultToFile(unsigned long & ulN, vector >& vecList) //\u4fdd\u5b58\u7ed3\u679c\u81f3\u6587\u4ef6\u4e2d
{
//\u8be2\u95ee\u662f\u5426\u9700\u8981\u5c06\u7ed3\u679c\u4fdd\u5b58\u81f3\u6587\u4ef6
char chChoose = ' ';
cout << "Do you want to save the result to file? (y/n):";
chChoose = _getch();
if(chChoose != 'y' && chChoose != 'Y')
{
return true;
}
//\u8f93\u5165\u6587\u4ef6\u540d
string strfilename;
cout << "\nInput file name:" ;
cin >> strfilename;
cout << "Save result to file " << strfilename << "......" << endl;
//\u6253\u5f00\u6587\u4ef6
ofstream savefile(strfilename.c_str());
if(!savefile)
{
cout << "can't open file" << endl;
return false;
}
//\u5199\u5165N
savefile << ulN << endl;
//\u5199\u5165\u5143\u7d20
for(vector >::iterator i = vecList.begin(); i < vecList.end(); i++)
{
savefile << *i << endl;
}
//\u5199\u5165\u5b8c\u6bd5
cout << "save succeed." << endl;
//\u5173\u95ed\u6587\u4ef6
savefile.close();
return true;
}
void FFT(unsigned long & ulN, vector >& vecList)
{
//\u5f97\u5230\u5e42\u6570
unsigned long ulPower = 0; //\u5e42\u6570
unsigned long ulN1 = ulN - 1;
while(ulN1 > 0)
{
ulPower++;
ulN1 /= 2;
}
//\u53cd\u5e8f
bitset bsIndex; //\u4e8c\u8fdb\u5236\u5bb9\u5668
unsigned long ulIndex; //\u53cd\u8f6c\u540e\u7684\u5e8f\u53f7
unsigned long ulK;
for(unsigned long p = 0; p < ulN; p++)
{
ulIndex = 0;
ulK = 1;
bsIndex = bitset(p);
for(unsigned long j = 0; j < ulPower; j++)
{
ulIndex += bsIndex.test(ulPower - j - 1) ? ulK : 0;
ulK *= 2;
}
if(ulIndex > p)
{
complex c = vecList[p];
vecList[p] = vecList[ulIndex];
vecList[ulIndex] = c;
}
}
//\u8ba1\u7b97\u65cb\u8f6c\u56e0\u5b50
vector > vecW;
for(unsigned long i = 0; i < ulN / 2; i++)
{
vecW.push_back(complex(cos(2 * i * PI / ulN) , -1 * sin(2 * i * PI / ulN)));
}
for(unsigned long m = 0; m < ulN / 2; m++)
{
cout<< "\nvW[" << m << "]=" << vecW[m];
}
//\u8ba1\u7b97FFT
unsigned long ulGroupLength = 1; //\u6bb5\u7684\u957f\u5ea6
unsigned long ulHalfLength = 0; //\u6bb5\u957f\u5ea6\u7684\u4e00\u534a
unsigned long ulGroupCount = 0; //\u6bb5\u7684\u6570\u91cf
complex cw; //WH(x)
complex c1; //G(x) + WH(x)
complex c2; //G(x) - WH(x)
for(unsigned long b = 0; b < ulPower; b++)
{
ulHalfLength = ulGroupLength;
ulGroupLength *= 2;
for(unsigned long j = 0; j < ulN; j += ulGroupLength)
{
for(unsigned long k = 0; k < ulHalfLength; k++)
{
cw = vecW[k * ulN / ulGroupLength] * vecList[j + k + ulHalfLength];
c1 = vecList[j + k] + cw;
c2 = vecList[j + k] - cw;
vecList[j + k] = c1;
vecList[j + k + ulHalfLength] = c2;
}
}
}
}
void display(unsigned long & ulN, vector >& vecList)
{
cout << "\n\n===========================Display The Result=========================" << endl;
for(unsigned long d = 0; d < ulN;d++)
{
cout << "X(" << d << ")\t\t\t = " << vecList[d] << endl;
}
}
\u4e0b\u9762\u4e3aSTDAFX.H\u6587\u4ef6\uff1a
// stdafx.h : \u6807\u51c6\u7cfb\u7edf\u5305\u542b\u6587\u4ef6\u7684\u5305\u542b\u6587\u4ef6\uff0c
// \u6216\u662f\u5e38\u7528\u4f46\u4e0d\u5e38\u66f4\u6539\u7684\u9879\u76ee\u7279\u5b9a\u7684\u5305\u542b\u6587\u4ef6
#pragma once
#include
#include
// TODO: \u5728\u6b64\u5904\u5f15\u7528\u7a0b\u5e8f\u8981\u6c42\u7684\u9644\u52a0\u5934\u6587\u4ef6
\u4e0b\u9762\u4e3aSTDAFX.CPP\u6587\u4ef6\uff1a
// stdafx.cpp : \u53ea\u5305\u62ec\u6807\u51c6\u5305\u542b\u6587\u4ef6\u7684\u6e90\u6587\u4ef6
// FFT.pch \u5c06\u6210\u4e3a\u9884\u7f16\u8bd1\u5934
// stdafx.obj \u5c06\u5305\u542b\u9884\u7f16\u8bd1\u7c7b\u578b\u4fe1\u606f
#include "stdafx.h"
// TODO: \u5728 STDAFX.H \u4e2d
//\u5f15\u7528\u4efb\u4f55\u6240\u9700\u7684\u9644\u52a0\u5934\u6587\u4ef6\uff0c\u800c\u4e0d\u662f\u5728\u6b64\u6587\u4ef6\u4e2d\u5f15\u7528
#include
#include
#include
#define N 1000
/*\u5b9a\u4e49\u590d\u6570\u7c7b\u578b*/
typedef struct{
double real;
double img;
}complex;
complex x[N], *W; /*\u8f93\u5165\u5e8f\u5217,\u53d8\u6362\u6838*/
int size_x=0; /*\u8f93\u5165\u5e8f\u5217\u7684\u5927\u5c0f\uff0c\u5728\u672c\u7a0b\u5e8f\u4e2d\u4ec5\u96502\u7684\u6b21\u5e42*/
double PI; /*\u5706\u5468\u7387*/
void fft(); /*\u5feb\u901f\u5085\u91cc\u53f6\u53d8\u6362*/
void initW(); /*\u521d\u59cb\u5316\u53d8\u6362\u6838*/
void change(); /*\u53d8\u5740*/
void add(complex ,complex ,complex *); /*\u590d\u6570\u52a0\u6cd5*/
void mul(complex ,complex ,complex *); /*\u590d\u6570\u4e58\u6cd5*/
void sub(complex ,complex ,complex *); /*\u590d\u6570\u51cf\u6cd5*/
void output();
int main(){
int i; /*\u8f93\u51fa\u7ed3\u679c*/
system("cls");
PI=atan(1)*4;
printf("Please input the size of x:\n");
scanf("%d",&size_x);
printf("Please input the data in x[N]:\n");
for(i=0;i<size_x;i++)
scanf("%lf%lf",&x[i].real,&x[i].img);
initW();
fft();
output();
return 0;
}
/*\u5feb\u901f\u5085\u91cc\u53f6\u53d8\u6362*/
void fft(){
int i=0,j=0,k=0,l=0;
complex up,down,product;
change();
for(i=0;i< log(size_x)/log(2) ;i++){ /*\u4e00\u7ea7\u8776\u5f62\u8fd0\u7b97*/
l=1<<i;
for(j=0;j<size_x;j+= 2*l ){ /*\u4e00\u7ec4\u8776\u5f62\u8fd0\u7b97*/
for(k=0;k<l;k++){ /*\u4e00\u4e2a\u8776\u5f62\u8fd0\u7b97*/
mul(x[j+k+l],W[size_x*k/2/l],&product);
add(x[j+k],product,&up);
sub(x[j+k],product,&down);
x[j+k]=up;
x[j+k+l]=down;
}
}
}
}
/*\u521d\u59cb\u5316\u53d8\u6362\u6838*/
void initW(){
int i;
W=(complex *)malloc(sizeof(complex) * size_x);
for(i=0;i<size_x;i++){
W[i].real=cos(2*PI/size_x*i);
W[i].img=-1*sin(2*PI/size_x*i);
}
}
/*\u53d8\u5740\u8ba1\u7b97\uff0c\u5c06x(n)\u7801\u4f4d\u5012\u7f6e*/
void change(){
complex temp;
unsigned short i=0,j=0,k=0;
double t;
for(i=0;i<size_x;i++){
k=i;j=0;
t=(log(size_x)/log(2));
while( (t--)>0 ){
j=j<<1;
j|=(k & 1);
k=k>>1;
}
if(j>i){
temp=x[i];
x[i]=x[j];
x[j]=temp;
}
}
}
/*\u8f93\u51fa\u5085\u91cc\u53f6\u53d8\u6362\u7684\u7ed3\u679c*/
void output(){
int i;
printf("The result are as follows\n");
for(i=0;i<size_x;i++){
printf("%.4f",x[i].real);
if(x[i].img>=0.0001)printf("+%.4fj\n",x[i].img);
else if(fabs(x[i].img)<0.0001)printf("\n");
else printf("%.4fj\n",x[i].img);
}
}
void add(complex a,complex b,complex *c){
c->real=a.real+b.real;
c->img=a.img+b.img;
}
void mul(complex a,complex b,complex *c){
c->real=a.real*b.real - a.img*b.img;
c->img=a.real*b.img + a.img*b.real;
}
void sub(complex a,complex b,complex *c){
c->real=a.real-b.real;
c->img=a.img-b.img;
}
绛旓細1銆佷簩缁FFT鐩稿綋浜庡琛屽拰鍒楀垎鍒繘琛屼竴缁碏FT杩愮畻銆傚叿浣撶殑瀹炵幇鍔炴硶濡備笅锛氬厛瀵瑰悇琛岄愪竴杩涜涓缁碏FT锛岀劧鍚庡啀瀵瑰彉鎹㈠悗鐨勬柊鐭╅樀鐨勫悇鍒楅愪竴杩涜涓缁碏FT銆傜浉搴旂殑浼唬鐮佸涓嬫墍绀猴細for (int i=0; i<M; i++)FFT_1D(ROW[i]锛孨);for (int j=0; j<N; j++)FFT_1D(COL[j]锛孧);鍏朵腑锛孯OW[i]琛ㄧず...
绛旓細void fft(){ int nn,n1,n2,i,j,k,l,m,s,l1;float ar[1024],ai[1024]; // 瀹為儴 铏氶儴 float a[2050];float t1,t2,x,y;float w1,w2,u1,u2,z;float fsin[10]={0.000000,1.000000,0.707107,0.3826834,0.1950903,0.09801713,0.04906767,0.02454123,0.01227154,0.00613588,};/...
绛旓細2010-12-01 姹傜敤C璇█瀹炵幇FFT鍙樻崲鐨勭▼搴(瑙佷笅闈) 5 2015-01-09 璋佽兘缁欎竴涓狢璇█鐨凢FT绠楁硶绋嬪簭鍟,鎬ョ敤 2015-04-14 姹傚倕绔嬪彾鍙樻崲鐨c璇█绋嬪簭 8 2011-04-10 姹侳FT鐨凜璇█瀹炵幇 14 2015-08-30 姹備釜蹇熷倕閲屽彾鍙樻崲鐨凜璇█绋嬪簭 2 2011-12-05 鎬庢牱鐢–璇█瀹炵幇FFT绠楁硶鍟? 3 2012-05-24 姹侳FT...
绛旓細鍏充簬fft绠楁硶c璇█瀹炵幇璇﹁В锛宖ft绠楁硶杩欎釜寰堝浜鸿繕涓嶇煡閬擄紝浠婂ぉ鏉ヤ负澶у瑙g瓟浠ヤ笂鐨勯棶棰橈紝鐜板湪璁╂垜浠竴璧锋潵鐪嬬湅鍚э紒1銆佸揩閫熷倕閲屽彾鍙樻崲锛屾槸璁$畻鏈虹畻鍌呴噷鍙跺彉鎹㈢殑甯哥敤鏂规硶銆2銆併FFT锛團ast Fourier Transformation锛夛紝鍗充负蹇熷倕姘忓彉鎹紝鏄鏁e倕姘忓彉鎹㈢殑蹇熺畻娉曪紝瀹冩槸鏍规嵁绂绘暎鍌呮皬鍙樻崲鐨勫銆佸伓銆佽櫄銆佸疄绛夌壒鎬...
绛旓細浣犲ソ锛岃繖鏄垜鐨勫洖绛旓紝甯屾湜鍙互甯埌浣犮1锛夌粨鏋滆璁 涓锛屽鏋滃淇″彿杩涜鍚屾牱鐐规暟N鐨FFT鍙樻崲锛岄噰鏍烽鐜噁s瓒婇珮锛屽垯鍙互鍒嗘瀽瓒婇珮棰戠殑淇″彿锛涗笌姝ゅ悓鏃讹紝閲囨牱棰戠巼瓒婁綆锛屽浜庝綆棰戜俊鍙风殑棰戣氨鍒嗚鲸鐜囧垯瓒婂ソ銆備簩锛屽亣璁鹃噰鏍风偣涓嶅湪姝e鸡淇″彿鐨勬尝宄般佹尝璋枫佷互鍙0鐢靛帇澶勶紝棰戣氨鍒欎細浜х敓娉勯湶锛坙eakage锛夈備笁锛屽浜庡悓鏍风殑閲囨牱...
绛旓細1.FFT锛// data涓鸿緭鍏ュ拰杈撳嚭鐨勬暟鎹紝N涓洪暱搴ool CFFT::Forward(complex *const Data, const unsigned int N){ if (!Data || N < 1 || N & (N - 1)) return false; // 鎺掑簭 Rearrange(Data, N); // FFT璁$畻锛歝onst bool Inverse = false Perform(Data,...
绛旓細float ar[1024],ai[1024];/* 鍘熷鏁版嵁瀹為儴锛岃櫄閮 */ float a[2050];void fft(int nn) /* nn鏁版嵁闀垮害 */ { int n1,n2,i,j,k,l,m,s,l1;float t1,t2,x,y;float w1,w2,u1,u2,z;float fsin[10]={0.000000,1.000000,0.707107,0.3826834,0.1950903,0.09801713,0.04906767,0...
绛旓細file=get(handles.edit1,'string'); % 寰楀埌鍥惧儚鏂囦欢鍚嶅拰璺緞 X=imread(file); % 璇诲叆鍥惧儚 fftI=fft2(X); % 鍌呯珛鍙惰浆鎹 sfftI=fftshift(fftI); % 骞崇Щ RR=real(sfftI); % 瀹為儴 II=imag(sfftI); % 铏氶儴 A=sqrt(RR.^2+II.^2); % 璺濈 A=(A-min(...
绛旓細ezsurfc 鐢诲甫绛変綅绾跨殑琛ㄩ潰鍥剧殑绠鎹锋寚浠 F f factor 绗﹀彿璁$畻鐨勫洜寮忓垎瑙 feather 缇芥瘺鍥 feedback 鍙嶉杩炴帴 feval 鎵ц鐢变覆鎸囧畾鐨鍑芥暟 fft 绂绘暎Fourier鍙樻崲 fft2 浜岀淮绂绘暎Fourier鍙樻崲 fftn 楂樼淮绂绘暎Fourier鍙樻崲 fftshift 鐩存祦鍒嗛噺瀵逛腑鐨勮氨 fieldnames 鏋勬灦鍩熷悕 figure 鍒涘缓鍥惧舰绐 fill3 涓夌淮澶氳竟褰㈠~鑹插浘 find 瀵绘壘闈...
绛旓細澶х锛屽彲浠ュ湪for璇彞鍐呭畾涔夊彉閲忥紵锛燂紵鎴戠敤鐨凜-Free,杩欏潡缂栬瘧閫氫笉杩囷紝鏀逛簡灏卞彲浠ヤ簡