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

📄 f11999115dlg.cpp

📁 一个程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	   str.Format("%d",i);
	   pDCXn->TextOut(i,173,str);  
	   pDCYn->TextOut(i,173,str);  
	   }
	 }
	   UpdateData();
	   m_a=(m_nn-1)/2;
	    pDC->SelectObject(penblue);
		 pDCYn->SelectObject(pencyan);
		pDCHw->SelectObject(pengreen);
		pDCWw->SelectObject(penyellow);
		if(m_type!=0)   {    wc=(int)(m_Wc*128);
				max=Hw[0];
                max2=Ww[0];
				min=Hd[0];
				max1=min1=Xw[0];
			   for(i=0;i<256;i++)
			   { if(Hw[i]>max)    max=Hw[i];
			   if(Ww[i]>max2)    max2=Ww[i];
			   if(Hd[i]<min)    min=Hd[i];  
			   if(Xw[i]>max1)    max1=Xw[i]; 
				if(Xw[i]<min1)    min1=Xw[i];}
			   if(max1<(-1)*min1)
					max1=(-1)*min1;
			   	if(m_fir==1)   {
			    str.Format("%.2f",max1);   //写Y(n)纵坐标值
	  pDCYn->TextOut(-20,3,str);
	  str.Format("%.2f",max1/2);  
	  pDCYn->TextOut(-20,46,str);
 				}
			   str.Format("%.1f",min);   //写20lg|H(ejw)|纵坐标值
	  pDC->TextOut(-25,160,str);
	   str.Format("%.1f",min/4);   
	  pDC->TextOut(-24,50,str);
	   str.Format("%.1f",min/2);   
	  pDC->TextOut(-24,90,str);
	   str.Format("%.1f",min*3/4);  
	  pDC->TextOut(-24,130,str);

	  str.Format("%.2f",max);   //写|H(ejw)|纵坐标值
	  pDCHw->TextOut(-20,6,str);
	   str.Format("%.2f",max*3/4);   
	  pDCHw->TextOut(-20,50,str);
	   str.Format("%.2f",max/2);   
	  pDCHw->TextOut(-20,90,str);
	   str.Format("%.2f",max/4);  
	  pDCHw->TextOut(-20,130,str);

	  str.Format("%.1f",max2);   
	  pDCWw->TextOut(-18,6,str);   //写|W(ejw)|纵坐标值
 str.Format("%.1f",max2*3/4);   
	  pDCWw->TextOut(-18,50,str);
	   str.Format("%.1f",max2/2);   
	  pDCWw->TextOut(-18,90,str);
	   str.Format("%.1f",max2/4);  
	  pDCWw->TextOut(-18,130,str);
	   	for(i=0;i<256;i++)
		{ 	pDCHw->MoveTo(i+10,170);       //滤波器幅频特性|H(ejw)|的谱线
			pDCHw->LineTo(i+10,170-160*Hw[i]/max);  
			pDC->MoveTo(i+10,10);             //画滤波器衰减特性20lg(|H(ejw)|的谱线
			pDC->LineTo(i+10,10+160*Hd[i]/min);   
		    pDCWw->MoveTo(i+10,170);               //画窗函数幅频特性|W(ejw)|的谱线
     		pDCWw->LineTo(i+10,170-160*Ww[i]/max2);
			if(m_fir==1)   {                    //画滤波后序列Y(n)的谱线
   			pDCYn->MoveTo(i+10,90);
			pDCYn->LineTo(i+10,90-80*Xw[i]/max1);  
			}
		}
		pDC->SelectObject(pendot);
		pDCHw->SelectObject(pendot);
        pDC->MoveTo(wc+10,10);             
		pDC->LineTo(wc+10,170); 
		pDCHw->MoveTo(wc+10,10);             
		pDCHw->LineTo(wc+10,170); 
		 str.Format("%.2f",Hd[wc]);   
	     pDC->TextOut(wc+20,12,str);
		  str.Format("%.2f",Hw[wc]);   
	     pDCHw->TextOut(wc+20,90,str);
		}

			pDCXn->SelectObject(pencyan);
		if(m_choose==1)   {          //画测试序列X(n)的谱线
				max=min=Xn[0];
				for(i=0;i<256;i++)
				{ if(Xn[i]>max)    max=Xn[i]; 
				if(Xn[i]<min)    min=Xn[i];
				}
				if(max<(-1)*min)
					max=(-1)*min;
	  str.Format("%.2f",max);  
	  pDCXn->TextOut(-18,3,str);
	   str.Format("%.2f",max/2);  
	  pDCXn->TextOut(-20,46,str);
				for(i=0;i<256;i++)
		{ 	pDCXn->MoveTo(i+10,90);
				pDCXn->LineTo(i+10,90-80*Xn[i]/max);   }
}
		delete penred;
		   delete penblue;
		   delete pencyan;
		   delete penyellow;
	       delete  pengreen;
		    delete  pendot;
}

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

