⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fftdrawingdlg.cpp

📁 实现快速傅立叶算法
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			
			else if(fuhao==1)
			{
                
				for(int n_xieshuzi=0;n_xieshuzi<cishu;n_xieshuzi++)
					xieshuzi=xieshuzi/2;
				
				if(xieshuzi<100)
				{
					xieshuzi=xieshuzi*100;
					itoa(xieshuzi,zifu,10);
					char xiaoyu_10[10]={'*','e','-','1','0','0','\0'};
					strcat(zifu,xiaoyu_10);
				}
				else
					itoa(xieshuzi,zifu,10);
				pDC->TextOut(20+3,dy-zhongxian-shuju[js_jizhi]+3,zifu);
			    
			}
			else if(fuhao==0)
			{
				itoa(xieshuzi,zifu,10);	               
			    pDC->TextOut(20+3,dy-zhongxian-shuju[js_jizhi]+3,zifu);
			}
		
			/////////////////以上写数值



		}
	}
	       ////////最大值处极值点处纵坐标

	for(js_jizhi=0;js_jizhi<N;js_jizhi++)
	{
	    if(shuju[js_jizhi]==maxzhi)
		{
			pDC->SetPixel(20,dy-zhongxian-shuju[js_jizhi],2500);
			pDC->SetPixel(20+1,dy-zhongxian-shuju[js_jizhi],2500);
			pDC->SetPixel(20,dy-zhongxian-shuju[js_jizhi]+1,2500);
			pDC->SetPixel(20-1,dy-zhongxian-shuju[js_jizhi],2500);
			pDC->SetPixel(20,dy-zhongxian-shuju[js_jizhi]-1,2500);
			pDC->SetPixel(20+1,dy-zhongxian-shuju[js_jizhi]+1,2500);
			pDC->SetPixel(20+1,dy-zhongxian-shuju[js_jizhi]-1,2500);
			pDC->SetPixel(20-1,dy-zhongxian-shuju[js_jizhi]+1,2500);
			pDC->SetPixel(20-1,dy-zhongxian-shuju[js_jizhi]-1,2500);
            
			
			////////写数据值
			double xieshuzi=shuju[js_jizhi];
			if(fuhao==-1)
			{
				for(int n_xieshuzi=0;n_xieshuzi<cishu;n_xieshuzi++)
					xieshuzi=xieshuzi*2;
				itoa(xieshuzi,zifu,10);
			   pDC->TextOut(20+3,dy-zhongxian-shuju[js_jizhi]+3,zifu);
			}	
			
			else if(fuhao==1)
			{
                
				for(int n_xieshuzi=0;n_xieshuzi<cishu;n_xieshuzi++)
					xieshuzi=xieshuzi/2;
				
				if(xieshuzi<100)
				{
					xieshuzi=xieshuzi*100;
					itoa(xieshuzi,zifu,10);
					char xiaoyu_10[10]={'*','e','-','1','0','0','\0'};
					strcat(zifu,xiaoyu_10);
				}
				else
					itoa(xieshuzi,zifu,10);

				pDC->TextOut(20+3,dy-zhongxian-shuju[js_jizhi]+3,zifu);
			    
			}
			else if(fuhao==0)
			{
				itoa(xieshuzi,zifu,10);	               
			    pDC->TextOut(20+3,dy-zhongxian-shuju[js_jizhi]+3,zifu);
			}
		
			/////////////////以上写数值

			/////对称的另一边
            int fanjizhi=N-js_jizhi;
		
		    pDC->SetPixel(20,dy-zhongxian-shuju[fanjizhi],2500);
			pDC->SetPixel(20+1,dy-zhongxian-shuju[fanjizhi],2500);
			pDC->SetPixel(20,dy-zhongxian-shuju[fanjizhi]+1,2500);
			pDC->SetPixel(20-1,dy-zhongxian-shuju[fanjizhi],2500);
			pDC->SetPixel(20,dy-zhongxian-shuju[fanjizhi]-1,2500);
			pDC->SetPixel(20+1,dy-zhongxian-shuju[fanjizhi]+1,2500);
			pDC->SetPixel(20+1,dy-zhongxian-shuju[fanjizhi]-1,2500);
			pDC->SetPixel(20-1,dy-zhongxian-shuju[fanjizhi]+1,2500);
			pDC->SetPixel(20-1,dy-zhongxian-shuju[fanjizhi]-1,2500);
			////////写数据值
			xieshuzi=shuju[fanjizhi];
			if(fuhao==-1)
			{
				for(int n_xieshuzi=0;n_xieshuzi<cishu;n_xieshuzi++)
					xieshuzi=xieshuzi*2;
				itoa(xieshuzi,zifu,10);
			   pDC->TextOut(20+3,dy-zhongxian-shuju[fanjizhi]+3,zifu);
			}	
			
			else if(fuhao==1)
			{
                
				for(int n_xieshuzi=0;n_xieshuzi<cishu;n_xieshuzi++)
					xieshuzi=xieshuzi/2;
				
				if(xieshuzi<100)
				{
					xieshuzi=xieshuzi*100;
					itoa(xieshuzi,zifu,10);
					char xiaoyu_10[10]={'*','e','-','1','0','0','\0'};
					strcat(zifu,xiaoyu_10);
				}
				else
					itoa(xieshuzi,zifu,10);
				pDC->TextOut(20+3,dy-zhongxian-shuju[fanjizhi]+3,zifu);
			    
			}
			else if(fuhao==0)
			{
				itoa(xieshuzi,zifu,10);	               
			    pDC->TextOut(20+3,dy-zhongxian-shuju[js_jizhi]+3,zifu);
			}
		
			/////////////////以上写数值


			

		}
	}



	//////////////////////////////以上画极值点的纵坐标


	//pDC->SetPixel(20+p*m_jian_ge,dy-int(shuju[p]+zhongxian),0);
    
	
	//////////////以下画线
	for( int p=0;p<N-1;p++)
	{
        /*
        //////以下有点对,但是去不了竖直线.
		if(fabs(shuju[p])!=fabs(shuju[p+1]))
		{
			pDC->SetPixel(20+p*m_jian_ge,dy-int(shuju[p]+zhongxian),0);
		    pDC->MoveTo( 20+p*m_jian_ge,dy-int(shuju[p]+zhongxian));
	    	pDC->LineTo( 20+(p+1)*m_jian_ge,dy-int(shuju[p+1]+zhongxian));////&&shuju[p-1]<=shuju[p+1]
		}
	     */
	   
		if(shuju[p]<=shuju[p+1]&&shuju[p]>0&&shuju[p+1]>0)
		{
			pDC->SetPixel(20+p*m_jian_ge,dy-int(shuju[p]+zhongxian),0);
		    pDC->MoveTo( 20+p*m_jian_ge,dy-int(shuju[p]+zhongxian));
	    	pDC->LineTo( 20+(p+1)*m_jian_ge,dy-int(shuju[p+1]+zhongxian));
			
		}
	    
	}

    
	for(int  p=0;p<N-1;p++)
	{
        
		if(shuju[p]>=shuju[p+1]&&shuju[p]>0&&shuju[p+1]>0)
		{
			pDC->SetPixel(20+p*m_jian_ge,dy-int(shuju[p]+zhongxian),0);
		    pDC->MoveTo( 20+p*m_jian_ge,dy-int(shuju[p]+zhongxian));
	    	pDC->LineTo( 20+(p+1)*m_jian_ge,dy-int(shuju[p+1]+zhongxian));
		}
		
	}
	for(  p=0;p<N-1;p++)
	{
        
		if(shuju[p]>=shuju[p+1]&&shuju[p]<0&&shuju[p+1]<0)
		{
			pDC->SetPixel(20+p*m_jian_ge,dy-int(shuju[p]+zhongxian),0);
		    pDC->MoveTo( 20+p*m_jian_ge,dy-int(shuju[p]+zhongxian));
	    	pDC->LineTo( 20+(p+1)*m_jian_ge,dy-int(shuju[p+1]+zhongxian));
		}
		
	}
	for(  p=0;p<N-1;p++)
	{
        
		if(shuju[p]<=shuju[p+1]&&shuju[p]<0&&shuju[p+1]<0)
		{
			pDC->SetPixel(20+p*m_jian_ge,dy-int(shuju[p]+zhongxian),0);
		    pDC->MoveTo( 20+p*m_jian_ge,dy-int(shuju[p]+zhongxian));
	    	pDC->LineTo( 20+(p+1)*m_jian_ge,dy-int(shuju[p+1]+zhongxian));
		}
		
	}
	
    

	
	
	pDC->SelectObject(oldPen2);
    /*
	CPaintDC dc(this);
	CWnd *pWnd=GetDlgItem(IDC_STATIC);
	 pWnd->UpdateWindow();
	 CDC *pDC=pWnd->GetDC();
	 CBrush drawBrush; 
	 drawBrush.CreateHatchBrush(3, RGB(0,0,0));
	 CBrush *pOldBrush=pDC->SelectObject(&drawBrush);
	 CRect rcClient;
	 pWnd->GetClientRect(rcClient);
	 pDC->Rectangle(rcClient);
	 pDC->SelectObject(pOldBrush);
     */

}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CFftDrawingDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}


