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;
}

都是double类型的数组

  • 鎬庢牱鐢C璇█瀹炵幇FFT绠楁硶鍟?
    绛旓細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]琛ㄧず...
  • C璇█ 1024鐐瑰揩閫熷倕閲屽彾鍙樻崲(FFT)绋嬪簭,鏈濂界粡杩囦紭鍖,鎵ц閫熷害蹇玙鐧惧害鐭 ...
    绛旓細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,};/...
  • 姹FFT鐨c璇█绋嬪簭
    绛旓細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璇█瀹炵幇璇﹁Вfft绠楁硶
    绛旓細鍏充簬fft绠楁硶c璇█瀹炵幇璇﹁В锛宖ft绠楁硶杩欎釜寰堝浜鸿繕涓嶇煡閬擄紝浠婂ぉ鏉ヤ负澶у瑙g瓟浠ヤ笂鐨勯棶棰橈紝鐜板湪璁╂垜浠竴璧锋潵鐪嬬湅鍚э紒1銆佸揩閫熷倕閲屽彾鍙樻崲锛屾槸璁$畻鏈虹畻鍌呴噷鍙跺彉鎹㈢殑甯哥敤鏂规硶銆2銆併FFT锛團ast Fourier Transformation锛夛紝鍗充负蹇熷倕姘忓彉鎹紝鏄鏁e倕姘忓彉鎹㈢殑蹇熺畻娉曪紝瀹冩槸鏍规嵁绂绘暎鍌呮皬鍙樻崲鐨勫銆佸伓銆佽櫄銆佸疄绛夌壒鎬...
  • 姹傜敤C璇█瀹炵幇FFT鍙樻崲鐨勭▼搴(瑙佷笅闈)
    绛旓細浣犲ソ锛岃繖鏄垜鐨勫洖绛旓紝甯屾湜鍙互甯埌浣犮1锛夌粨鏋滆璁 涓锛屽鏋滃淇″彿杩涜鍚屾牱鐐规暟N鐨FFT鍙樻崲锛岄噰鏍烽鐜噁s瓒婇珮锛屽垯鍙互鍒嗘瀽瓒婇珮棰戠殑淇″彿锛涗笌姝ゅ悓鏃讹紝閲囨牱棰戠巼瓒婁綆锛屽浜庝綆棰戜俊鍙风殑棰戣氨鍒嗚鲸鐜囧垯瓒婂ソ銆備簩锛屽亣璁鹃噰鏍风偣涓嶅湪姝e鸡淇″彿鐨勬尝宄般佹尝璋枫佷互鍙0鐢靛帇澶勶紝棰戣氨鍒欎細浜х敓娉勯湶锛坙eakage锛夈備笁锛屽浜庡悓鏍风殑閲囨牱...
  • 姹傚熀2銆佸熀4銆佸熀8FFT(蹇熷倕閲屽彾鍙樻崲)鐨c璇█绋嬪簭,瑕佽兘杩愯寰楀嚭鏉ョ殑_鐧...
    绛旓細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,...
  • 濡備綍鐢C璇█鎴栨眹缂栬瑷瀹炵幇FFT鍙樻崲,骞跺啓鍑篊璇█鎴栨眹缂栦唬鐮,涓囧垎鎰熻阿...
    绛旓細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...
  • 绂绘暎鍌呴噷鍙跺彉鎹㈠湪C璇█涓緱鍐欐硶
    绛旓細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(...
  • matlab7.0鏈夊摢浜鍑芥暟鍙互鐩存帴鐢
    绛旓細ezsurfc 鐢诲甫绛変綅绾跨殑琛ㄩ潰鍥剧殑绠鎹锋寚浠 F f factor 绗﹀彿璁$畻鐨勫洜寮忓垎瑙 feather 缇芥瘺鍥 feedback 鍙嶉杩炴帴 feval 鎵ц鐢变覆鎸囧畾鐨鍑芥暟 fft 绂绘暎Fourier鍙樻崲 fft2 浜岀淮绂绘暎Fourier鍙樻崲 fftn 楂樼淮绂绘暎Fourier鍙樻崲 fftshift 鐩存祦鍒嗛噺瀵逛腑鐨勮氨 fieldnames 鏋勬灦鍩熷悕 figure 鍒涘缓鍥惧舰绐 fill3 涓夌淮澶氳竟褰㈠~鑹插浘 find 瀵绘壘闈...
  • C璇█楂樻墜鐪嬬湅杩欐绋嬪簭鍝噷涓嶅,澶嶆暟FFT
    绛旓細澶х锛屽彲浠ュ湪for璇彞鍐呭畾涔夊彉閲忥紵锛燂紵鎴戠敤鐨凜-Free,杩欏潡缂栬瘧閫氫笉杩囷紝鏀逛簡灏卞彲浠ヤ簡
  • 扩展阅读:c语言库函数大全 ... c语言常用的32个关键字 ... c语言引入数学函数库 ... c语言万能头文件 ... c语言数学头文件怎么写 ... c语言数学函数pow ... c语言数学符号头文件 ... c语言数学函数有哪些 ... c语言数学函数库头文件名 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网