void CF11999115Dlg::OnChangeNn() 
{  
UpdateData();
 m_a=(m_nn-1)/2;
 CHUANG();
	UpdateData(FALSE);
}

void CF11999115Dlg::OnRect() 
{
	m_type=1;
	CHUANG();
}

void CF11999115Dlg::FFT(double R[], double I[],double F[], int m,int mask)
{  int L,B,J,p,k,i,n;
  double kr,ki,*cr,*ci;
  n=1<<m;
  cr=new double[n/2];
  ci=new double[n/2];
  for(i=0;i<n/2;i++)  //设置旋转因子
  {cr[i]=cos(i*PI_2/n);
  if(mask==1)
ci[i]=sin(i*PI_2/n);
   else
  ci[i]=(-1)*sin(i*PI_2/n);  //用于正变换
  }
Backorder(R,I,n);  //调用倒序函数
  for(L=1;L<=m;L++)
  {B=1<<(L-1);
  for(J=0;J<=B-1;J++)
  {  p=J*(1<<(m-L));
  for(k=J;k<n;k+=1<<L)
  {kr=R[k+B]*cr[p]-I[k+B]*ci[p];
   ki=I[k+B]*cr[p]+R[k+B]*ci[p];
   R[k+B]=R[k]-kr;
   I[k+B]=I[k]-ki;
   R[k]=R[k]+kr;
   I[k]=I[k]+ki;
  if(mask==1)
  {F[k]=R[k]/n;      //用于IFFT
  F[k+B]=R[k+B]/n;}
  else{
   F[k]=sqrt(R[k]*R[k]+I[k]*I[k]);
   F[k+B]=sqrt(R[k+B]*R[k+B]+I[k+B]*I[k+B]);}
  }
  }
 }
 return;
}

void CF11999115Dlg::Backorder(double R[], double I[], int n)
{  int i,j,k,h,n1;
  double temp;
  h=n/2;  j=h;  n1=n-2;
  for(i=1;i<=n1;i++)
  {if(i<j)
  {temp=R[i];  R[i]=R[j];  R[j]=temp;
  temp=I[i];  I[i]=I[j];  I[j]=temp;}
  k=h;
  while(j>=k)
  {j-=k;
  k=(int)(k/2+0.5);}
  j+=k;
  }
return;
}

void CF11999115Dlg::OnHaming() 
{	
	m_type=2;
	CHUANG();
}

void CF11999115Dlg::OnOK() 
{   
	// TODO: Add extra validation here
if(Hd!=NULL)      delete []Hd;
if(Hw!=NULL)       delete []Hw;
if(Hn!=NULL)       delete []Hn;
if(I!=NULL)       delete []I;
if(I1!=NULL)       delete []I1;
if(Wn!=NULL)       delete []Wn;	
if(Xn!=NULL)      delete []Xn;
	
if(Xw!=NULL)       delete []Xw;	
if(Ww!=NULL)       delete []Ww;	
	CDialog::OnOK();
}