void CFftDrawingDlg::OnShujudaoru() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	cishu=0;
	if(m_njishu<1||m_njishu>9)
	{
		MessageBox("请输入计算基2-fft的级数,范围在1--9间,即只能计算2到512个点的fft","提示",0);
	}
	
	if(m_njishu>0&&m_njishu<10)
	{
		b_shuju=1;
	    double PI=3.1415926535;
    	double e=2.718281828;
        //int M,N;
        double x[512],xr[512],xi[512],t[512],jiaodu;
	
	    //M=8;
    	N=1<<m_njishu;
    	m_jian_ge=512/N;
    	jiaodu=(-2*PI)/N;


    	///数据点输入:   	
        
        //double(m_caidianpinlv);
		//double f1=15,f2=40;
		double zhouqi=1/m_caidianpinlv;
	
		for(int i=0;i<N;i++)
			x[i]=m_A*sin(2*PI*m_f1*i*zhouqi)+m_B*sin(2*PI*m_f2*i*zhouqi);

		
	  
       /*
        for(int i=0;i<N;i++)
		{
			if(i<8)
				x[i]=8-i*zhouqi;
			else if(i>(N-9))
				x[i]=N-i*zhouqi;
			else 
				x[i]=0;
		}
         */
		
		/*
		for(int i=0;i<N;i++)
    	{
			if(i<8)
				x[i]=1;
			else
				x[i]=0;
		}
        */

		
	
    	////数据点输入结束.




    	////将数据点重新排序,以实现fft计算.

    	//paixu();

    	int kuaishu=1,geshu;
    	for(  i=0;i<N;i++)
    	    t[i]=x[i];
    	for(int pi=1;pi<m_njishu;pi++)
		{
     	    kuaishu=1<<(pi);
    		geshu=N/kuaishu;
    		for(int fi=0;fi<kuaishu;fi++)
			{
    			if(fi%2==0)
				{
    				for(int fk=0;fk<geshu;fk++)
    					x[fi*geshu+fk]=t[fi*geshu+fk*2];
				}
    			if(fi%2==1)
				{
    				for(int fk=0;fk<geshu;fk++)
    					x[fi*geshu+fk]=t[(fi-1)*geshu+1+fk*2];
				}
			}
    		for(int i=0;i<N;i++)
    			t[i]=x[i];
		}
    	////排序结束.




    	////进行fft计算:

    	///fft();
    
    
	
    	int zengzhi;
    	//double t1r,t2r,t1i,t2i;
		double t1r,t1,t1i,t2;
    	double jd;          ///计算的角度
    	int wz=1<<m_njishu;
    	for( i=0;i<N;i++)
		{
    		xr[i]=x[i];
    		xi[i]=0;
		}
    	for(int i1=m_njishu-1;i1>=0;i1--)
		{
    		 wz=wz/2;
    		 kuaishu=1<<(i1);
    		 geshu=N/kuaishu;
    		 zengzhi=kuaishu;
    		 for(int i2=0;i2<kuaishu;i2++)
			 {
    			 for(int i3=0;i3<(geshu/2);i3++)
				 {
                     /*
    				 jd=jiaodu*zengzhi*i3;
    				 t1r=xr[geshu*i2+i3];
    				 t1i=xi[geshu*i2+i3];
    				 t2r=xr[geshu*i2+i3+geshu/2];
    				 t2i=xi[geshu*i2+i3+geshu/2];
    				 xr[geshu*i2+i3]=t1r+t2r*cos(jd)-t2i*sin(jd);
    				 xi[geshu*i2+i3]=t1i+t2i*cos(jd)+t2r*sin(jd);
    				 xr[geshu*i2+i3+geshu/2]=t1r-t2r*cos(jd)+t2i*sin(jd);
	    			 xi[geshu*i2+i3+geshu/2]=t1i-t2i*cos(jd)-t2r*sin(jd);
                    */
					 jd=jiaodu*zengzhi*i3;
					 t1r=xr[geshu*i2+i3];
    				 t1i=xi[geshu*i2+i3];
                     t1=xr[geshu*i2+i3+geshu/2]*cos(jd)-xi[geshu*i2+i3+geshu/2]*sin(jd);
				     t2=xi[geshu*i2+i3+geshu/2]*cos(jd)+xr[geshu*i2+i3+geshu/2]*sin(jd);
                     xr[geshu*i2+i3]=t1r+t1;
					 xi[geshu*i2+i3]=t1i+t2;
					 xr[geshu*i2+i3+geshu/2]=t1r-t1;
	    			 xi[geshu*i2+i3+geshu/2]=t1i-t2;
					 
				 }
			 }  
		}

    	for(  i=0;i<N;i++)
		{
     		shibu[i]=xr[i];
    		xubu[i]=xi[i];
		}
	

    	ofstream table;
    	table.open("d:\\fft.txt");
    	for(i=0;i<N;i=i+3)
		{
		
    		table<<"X["<<i<<"]="<<xr[i]<<"+"<<xi[i]<<" j"<<"\t"<<
				"X["<<i+1<<"]="<<xr[i+1]<<"+"<<xi[i+1]<<" j"<<"\t"<<
				"X["<<i+2<<"]="<<xr[i+2]<<"+"<<xi[i+2]<<" j"<<"\t"<<endl;
			/*
            table<<"xr["<<i+1<<"]="<<shibu[i+1]<<"\t\t"<<"xi["<<i+1<<"]="<<xubu[i+1]<<"\t\t"
				<<"|x|["<<i+1<<"]="<<sqrt(shibu[i+1]*shibu[i+1]+xubu[i+1]*xubu[i+1])
			    <<"\t\t"<<"@["<<i+1<<"]="<<atan(xubu[i+1]/shibu[i+1])<<"\t\t"<<endl;
            */

		}
		
		table.close();



		

    	MessageBox("计算所得数据已经以fft.txt文档格式存放于d:\\fft.txt中,请查看。请点击相应按钮查看相关图形","提示");
    }
}
void CFftDrawingDlg::OnShibu() 
{
	// TODO: Add your control notification handler code here
	//double *shibu, *xubu;
	if(b_shuju!=1)
		MessageBox ("请先倒入数据计算fft,请点击 ‘ 倒入数据  ’ !","提示" );
	if(b_shuju==1)
	{
		shuomingwenzi=1;
		for( int i=0;i<N;i++)
			shuju[i]=shibu[i];
       
       
		///////////////以下是将数据处理成能在显示区域显示的值
		CWnd *pWnd = GetDlgItem(IDC_STATIC);
        CDC *pDC = pWnd->GetDC();
        CRect rcClient;
	    pWnd->GetClientRect(rcClient);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -