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

📄 滤波器设计dlg.cpp

📁 一个关于滤波器设计的小程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		*(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::LowPass(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(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=0;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::LowPassFiltering(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(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);
	}

	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::OnBottonApply() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	switch(m_filtertype)//判断
		{
	    case 0:
		LowPassFiltering(analeng, m_beta,m_signalfre, m_signalamp, m_noisefre, m_noiseamp);
		  break;
		case 1:
		HighPassFiltering(analeng, m_beta,m_signalfre, m_signalamp, m_noisefre, m_noiseamp);
		  break;
		case 2:
		BandPassFiltering(analeng, m_beta,m_signalfre, m_signalamp, m_noisefre, m_noiseamp);
		  break;
		case 3:
		BandRejectFiltering(analeng, m_beta,m_signalfre, m_signalamp, m_noisefre, m_noiseamp);
		  break;
		}
	GetDlgItem(IDC_STATIC_FILTERSIGNAL)->SetWindowText("滤波后信号");
	Drawbackground(hdctmp2,0,0,880,215,10,870,10,200,105);
	DrawScaleText(hdctmp2,10,870,10,200,105);
	drawfilteredwave(hdctmp2,m_signalfre, m_signalamp, m_noisefre, m_noiseamp,10,870,105,200);
	OnPaint();

}
void CMyDlg::OnButtonPluse() 
{
	// TODO: Add your control notification handler code here
	int i,k;
	double j;
	double mean,max=0.0,minmax,maxmin;
	bool pass=FALSE,descend,catched;

	UpdateData(TRUE);
	switch(m_filtertype)//判断
		{
	    case 0:
		LowPass(analeng, m_beta);
		  break;
		case 1:
		HighPass(analeng, m_beta);
		  break;
		case 2:
		BandPass(analeng, m_beta);
		  break;
		case 3:
		BandReject(analeng, m_beta);
		  break;
		}


	GetDlgItem(IDC_STATIC_FILTERSIGNAL)->SetWindowText("滤波器单位冲击响应");


//	(GetDlgItem(IDC_STATIC_FILTERSIGNAL)).Caption="滤波器脉冲相应";
//	(Cobject)(IDC_STATIC_FILTER).Caption="滤波器脉冲相应";
//	GetDlgItem(IDC_STATIC_FILTER).Caption="滤波器脉冲相应";
	Drawbackground(hdctmp2,0,0,880,215,10,870,10,200,105);
	DrawScaleFre(hdctmp2,10,870,10,200,105);
	drawplusewave(hdctmp2,m_signalfre, m_signalamp, m_noisefre, m_noiseamp,10,870,105,200);
	if(m_filtertype==0)
	{
		/*GetDlgItem(IDC_EDIT_DOWNFRE)->EnableWindow(TRUE);
		GetDlgItem(IDC_EDIT_UPFRE)->EnableWindow(TRUE);
		GetDlgItem(IDC_EDIT_BAND)->EnableWindow(TRUE);
		GetDlgItem(IDC_EDIT_REJECT)->EnableWindow(TRUE);
		GetDlgItem(IDC_EDIT_PASS)->EnableWindow(TRUE);*/


		descend=FALSE;
		for(i=0;i<datalength/2;i++)
		{
			double m=*(lporigdata+i);
			if(max<m)	
			{
				max=*(lporigdata+i);
			}
		}

		for(i=1;i<(int)(datalength*m_fc);i++)
		{
			if(*(lporigdata+i)>*(lporigdata+i-1))		descend=TRUE;

		}
		
		if(descend==FALSE)
		{
			j=datalength*m_fc;
			for(i=0;i<(int)(datalength*m_fc);i++)
			{
				if(*(lporigdata+i)<max)	
				{
					j=i;
					break;
				}
			}

			m_downfre=(double)j/datalength;
			j=datalength*m_fc;
			for(i=datalength/2;i>datalength*m_fc;i--)
			{
				if(*(lporigdata+i)>0)
				{
					j=i;
					break;
				}
			}

			m_upfre=(double)j/datalength;

			m_band=m_upfre-m_downfre;
			m_pass=0.0;
			m_reject=9999999999999;
			//GetDlgItem(IDC_EDIT_REJECT)->EnableWindow(FALSE);


		}
		else
		{
			mean=*(lporigdata);
			
			maxmin=max;

			for(i=(int)(m_fc*datalength)-1;i>0;i--)
			{
				if(*(lporigdata+i)<*(lporigdata+i+1)) pass=TRUE;
				if(pass==TRUE)
				{
					if((*(lporigdata+i)<*(lporigdata+i-1))&&(*(lporigdata+i)<*(lporigdata+i+1)))
					{
						if(maxmin>*(lporigdata+i))	
						{
							maxmin=*(lporigdata+i);
							j=i;
						}
					}

				}
			}
			for(i=(int)(datalength*m_fc)-1;i>=0;i--)
			{
				catched=FALSE;
				j=(int)(datalength*m_fc);
				for(k=0;k<=i;k++)
				{
					if(*(lporigdata+k)<*(lporigdata+i))	
					{
						catched=TRUE;
						break;
					}
				}
				if(catched==TRUE)
				{
					j=i;
					break;
				}
			}

			m_downfre=j/(double)datalength;
			
			max=(max-mean)/mean;
			maxmin=(mean-maxmin)/mean;
			if(max>maxmin)	m_pass=20*log10(1.0+max);
			else	m_pass=20*log10(1.0+maxmin);

			minmax=0.0;
			pass=FALSE;
			for(i=(int)((double)datalength*m_fc);i<datalength*0.5;i++)
			{
				if(*(lporigdata+i)>*(lporigdata+i-1)) pass=TRUE;
				if(pass==TRUE)
				{
					if((*(lporigdata+i)>*(lporigdata+i-1))&&(*(lporigdata+i)>*(lporigdata+i+1)))
					{
						if(minmax<*(lporigdata+i))		minmax=*(lporigdata+i);
					}

				}
			}
			m_reject=20*log10(minmax/mean);

			j=(int)(datalength*m_fc);
			for(i=(int)(datalength*m_fc);i<datalength*0.5;i++)
			{
				catched=FALSE;
				j=(int)(datalength*m_fc);
				for(k=int(datalength*0.5);k>=i;k--)
				{
					if(*(lporigdata+k)>*(lporigdata+i))	
					{
						catched=TRUE;
						break;
					}
				}
				if(catched==TRUE)
				{
					j=i;
					break;
				}
			}

			m_upfre=j/(double)datalength;

			m_band=m_upfre-m_downfre;
			if((m_band>0)&&(m_band<0.0001)) m_band=0.0001;
		}
	}
	else
	{
	//	GetDlgItem(IDC_EDIT_DOWNFRE)->EnableWindow(FALSE);
	//	GetDlgItem(IDC_EDIT_UPFRE)->EnableWindow(FALSE);
	//	GetDlgItem(IDC_EDIT_BAND)->EnableWindow(FALSE);
	//	GetDlgItem(IDC_EDIT_REJECT)->EnableWindow(FALSE);
	//	GetDlgItem(IDC_EDIT_PASS)->EnableWindow(FALSE);

	}
	OnPaint();
	
	UpdateData(FALSE);

}
void CMyDlg::OnCheckAddnoise() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	if(m_addnoise)
	{
		GetDlgItem(IDC_NOISE_FREQUENCY)->EnableWindow(TRUE);
		GetDlgItem(IDC_EDIT_NOISEFRE)->EnableWindow(TRUE);
		GetDlgItem(IDC_NOISE_AMPLITUDE)->EnableWindow(TRUE);
		GetDlgItem(IDC_EDIT_NOISEAMP)->EnableWindow(TRUE);
//		GetDlgItem(IDC_SPIN_NOISEFRE)->EnableWindow(TRUE);
//		GetDlgItem(IDC_SPIN_NOISEAMP)->EnableWindow(TRUE);
	}
	else
	{
		GetDlgItem(IDC_NOISE_FREQUENCY)->EnableWindow(FALSE);
		GetDlgItem(IDC_EDIT_NOISEFRE)->EnableWindow(FALSE);
		GetDlgItem(IDC_NOISE_AMPLITUDE)->EnableWindow(FALSE);
		GetDlgItem(IDC_EDIT_NOISEAMP)->EnableWindow(FALSE);
//		GetDlgItem(IDC_SPIN_NOISEFRE)->EnableWindow(FALSE);
//		GetDlgItem(IDC_SPIN_NOISEAMP)->EnableWindow(FALSE);
	}

	Drawbackground(hdctmp1,0,0,880,215,10,870,10,200,105); 
	DrawScaleText(hdctmp1,10,870,10,200,105);
	//绘波形
	draworiginalwave(hdctmp1, m_signalfre, m_signalamp, m_noisefre, m_noiseamp,10,870,105,200);
	OnPaint();

}
void CMyDlg::OnSelchangeComboFiltertype() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	switch(m_filtertype)//判断
		{
	    case 0:
	GetDlgItem(IDC_STATIC_REJECTION3)->EnableWindow(FALSE);
	GetDlgItem(IDC_STATIC_REJECTION2)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_REJECTION3)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_REJECTION2)->EnableWindow(FALSE);
	GetDlgItem(IDC_STATIC_REJECTION1)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_REJECTION1)->EnableWindow(TRUE);
		  break;
		case 1:
	GetDlgItem(IDC_STATIC_REJECTION3)->EnableWindow(FALSE);
	GetDlgItem(IDC_STATIC_REJECTION2)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_REJECTION3)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_REJECTION2)->EnableWindow(FALSE);
	GetDlgItem(IDC_STATIC_REJECTION1)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_REJECTION1)->EnableWindow(TRUE);
		  break;
		case 2:
	GetDlgItem(IDC_STATIC_REJECTION3)->EnableWindow(TRUE);
	GetDlgItem(IDC_STATIC_REJECTION2)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_REJECTION3)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_REJECTION2)->EnableWindow(TRUE);
	GetDlgItem(IDC_STATIC_REJECTION1)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_REJECTION1)->EnableWindow(FALSE);
		  break;
		case 3:
	GetDlgItem(IDC_STATIC_REJECTION3)->EnableWindow(TRUE);
	GetDlgItem(IDC_STATIC_REJECTION2)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_REJECTION3)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_REJECTION2)->EnableWindow(TRUE);
	GetDlgItem(IDC_STATIC_REJECTION1)->EnableWindow(FALSE);
	GetDlgItem(IDC_EDIT_REJECTION1)->EnableWindow(FALSE);
		  break;
		}
}
void CMyDlg::OnSelchangeComboSamplelen() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	switch(m_samplelen)//判断
		{
	    case 0:
		  analeng=8;
		  break;
		case 1:
		  analeng=16;
		  break;
		case 2:
		  analeng=32;
		  break;
		case 3:
		  analeng=64;
		  break;
		case 4:
		  analeng=128;
		  break;
		case 5:
		  analeng=256;
		  break;
		case 6:
		  analeng=512;
		  break;
		case 7:
		  analeng=1024;
		  break;
		case 8:
		  analeng=2048;
		  break;
		}
	SelectObject(hdctmp1,hbit1);//选位图
	SelectObject(hdctmp1,cb);//选底色
	SelectObject(hdctmp1,penk);//选笔
	Rectangle(hdctmp1,0,0,880,215);//画框
	Drawbackground(hdctmp1,0,0,880,215,10,870,10,200,105); 
	DrawScaleText(hdctmp1,10,870,10,200,105);
	draworiginalwave(hdctmp1, m_signalfre, m_signalamp, m_noisefre, m_noiseamp,10,870,105,200);
	OnPaint();
	
}
void CMyDlg::OnStaticRejection2() 
{
	// TODO: Add your control notification handler code here
	
}

void CMyDlg::OnStaticFiltersignal() 
{
	// TODO: Add your control notification handler code here
	
}
void CMyDlg::OnStaticSignal() 
{
	// TODO: Add your control notification handler code here
	
}
void CMyDlg::OnStaticSignalwave() 
{
	// TODO: Add your control notification handler code here
	
}
void CMyDlg::OnNoiseAmplitude() 
{
	// TODO: Add your control notification handler code here
	
}
void CMyDlg::OnChangeEditSignalfre() 
{
	// TODO: If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.
	
	// TODO: Add your control notification handler code here
	
}

⌨️ 快捷键说明

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