| /* 函數名稱(chēng):FFT() * 參數: * complex<double> * TD - 指向時(shí)域數組的指針 * complex<double> * FD - 指向頻域數組的指針 * r -2的冪數,即迭代次數 * 返回值: 無(wú)。 * 說(shuō)明:該函數用來(lái)實(shí)現快速傅立葉變換 */ void FFT(complex<double> * TD, complex<double> * FD, int r) { LONG count; // 傅立葉變換點(diǎn)數 int i,j,k; // 循環(huán)變量 int bfsize,p; // 中間變量 double angle; // 角度 complex<double> *W,*X1,*X2,*X; count = 1 << r; //傅立葉變換點(diǎn)數 // 分配運算所需存儲器 W = new complex<double>[count / 2]; X1 = new complex<double>[count]; X2 = new complex<double>[count]; // 計算加權系數 for(i = 0; i < count / 2; i++) { angle = -i * PI * 2 / count; W[i] = complex<double> (cos(angle), sin(angle)); } // 將時(shí)域點(diǎn)寫(xiě)入X1 memcpy(X1, TD, sizeof(complex<double>) * count); // 采用蝶形算法進(jìn)行快速傅立葉變換 for(k = 0; k < r; k++) { for(j = 0; j < 1 << k; j++) { bfsize = 1 << (r-k); for(i = 0; i < bfsize / 2; i++) { p = j * bfsize; X2[i + p] = X1[i + p] + X1[i + p + bfsize / 2]; X2[i + p + bfsize / 2] = (X1[i + p] - X1[i + p + bfsize / 2]) * W[i * (1<<k)]; } } X = X1; X1 = X2; X2 = X; } // 重新排序 for(j = 0; j < count; j++) { p = 0; for(i = 0; i < r; i++) { if (j&(1<<i)) { p+=1<<(r-i-1); } } FD[j]=X1[p]; } // 釋放內存 delete W; delete X1; delete X2; } |
| #ifndef FFT_H #define FFT_H #include <complex> using namespace std; extern "C" void __declspec(dllexport) __stdcall FFT(complex<double> * TD, complex<double> * FD, int r); #define PI 3.1415926 #endif fft.cpp的源代碼為: /* 文件名:fft.cpp */ #include "fft.h" void __stdcall FFT(complex<double> * TD, complex<double> * FD, int r) { …//讀者提供的函數代碼 } |
![]() 圖18 中文對話(huà)框 |
| ///////////////////////////////////////////////////////////////////////////// // Chinese (P.R.C.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) #ifdef _WIN32 LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED #pragma code_page(936) #endif //_WIN32 |
| ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 |
![]() 圖19英文對話(huà)框 |
| CResourceDllCallDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); |
| //獲取操作系統的語(yǔ)言 WORD wLangPID = PRIMARYLANGID( GetSystemDefaultLangID() ); if( LANG_CHINESE == wLangPID ) { hLanguageDll = LoadLibrary( "ChineseDll.dll" ); //加載中文資源 } else { hLanguageDll = LoadLibrary( "EnglishDll.dll" ); //加載英文資源 } if( NULL == hLanguageDll ) { AfxMessageBox( "Load DLL failure" ); return FALSE; } AfxSetResourceHandle( hLanguageDll ); //設置當前的資源句柄 |
![]() 圖20 PC的串口 |
| //打開(kāi)指定的串口,其參數port為端口號 BOOL ComOpen(int port); //在這個(gè)函數里使用默認的參數設置串口 //將打開(kāi)的串口關(guān)閉 void ComClose(int port); //將串口接收緩沖區中的數據放到buffer中 int GetComData(char *buf, int buf_len); //將指定長(cháng)度的數據發(fā)送到串口 int SendDataToCom(LPBYTE buf,int buf_Len); |
| //com.h:com類(lèi)通信接口 class AFX_EXT_CLASS com { public: ComOpen(int port) { … } int SendDataToCom(LPBYTE buf,int buf_Len) { … } int GetComData(char *buf, int buf_len) { … } void ComClose() { … } } |
| #include <iostream> #include <exception> using namespace std; #include <windows.h> #include "com.h" //包含DLL中導出類(lèi)的頭文件 int main(int argc, char *argv[]) { try { char str[] = "com_class test"; com com1; com1.ComOpen (1); for(int i=0; i<100; i++) //以同步方式寫(xiě)com的buffer { Sleep(500); com1.SendDataToCom (str,strlen(str)); } com1.ComClose (); } catch(exception &e) { cout << e.what() << endl; } return 0; } |
聯(lián)系客服