/* 函數(shù)名稱:FFT() * 參數(shù): * complex<double> * TD - 指向時(shí)域數(shù)組的指針 * complex<double> * FD - 指向頻域數(shù)組的指針 * r -2的冪數(shù),即迭代次數(shù) * 返回值: 無(wú)。 * 說明:該函數(shù)用來實(shí)現(xiàn)快速傅立葉變換 */ void FFT(complex<double> * TD, complex<double> * FD, int r) { LONG count; // 傅立葉變換點(diǎn)數(shù) int i,j,k; // 循環(huán)變量 int bfsize,p; // 中間變量 double angle; // 角度 complex<double> *W,*X1,*X2,*X; count = 1 << r; //傅立葉變換點(diǎn)數(shù) // 分配運(yùn)算所需存儲(chǔ)器 W = new complex<double>[count / 2]; X1 = new complex<double>[count]; X2 = new complex<double>[count]; // 計(jì)算加權(quán)系數(shù) for(i = 0; i < count / 2; i++) { angle = -i * PI * 2 / count; W[i] = complex<double> (cos(angle), sin(angle)); } // 將時(shí)域點(diǎn)寫入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]; } // 釋放內(nèi)存 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) { …//讀者提供的函數(shù)代碼 } |
![]() 圖18 中文對(duì)話框 |
///////////////////////////////////////////////////////////////////////////// // 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英文對(duì)話框 |
CResourceDllCallDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); |
//獲取操作系統(tǒng)的語(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 ); //設(shè)置當(dāng)前的資源句柄 |
![]() 圖20 PC的串口 |
//打開指定的串口,其參數(shù)port為端口號(hào) BOOL ComOpen(int port); //在這個(gè)函數(shù)里使用默認(rèn)的參數(shù)設(shè)置串口 //將打開的串口關(guān)閉 void ComClose(int port); //將串口接收緩沖區(qū)中的數(shù)據(jù)放到buffer中 int GetComData(char *buf, int buf_len); //將指定長(zhǎng)度的數(shù)據(jù)發(fā)送到串口 int SendDataToCom(LPBYTE buf,int buf_Len); |
//com.h:com類通信接口 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中導(dǎo)出類的頭文件 int main(int argc, char *argv[]) { try { char str[] = "com_class test"; com com1; com1.ComOpen (1); for(int i=0; i<100; i++) //以同步方式寫com的buffer { Sleep(500); com1.SendDataToCom (str,strlen(str)); } com1.ComClose (); } catch(exception &e) { cout << e.what() << endl; } return 0; } |
聯(lián)系客服