1.加图标ID_FFT,类向导在视类添加相应函数2.BMP文件中增加:BITMAPINFO*lpDIB=NULL;//原时域图像BITMAPINFO*lpDIB_FFT=NULL;//频谱图像staticDWORDLineBytes=0;//图像每行像素所占字节数staticLONGsize=0;//图像实际数据所占字节数注意:在LoadBmpFile函数中//删除LONGsize=sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;中的LONG//删除DWORDLineBytes=(bi.biWidth*bi.biBitCount+31)/32*4;中的DWORD//在“if(NULL==(lpBitsInfo=(LPBITMAPINFO)malloc(size)))returnFALSE;”后面给lpDIB分配内存“if(NULL==(lpDIB=(LPBITMAPINFO)malloc(size)))returnFALSE;“//在“fread((char*)lpBitsInfo,size,1,fp);”后面添加“lpDIB=lpBitsInfo”在视类OnDraw前中增加:externBITMAPINFO*lpDIB_FFT;externBITMAPINFO*lpDIB;OnDraw中增加:if(lpDIB_FFT){lpBits=(LPVOID)&lpDIB_FFT-bmiColors[lpDIB_FFT-bmiHeader.biClrUsed];StretchDIBits(pDC-GetSafeHdc(),600,0,lpDIB_FFT-bmiHeader.biWidth,lpDIB_FFT-bmiHeader.biHeight,0,0,lpDIB_FFT-bmiHeader.biWidth,lpDIB_FFT-bmiHeader.biHeight,lpBits,lpDIB_FFT,//bitmapdataDIB_RGB_COLORS,SRCCOPY);}3.在视类添加voidFourier();voidCFFTView::OnFft(){if(lpDIB_FFT)free(lpDIB_FFT);Fourier();Invalidate();}voidCFFTView::OnUpdateFft(CCmdUI*pCmdUI){pCmdUI-Enable(lpDIB!=NULL);}4.BMP文件前面添加#includecomplexusingnamespacestd;(PPT中Copy)#definePI3.14159265354.BMP文件中添加函数voidFourier(){}5.BMP文件中添加函数一维傅里叶变换函数FFT()(红色加粗是需要自己写的,其他的为PPT中Copy)voidFFT(complexdouble*TD,complexdouble*FD,intr){//计算付立叶变换点数LONGcount=1r;//计算加权系数inti;doubleangle;complexdouble*W=newcomplexdouble[count/2];for(i=0;icount/2;i++){angle=-i*PI*2/count;W[i]=complexdouble(cos(angle),sin(angle));}//将时域点写入X1complexdouble*X1=newcomplexdouble[count];memcpy(X1,TD,sizeof(complexdouble)*count);//采用蝶形算法进行快速付立叶变换,输出为频域值X2complexdouble*X2=newcomplexdouble[count];intk,j,p,size;complexdouble*temp;for(k=0;kr;k++){for(j=0;j1k;j++){size=1(r-k);for(i=0;isize/2;i++){p=j*size;X2[i+p]=X1[i+p]+X1[i+p+size/2];X2[i+p+size/2]=(X1[i+p]-X1[i+p+size/2])*W[i*(1k)];}}temp=X1;X1=X2;X2=temp;}//重新排序(码位倒序排列)for(j=0;jcount;j++){p=0;for(i=0;ir;i++){if(j&(1i)){p+=1(r-i-1);}}FD[j]=X1[p];}//释放内存deleteW;deleteX1;deleteX2;}5.BMP文件中添加函数Fourier()voidFourier(){//图像的宽度和高度intwidth=lpDIB-bmiHeader.biWidth;intheight=lpDIB-bmiHeader.biHeight;//指向图像数据指针BYTE*lpBits=(BYTE*)&lpDIB-bmiColors[lpDIB-bmiHeader.biClrUsed];//FFT宽度(必须为2的整数次方)intFFT_w=1;//FFT宽度的幂数,即迭代次数intwp=0;while(FFT_w*2=width){FFT_w*=2;wp++;}//FFT高度(必须为2的整数次方)intFFT_h=1;//FFT高度的幂数,即迭代次数inthp=0;while(FFT_h*2=height){FFT_h*=2;hp++;}//分配内存complexdouble*TD=newcomplexdouble[FFT_w*FFT_h];complexdouble*FD=newcomplexdouble[FFT_w*FFT_h];inti,j;BYTE*pixel;for(i=0;iFFT_h;i++)//行{for(j=0;jFFT_w;j++)//列{//指向DIB第i行,第j个象素的指针pixel=lpBits+LineBytes*(height-1-i)+j;//给时域赋值TD[j+FFT_w*i]=complexdouble(*pixel,0);}}for(i=0;iFFT_h;i++){//对y方向进行快速付立叶变换FFT(&TD[FFT_w*i],&FD[FFT_w*i],wp);}//保存中间变换结果for(i=0;iFFT_h;i++){for(j=0;jFFT_w;j++){TD[i+FFT_h*j]=FD[j+FFT_w*i];}}for(i=0;iFFT_w;i++){//对x方向进行快速付立叶变换FFT(&TD[i*FFT_h],&FD[i*FFT_h],hp);}//删除临时变量deleteTD;//生成频谱图像//为频域图像分配内存lpDIB_FFT=(LPBITMAPINFO)malloc(size);if(NULL==lpDIB_FFT)return;memcpy(lpDIB_FFT,lpDIB,size);//指向频域图像数据指针lpBits=(BYTE*)&lpDIB_FFT-bmiColors[lpDIB_FFT-bmiHeader.biClrUsed];doubletemp;for(i=0;iFFT_h;i++)//行{for(j=0;jFFT_w;j++)//列{//计算频谱幅度temp=sqrt(FD[j*FFT_h+i].real()*FD[j*FFT_h+i].real()+FD[j*FFT_h+i].imag()*FD[j*FFT_h+i].imag())/100;//判断是否超过255if(temp255){//对于超过的,直接设置为255temp=255;}pixel=lpBits+LineBytes*(height-1-i)+j;//更新源图像*pixel=(BYTE)(temp);}}//删除临时变量deleteFD;}