void CF11999115Dlg::CHUANG()
{  	UpdateData();
m_a=(m_nn-1)/2;
	int i;
	double Wc=PI*m_Wc,model;
	for(i=0;i<256;i++)
	{	I1[i]=0; 		I[i]=0;  Hn[i]=0;  }

	for(i=0;i<m_nn;i++)
	{  switch(m_type)  {
case 1:  Wn[i]=1.0;    break;
case 2:  Wn[i]=0.54-0.46*cos(PI_2*i/(m_nn-1));   break;
case 3:  Wn[i]=0.5*(1-cos(PI_2*i/(m_nn-1)));   break;      
case 4:  Wn[i]=0.42-0.5*cos(PI_2*i/(m_nn-1))+0.08*cos(4*PI*i/(m_nn-1));   break;
case 5:  Wn[i]=sin(i*PI/m_nn);
	     break;  
default:      break;      }
	  if(i!=m_a)
		Hd[i]=sin(Wc*(i-m_a))/(i-m_a)/PI;
		else    Hd[i]=Wc/PI;   
		Hn[i]=Wn[i]*Hd[i];     }    //加窗函数
   FFT(Hn,I1,Hw,8,0); 
   model=Hw[0];
			for(i=0;i<256;i++)
		{	I[i]=0;   
			Hn[i]=Hn[i]/model;    //将低通滤波器归一化!
			I1[i]=I1[i]/model;  
			Hw[i]=Hw[i]/model; 
			}
	FFT(Wn,I,Ww,8,0);
		for(i=0;i<256;i++)
	{ 	 Wn[i]=0;  Hd[i]=20*log10(Hw[i]);	}
	Invalidate(FALSE);
  if(m_choose!=0)
	m_Filter.EnableWindow();	
	return;
}

void CF11999115Dlg::OnFilter() 
{
	// TODO: Add your control notification handler code here
	int i;
	double var;
	 	UpdateData();
		for(i=0;i<256;i++)
		{  I[i]=0;  Wn[i]=Xn[i];  }
      FFT(Wn,I,Xw,8,0);   //求得待测试序列X(n)的付里叶变换X(ejw)=
	                      //Xr(ejw)+jXi(ejw)---暂存入Wn和I
	  for(i=0;i<256;i++)
	  {var=Wn[i];    //由时域卷积定理:时域卷积==>频域乘积
		  Wn[i]=Wn[i]*Hn[i]-I[i]*I1[i];
          I[i]=var*I1[i]+I[i]*Hn[i];
	  }
	  FFT(Wn,I,Xw,8,1);   //用付里叶反变换求得结果序列Y(n)---存入Xw
	  m_fir=1;
	  Invalidate(FALSE);
	  for(i=0;i<256;i++)   
	  { 	 Wn[i]=0;   } 
}

void CF11999115Dlg::OnHanning() 
{
	m_type=3;
	CHUANG();
}

void CF11999115Dlg::OnBlackman() 
{
	m_type=4;
	CHUANG();
}

void CF11999115Dlg::OnTri() 
{
m_type=5;
CHUANG();
}

void CF11999115Dlg::OnChangeWc() 
{
UpdateData();
  if(m_Wc<0||m_Wc>1)
  {MessageBox("对不起,您的输入超出了范围!");    return; }
 m_a=(m_nn-1)/2;
 CHUANG();
	UpdateData(FALSE);
}

void CF11999115Dlg::OnSequence() 
{
UpdateData();
double low=PI*m_low;
double high=PI*m_high;
        for(int i=0;i<256;i++)
	 	Xn[i]=cos(i*low)+cos(i*high);	
		m_choose=1;
		Invalidate(FALSE);
		if(m_type!=0)
		m_Filter.EnableWindow();	
}

void CF11999115Dlg::OnChangeEditLow() 
{   float temp;
	UpdateData();
	 if(m_low<0||m_low>1)
  {MessageBox("对不起,您的输入超出了范围!");    return; }
	if(m_low>m_high)
	{ temp=m_low;  m_low=m_high; m_high=temp; 	UpdateData(FALSE);	}
    OnSequence();
}

void CF11999115Dlg::OnChangeEditHigh() 
{
 float temp;
	UpdateData();
	 if(m_high<0||m_high>1)
  {MessageBox("对不起,您的输入超出了范围!");    return; }
	if(m_low>m_high)
	{ temp=m_low;  m_low=m_high; m_high=temp;  	UpdateData(FALSE);}
    OnSequence();
}

⌨️ 快捷键说明

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