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

📄 滤波器设计dlg.cpp

📁 一个关于滤波器设计的小程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	sprintf(tmpText,"%2.1f",0.4);
	TextOut(hdc,xto1-92,yto1-20,tmpText,3);
	sprintf(tmpText,"%2.1f",0.3);
	TextOut(hdc,xto1-176,yto1-20,tmpText,3);
	sprintf(tmpText,"%2.1f",0.2);
	TextOut(hdc,xto1-260,yto1-20,tmpText,3);
	sprintf(tmpText,"%2.1f",0.1);
	TextOut(hdc,xto1-344,yto1-20,tmpText,3);

	sprintf(tmpText,"%d",10);
	TextOut(hdc,(xfrom1+xto1)/2-10,yfrom1,tmpText,2);
}
void CMyDlg::Drawbackground(HDC hdc, int left, int up, int right, int down, int xfrom1, int xto1, int yfrom1, int yto1, int ycenter1)
{
	//obtain the HDC of This Diolog
    int i;
	//The first left and up lines of background rectangle 
	SelectObject(hdc,penu1);
	MoveToEx(hdc,left,up,NULL);
	LineTo(hdc,right,up);
	MoveToEx(hdc,left,up,NULL);
	LineTo(hdc,left,down);
		
	//The second left and up lines of background rectangle 
	MoveToEx(hdc,left+1,up+1,NULL);
	LineTo(hdc,right-1,up+1);
	MoveToEx(hdc,left+1,up+1,NULL);
	LineTo(hdc,left+1,down-1);

	
	//The second right and down lines of background rectangle 
	MoveToEx(hdc,left,down,NULL);
	LineTo(hdc,right,down);
	MoveToEx(hdc,right,down,NULL);
	LineTo(hdc,right,up);
	
	
	//The first right and down lines of background rectangle 
	MoveToEx(hdc,left+1,down-1,NULL);
	LineTo(hdc,right-1,down-1);
	MoveToEx(hdc,right-1,down-1,NULL);
	LineTo(hdc,right-1,up+1);
	
	SelectObject(hdc,pend2);
	
	for(i=2;i<down-up-1;i++)
 	{
	MoveToEx(hdc,left+2,down-i,NULL);
    LineTo(hdc,right-2,down-i);
	}  
	
	SetBkColor(hdc,RGB(128,128,128));
	SelectObject(hdc,penk);
  	MoveToEx(hdc,xfrom1,yfrom1,NULL);
	LineTo(hdc,xfrom1,yto1);
	MoveToEx(hdc,(xto1+xfrom1)/2-15,yfrom1,NULL);
	LineTo(hdc,(xto1+xfrom1)/2-15,yto1);
	MoveToEx(hdc,xfrom1,yto1,NULL);
	LineTo(hdc,(xto1+xfrom1)/2-15,yto1);
	MoveToEx(hdc,xfrom1,yfrom1,NULL);
	LineTo(hdc,(xto1+xfrom1)/2-15,yfrom1);

	MoveToEx(hdc,(xto1+xfrom1)/2+15,yfrom1,NULL);
	LineTo(hdc,(xto1+xfrom1)/2+15,yto1);
	MoveToEx(hdc,xto1,yfrom1,NULL);
	LineTo(hdc,xto1,yto1);
	MoveToEx(hdc,(xto1+xfrom1)/2+15,yto1,NULL);
	LineTo(hdc,xto1,yto1);
	MoveToEx(hdc,(xto1+xfrom1)/2+15,yfrom1,NULL);
	LineTo(hdc,xto1,yfrom1);
	
	
	for(i=0;i<=40;i++)
	{
	    if(i%4==0)
		  MoveToEx(hdc,xfrom1-6,yfrom1+i*(yto1-yfrom1)/40,NULL);
		else
		  MoveToEx(hdc,xfrom1-3,yfrom1+i*(yto1-yfrom1)/40,NULL);
	    LineTo(hdc,xfrom1,yfrom1+i*(yto1-yfrom1)/40);
	}
	for(i=0;i<=40;i++)
	{
	    if(i%4==0)
		  MoveToEx(hdc,xfrom1+i*((xto1+xfrom1)/2-15-xfrom1)/40,yto1+6,NULL);
		else
		  MoveToEx(hdc,xfrom1+i*((xto1+xfrom1)/2-15-xfrom1)/40,yto1+3,NULL);
	    LineTo(hdc,xfrom1+i*((xto1+xfrom1)/2-15-xfrom1)/40,yto1);
	}
	for(i=0;i<=40;i++)
	{
	    if(i%4==0)
		  MoveToEx(hdc,(xto1+xfrom1)/2+9,yfrom1+i*(yto1-yfrom1)/40,NULL);
		else
		  MoveToEx(hdc,(xto1+xfrom1)/2+12,yfrom1+i*(yto1-yfrom1)/40,NULL);
	    LineTo(hdc,(xto1+xfrom1)/2+15,yfrom1+i*(yto1-yfrom1)/40);
	}
	for(i=0;i<=40;i++)
	{
	    if(i%4==0)
		  MoveToEx(hdc,(xto1+xfrom1)/2+15+i*((xto1+xfrom1)/2-15-xfrom1)/40,yto1+6,NULL);
		else
		  MoveToEx(hdc,(xto1+xfrom1)/2+15+i*((xto1+xfrom1)/2-15-xfrom1)/40,yto1+3,NULL);
	    LineTo(hdc,(xto1+xfrom1)/2+15+i*((xto1+xfrom1)/2-15-xfrom1)/40,yto1);
	}
	for(i=1;i<10;i++)
	{
	    MoveToEx(hdc,xfrom1,yfrom1+i*(yto1-yfrom1)/10,NULL);
	    LineTo(hdc,(xto1+xfrom1)/2-15,yfrom1+i*(yto1-yfrom1)/10);
		MoveToEx(hdc,(xto1+xfrom1)/2+15,yfrom1+i*(yto1-yfrom1)/10,NULL);
	    LineTo(hdc,xto1,yfrom1+i*(yto1-yfrom1)/10);
	}
	for(i=1;i<10;i++)
	{
	    MoveToEx(hdc,xfrom1+i*((xto1+xfrom1)/2-15-xfrom1)/10,yfrom1,NULL);
	    LineTo(hdc,xfrom1+i*((xto1+xfrom1)/2-15-xfrom1)/10,yto1);
		MoveToEx(hdc,(xto1+xfrom1)/2+15+i*((xto1+xfrom1)/2-15-xfrom1)/10,yfrom1,NULL);
	    LineTo(hdc,(xto1+xfrom1)/2+15+i*((xto1+xfrom1)/2-15-xfrom1)/10,yto1);
	}
}
void CMyDlg::BandPass(int N, double beta)
{
	int i,j;
	double h;

	hpluse=GlobalAlloc(GMEM_FIXED,8*analeng);		//GlobalAlloc	The GlobalAlloc function allocates the specified number of bytes from the heap.If the function succeeds, the return value is a handle to the newly allocated memory object.
	lppluse=(double *)hpluse;

	for(i=0;i<N/2;i++)
	{
		j=i-N/2;
		h=2*cos((m_fl+m_fh)*3.1415926*((double)j+0.5))*sin((-m_fl+m_fh)*3.1415926*((double)j+0.5))/(3.1415926*((double)j+0.5));
		*(lppluse+i)=h*kaiser(N,i,beta);
		*(lppluse+N-1-i)=*(lppluse+i);
	}

	for(i=0;i<datalength;i++)
	{
		*(lppls+(int)i)=0.0;
	}
	*(lppls+1)=30000.0;

	for(j=0;j<datalength;j++)
	{
		*(lpfilter+j)=0.0;
		if(j<N)
		{
			for(i=0;i<=j;i++)
			{
				*(lpfilter+j)=*(lpfilter+j)+(*(lppls+j-i))*(*(lppluse+i));
			}
		}
		else
		{
			for(i=0;i<N;i++)
			{
				*(lpfilter+j)=*(lpfilter+j)+(*(lppls+j-i))*(*(lppluse+i));
			}
		}
	}
}
double CMyDlg::kaiser(int n,int i, double beta)
{
	double a,w,a2,b1,b2,beta1;
	b1=bessel(beta);
	a=2.0*i/(double)(n-1)-1.0;
	a2=a*a;
	beta1=beta*sqrt(1.0-a2);
	b2=bessel(beta1);
	w=b2/b1;
	return(w);
}
double CMyDlg::bessel(double a)
{
	short int i,j;
	double t,y,z;
	t=0.0;
	y=1.0;
	z=1.0;
	for(i=1;i<10000;i++)
	{
		for(j=1;j<=i;j++)
			z=1.0/(double)j*z;
		y=y+z*z*pow(a/2.0,2.0*(double)i);
		if(t==y)	break;
		t=y;
	}
	return t;
}
void CMyDlg::BandPassFiltering(int N, double beta, double sf, double sa, double nf, double na)
{
	int i,j;
	double h;

	hpluse=GlobalAlloc(GMEM_FIXED,8*analeng);		//GlobalAlloc	The GlobalAlloc function allocates the specified number of bytes from the heap.If the function succeeds, the return value is a handle to the newly allocated memory object.
	lppluse=(double *)hpluse;

	for(i=0;i<N/2;i++)
	{
		j=i-N/2;
		h=2*cos((m_fl+m_fh)*3.1415926*((double)j+0.5))*sin((-m_fl+m_fh)*3.1415926*((double)j+0.5))/(3.1415926*((double)j+0.5));
		*(lppluse+i)=h*kaiser(N,i,beta);
		*(lppluse+N-1-i)=*(lppluse+i);
	}

	if(m_addnoise)
	{
		for(i=0;i<datalength;i++)
		{
			*(lpsignal+(int)i)=sa*sin((sf)*i/63662)+na*sin((nf)*i/63662);
		}
	}
	else
	{
		for(i=0;i<datalength;i++)
		{
			*(lpsignal+(int)i)=sa*sin((sf)*i/63662);
		}
	}

	for(j=0;j<datalength;j++)
	{
		*(lpfilter+j)=0.0;
		if(j<N)
		{
			for(i=0;i<=j;i++)
			{
				*(lpfilter+j)=*(lpfilter+j)+(*(lpsignal+j-i))*(*(lppluse+i));
			}
		}
		else
		{
			for(i=0;i<N;i++)
			{
				*(lpfilter+j)=*(lpfilter+j)+(*(lpsignal+j-i))*(*(lppluse+i));
			}
		}
	}
}
void CMyDlg::BandReject(int N, double beta)
{
	int i,j;
	double h;

	hpluse=GlobalAlloc(GMEM_FIXED,8*analeng);		//GlobalAlloc	The GlobalAlloc function allocates the specified number of bytes from the heap.If the function succeeds, the return value is a handle to the newly allocated memory object.
	lppluse=(double *)hpluse;

	for(i=0;i<N/2;i++)
	{
		j=i-N/2;
		h=(sin(3.1415926*((double)j+0.5))-2*cos((m_fl+m_fh)*3.1415926*((double)j+0.5))*sin((-m_fl+m_fh)*3.1415926*((double)j+0.5)))/(3.1415926*((double)j+0.5));
		*(lppluse+i)=h*kaiser(N,i,beta);
		*(lppluse+N-1-i)=*(lppluse+i);
	}

/*	for(i=0;i<(N-1)/2;i++)
	{
		j=i-(N-1)/2;
//		h=(sin(3.1415926*((double)j+0.5))-sin(m_fc*2.0*3.1415926*((double)j+0.5)))/(3.1415926*((double)j+0.5));
		h=(sin(3.1415926*((double)j))-2*cos((m_fl+m_fh)*3.1415926*((double)j))*sin((-m_fl+m_fh)*3.1415926*((double)j)))/(3.1415926*((double)j));
		*(lppluse+i)=h*kaiser(N,i,beta);
		*(lppluse+N-1-i)=*(lppluse+i);
	}
	*(lppluse+(N-1)/2)=1.0-2.0*m_fh+2.0*m_fl;*/

	for(i=0;i<datalength;i++)
	{
		*(lppls+(int)i)=0.0;
	}
	*(lppls+1)=30000.0;

	for(j=0;j<datalength;j++)
	{
		*(lpfilter+j)=0.0;
		if(j<N)
		{
			for(i=0;i<=j;i++)
			{
				*(lpfilter+j)=*(lpfilter+j)+(*(lppls+j-i))*(*(lppluse+i));
			}
		}
		else
		{
			for(i=0;i<N;i++)
			{
				*(lpfilter+j)=*(lpfilter+j)+(*(lppls+j-i))*(*(lppluse+i));
			}
		}
	}
}
void CMyDlg::BandRejectFiltering(int N, double beta, double sf, double sa, double nf, double na)
{
	int i,j;
	double h;

	hpluse=GlobalAlloc(GMEM_FIXED,8*analeng);		//GlobalAlloc	The GlobalAlloc function allocates the specified number of bytes from the heap.If the function succeeds, the return value is a handle to the newly allocated memory object.
	lppluse=(double *)hpluse;

	for(i=0;i<N/2;i++)
	{
		j=i-N/2;
		h=(sin(3.1415926*((double)j+0.5))-2*cos((m_fl+m_fh)*3.1415926*((double)j+0.5))*sin((-m_fl+m_fh)*3.1415926*((double)j+0.5)))/(3.1415926*((double)j+0.5));
		*(lppluse+i)=h*kaiser(N,i,beta);
		*(lppluse+N-1-i)=*(lppluse+i);
	}

	if(m_addnoise)
	{
		for(i=0;i<datalength;i++)
		{
			*(lpsignal+(int)i)=sa*sin((sf)*i/63662)+na*sin((nf)*i/63662);
		}
	}
	else
	{
		for(i=0;i<datalength;i++)
		{
			*(lpsignal+(int)i)=sa*sin((sf)*i/63662);
		}
	}

	for(j=0;j<datalength;j++)
	{
		*(lpfilter+j)=0.0;
		if(j<N)
		{
			for(i=0;i<=j;i++)
			{
				*(lpfilter+j)=*(lpfilter+j)+(*(lpsignal+j-i))*(*(lppluse+i));
			}
		}
		else
		{
			for(i=0;i<N;i++)
			{
				*(lpfilter+j)=*(lpfilter+j)+(*(lpsignal+j-i))*(*(lppluse+i));
			}
		}
	}
}
void CMyDlg::drawfilteredwave(HDC hdc, double sf, double sa, double nf, double na,int xfrom1, int xto1, int ycenter, int yto1)
{
	double i;
	double k1,k2;
	int j1,j2,m1,m2;
	SelectObject(hdc,penu2);
	for(i=0;i<(xto1-xfrom1)/2-15;i++)
	{
		k1=9.5*(*(lpfilter+(int)i+analeng));
		k2=9.5*(*(lpfilter+(int)(i+1)+analeng));
		MoveToEx(hdc,xfrom1+(int)i,ycenter-(int)k1,NULL);
		LineTo(hdc,xfrom1+(int)i+1,ycenter-(int)k2);
	}

	for(i=0;i<datalength;i++)
	{
		(*(lpfftdata+(int)i)).x=*(lpfilter+(int)i);
		(*(lpfftdata+(int)i)).y=0.00;
	}

	fft(datalength,lpfftdata);

	for(i=0;i<datalength;i++)
	{
		k1=(*(lpfftdata+(int)i)).x;
		k2=(*(lpfftdata+(int)i)).y;
		*(lporigdata+(int)i)=sqrt(k1*k1+k2*k2);
	}

	SelectObject(hdc,penu2);

	for(i=0;i<datalength/2;i++)
	{
		
		j1=(int)(2*i*(double)((xto1-xfrom1)/2-15)/datalength);
		j2=(int)(2*(i+1)*(double)((xto1-xfrom1)/2-15)/datalength);
		m1=yto1-(int)(*(lporigdata+(int)i)*38.5/datalength);
		m2=yto1-(int)(*(lporigdata+(int)i+1)*38.5/datalength);
		MoveToEx(hdc,(xto1+xfrom1)/2+15+j1,m1,NULL);
		LineTo(hdc,(xto1+xfrom1)/2+15+j2,m2);
	}


}
void CMyDlg::drawplusewave(HDC hdc, double sf, double sa, double nf, double na, int xfrom1, int xto1, int ycenter, int yto1)
{
	double i;
	double k1,k2;
	int j1,j2,m1,m2;
	SelectObject(hdc,penu2);
	for(i=0;i<analeng-1;i++)
	{
			
		j1=(int)(i*(double)((xto1-xfrom1)/2-15)/(analeng));
		j2=(int)((i+1)*(double)((xto1-xfrom1)/2-15)/(analeng));
		m1=ycenter-(int)(*(lppluse+(int)i)*120);
		m2=ycenter-(int)(*(lppluse+(int)i+1)*120);
		MoveToEx(hdc,xfrom1+j1,m1,NULL);
		LineTo(hdc,xfrom1+j2,m2);
	}
	
	for(i=0;i<datalength;i++)
	{
		(*(lpfftdata+(int)i)).x=*(lpfilter+(int)i);
		(*(lpfftdata+(int)i)).y=0.00;
	}

	fft(datalength,lpfftdata);

	for(i=0;i<datalength;i++)
	{
		k1=(*(lpfftdata+(int)i)).x;
		k2=(*(lpfftdata+(int)i)).y;
		*(lporigdata+(int)i)=sqrt(k1*k1+k2*k2);
	}

//	SelectObject(hdc,penred);

	for(i=0;i<datalength/2;i++)
	{
		
		j1=(int)(2*i*(double)((xto1-xfrom1)/2-15)/datalength);
		j2=(int)(2*(i+1)*(double)((xto1-xfrom1)/2-15)/datalength);
		m1=yto1-(int)(*(lporigdata+(int)i)*41.5/datalength);
		m2=yto1-(int)(*(lporigdata+(int)i+1)*41.5/datalength);
		MoveToEx(hdc,(xto1+xfrom1)/2+15+j1,m1,NULL);
		LineTo(hdc,(xto1+xfrom1)/2+15+j2,m2);
	}

}
void CMyDlg::DrawScaleFre(HDC hdc, int xfrom1, int xto1, int yfrom1, int yto1, int ycenter1)
{
	char  tmpText[10];
	SetBkColor(hdc,RGB(255,255,255));    
	SetTextColor(hdc,RGB(0,0,0));
	//显示标注


	sprintf(tmpText,"%d",0);
	TextOut(hdc,(xfrom1+xto1)/2-4,yto1-20,tmpText,1);
	sprintf(tmpText,"%2.1f",0.5);
	TextOut(hdc,xto1-25,yto1-20,tmpText,3);
	sprintf(tmpText,"%2.1f",0.4);
	TextOut(hdc,xto1-92,yto1-20,tmpText,3);
	sprintf(tmpText,"%2.1f",0.3);
	TextOut(hdc,xto1-176,yto1-20,tmpText,3);
	sprintf(tmpText,"%2.1f",0.2);
	TextOut(hdc,xto1-260,yto1-20,tmpText,3);
	sprintf(tmpText,"%2.1f",0.1);
	TextOut(hdc,xto1-344,yto1-20,tmpText,3);	sprintf(tmpText,"%d",1);
	TextOut(hdc,(xfrom1+xto1)/2-4,yfrom1+30,tmpText,1);

}
void CMyDlg::HighPass(int N, double beta)
{
	int i,j;
	double h;

	hpluse=GlobalAlloc(GMEM_FIXED,8*analeng);		//GlobalAlloc	The GlobalAlloc function allocates the specified number of bytes from the heap.If the function succeeds, the return value is a handle to the newly allocated memory object.
	lppluse=(double *)hpluse;
	
	for(i=0;i<N/2;i++)
	{
		j=i-N/2;
		h=(sin(3.1415926*((double)j+0.5))-sin(m_fc*2.0*3.1415926*((double)j+0.5)))/(3.1415926*((double)j+0.5));
		*(lppluse+i)=h*kaiser(N,i,beta);
		*(lppluse+N-1-i)=*(lppluse+i);
	}
	
	for(i=1;i<datalength;i++)
	{
		*(lppls+(int)i)=0.0;
	}
	*(lppls)=30000.0;

	for(j=0;j<datalength;j++)
	{
		*(lpfilter+j)=0.0;
		if(j<N)
		{
			for(i=0;i<=j;i++)
			{
				*(lpfilter+j)=*(lpfilter+j)+(*(lppls+j-i))*(*(lppluse+i));
			}
		}
		else
		{
			for(i=0;i<N;i++)
			{
				*(lpfilter+j)=*(lpfilter+j)+(*(lppls+j-i))*(*(lppluse+i));
			}
		}
	}
}
void CMyDlg::HighPassFiltering(int N, double beta, double sf, double sa, double nf, double na)
{
	int i,j;
	double h;

	hpluse=GlobalAlloc(GMEM_FIXED,8*analeng);		//GlobalAlloc	The GlobalAlloc function allocates the specified number of bytes from the heap.If the function succeeds, the return value is a handle to the newly allocated memory object.
	lppluse=(double *)hpluse;
	for(i=0;i<N/2;i++)
	{
		j=i-N/2;
		h=(sin(3.1415926*((double)j+0.5))-sin(m_fc*2.0*3.1415926*((double)j+0.5)))/(3.1415926*((double)j+0.5));
		*(lppluse+i)=h*kaiser(N,i,beta);

⌨️ 快捷键说明

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