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

📄 wavefilterdlg.cpp

📁 IIR数字滤波
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	PCDC->LineTo(310,75);
	//y(n)图像绘图区,X轴(10,75,310,75),绘图高度为140,中心高度100,绘图宽度为300左右
	//-------------------------------

	pwnd=GetDlgItem(IDC_OUT_PIC2);
	PCDC=pwnd->GetDC();
	CRect rc4(0,0,320,200);
	PCDC->FillRect(rc4,&brwhite);
	PCDC->MoveTo(10,195);
	PCDC->LineTo(310,195);
	PCDC->SelectObject(&pen1);
	//y(n)图像绘图区,X轴(10,195,310,195),绘图高度为190,绘图宽度为300左右

}

void CWavefilterDlg::DrawInPic1(int N, Complex data1[])
{

	CWnd *pwnd=GetDlgItem(IDC_IN_PIC1);
	CDC *PCDC=pwnd->GetDC();

	CPen backpen1(PS_SOLID,1,RGB(0,0,0));
	CPen *pold1=NULL;
	pold1=PCDC->SelectObject(&backpen1);

	double temp;
	int i;
	for(i=1;i<=N;i++)
	{
		temp=data1[i].real;
		double step=300.0/N;
		int x=(int)(10+(int)(step*(i-1)));
		int y=75- (int)(temp*65);
		PCDC->MoveTo(x,75);
		PCDC->LineTo(x,y);
	}
}

void CWavefilterDlg::DrawInPic2(int N, Complex data1[])
{
	CWnd *pwnd=GetDlgItem(IDC_IN_PIC2);
	CDC *PCDC=pwnd->GetDC();

	CPen backpen1(PS_SOLID,1,RGB(0,0,0));
	CPen *pold1=NULL;
	pold1=PCDC->SelectObject(&backpen1);

	double temp;
	double maxtemp=0.0;
	int i;
	for(i=1;i<=N;i++)
	{
		temp=sqrt(data1[i].real*data1[i].real+data1[i].image*data1[i].image);
		if(temp>=maxtemp)
			maxtemp=temp;
	}
	double stepcols;
	stepcols=190.0/maxtemp;

	for(i=1;i<=N;i++)
	{
		temp=sqrt(data1[i].real*data1[i].real+data1[i].image*data1[i].image);
		double step;
		step=300.0/N;
		int x=(int)(10+(i-1)*step);
		int y=195- (int)(temp*stepcols);
		PCDC->MoveTo(x,195);
		PCDC->LineTo(x,y);
	}
}

void CWavefilterDlg::DrawOutPic1(int N, Complex data1[])
{
	CWnd *pwnd=GetDlgItem(IDC_OUT_PIC1);
	CDC *PCDC=pwnd->GetDC();

	CPen backpen1(PS_SOLID,1,RGB(0,0,0));
	CPen *pold1=NULL;
	pold1=PCDC->SelectObject(&backpen1);

	double temp;
	int i;
	double maxtemp=0.0;
	for(i=1;i<=N;i++)
	{
		temp=(data1[i].real>0)?data1[i].real:(0-data1[i].real);
		if(temp>=maxtemp)
			maxtemp=temp;
	}
	double stepcols;
	stepcols=70.0/maxtemp;
	for(i=0;i<N;i++)
	{
		temp=data1[i].real;
		double step=300.0/N;
		int x=(int)(10+(int)(step*(i-1)));
		int y=75- (int)(temp*stepcols);
		PCDC->MoveTo(x,75);
		PCDC->LineTo(x,y);
	}
}

void CWavefilterDlg::DrawOutPic2(int N, Complex data1[])
{
	CWnd *pwnd=GetDlgItem(IDC_OUT_PIC2);
	CDC *PCDC=pwnd->GetDC();

	CPen backpen1(PS_SOLID,1,RGB(0,0,0));
	CPen *pold1=NULL;
	pold1=PCDC->SelectObject(&backpen1);

	double temp;
	double maxtemp=0.0;
	int i;
	for(i=1;i<=N;i++)
	{
		temp=sqrt(data1[i].real*data1[i].real+data1[i].image*data1[i].image);
		if(temp>=maxtemp)
			maxtemp=temp;
	}
	double stepcols;
	stepcols=190.0/maxtemp;

	for(i=1;i<=N;i++)
	{
		temp=sqrt(data1[i].real*data1[i].real+data1[i].image*data1[i].image);
		double step;
		step=300.0/N;
		int x=(int)(10+(i-1)*step);
		int y=195- (int)(temp*stepcols);
		PCDC->MoveTo(x,195);
		PCDC->LineTo(x,y);
	}
}

void CWavefilterDlg::MainFunction()
{
	int i=1;
	if(m_wave.GetCurSel()==1)
		m_zhankong_msg.Format("%d%%",zhankong);
	m_point_msg.Format("%d",pointnum);
	m_period_msg.Format("%2gT",period/10.0);
	m_phase_msg.Format("%1gPI",phase*0.01);
	m_pointperperiod_msg.Format("每周期点数:%d",(int)pointnum*10/period);
	UpdateData(false);
	DrawCoordinate();
	Complex *x=new Complex[1024];
	Complex *X=new Complex[pointnum+1];
	int ftype=m_wave.GetCurSel();
	InitData(ftype,x);

	for(i=0;i<=pointnum;i++)
		X[i]=x[i];

	DrawInPic1(pointnum,x);



	int pointtemp=pointnum;
	int ffttime=0;
	while(pointtemp!=0)
	{
		pointtemp/=2;
		ffttime++;
	}
	ffttime--;
	if(pointnum>pow(2,ffttime))
	{
		ffttime++;
	}
	for(i=pointnum+1;i<=pow(2,ffttime);i++)
	{
		x[i].real=0;
		x[i].image=0;
	}
	FFT((int)pow(2,ffttime),ffttime,x);
	DrawInPic2((int)pow(2,ffttime),x);
	

	int start=3;
	Complex *y = new Complex[1025];
	double wd=(double)phase*0.01;
	IIRFunction(X,y,pointnum,wd,m_jieshu.GetCurSel()+3);
	DrawOutPic1(pointnum,y);
	FFT((int)pow(2,ffttime),ffttime,y);
	DrawOutPic2((int)pow(2,ffttime),y);

}

void CWavefilterDlg::OnOK() 
{
	MainFunction();
	
}

void CWavefilterDlg::OnSelchangeWaveShape() 
{
	if(m_wave.GetCurSel()==1)
	{
		m_ZK1="占空比:";
		m_zhankong_msg.Format("%d%%",m_zhankong.GetScrollPos());
		CWnd *pWnd=GetDlgItem(IDC_ZHANKONG);
		pWnd->ShowWindow(SW_SHOW);
		UpdateData(false);
	}
	else
	{
		m_ZK1="";
		m_zhankong_msg="";
		CWnd *pWnd=GetDlgItem(IDC_ZHANKONG);
		pWnd->ShowWindow(SW_HIDE);
		UpdateData(false);
	}
	MainFunction();	
}

void CWavefilterDlg::OnClrpic() 
{
	DrawCoordinate();	
}

void CWavefilterDlg::OnSelchangeJieshu() 
{
	MainFunction();	
}

void CWavefilterDlg::IIRFunction(Complex A[], Complex B[], int N, double wd, int grade)
{
     for(int i = 1; i <= 256; i++)
	 {
            B[i].real=0.0;
			B[i].image=0.0;
	 }

        wd *= PI;
        double wa = (double)2 * tan(wd / (double)2);
        if(grade == 3)
        {
            double a0 = pow(wa, 3);
            double a1 = (double)3 * pow(wa, 3);
            double a2 = (double)3 * pow(wa, 3);
            double a3 = pow(wa, 3);
            double A0 = (double)8 + (double)8 * wa + (double)4 * pow(wa, 2) + pow(wa, 3);
            double A1 = ((double)-24 - (double)8 * wa) + (double)4 * pow(wa, 2) + (double)3 * pow(wa, 3);
            double A2 = ((double)24 - (double)8 * wa - (double)4 * pow(wa, 2)) + (double)3 * pow(wa, 3);
            double A3 = (((double)-8 + (double)8 * wa) - (double)4 * pow(wa, 2)) + pow(wa, 3);
            a0 /= A0;
            a1 /= A0;
            a2 /= A0;
            a3 /= A0;
            A1 /= A0;
            A2 /= A0;
            A3 /= A0;
            B[1].real =a0 * A[1].real;
            B[2].real =a0 * A[2].real + a1 * A[1].real - A1 * B[1].real;
            B[3].real = a0 * A[3].real + a1 * A[2].real + a2 * A[1].real - A1 * B[2].real - A2 * B[1].real;
            for(int n = 4; n <= N; n++)
                B[n].real =a0 * A[n].real + a1 * A[n - 1].real + a2 * A[n - 2].real + a3 * A[n - 3].real - A1 * B[n - 1].real - A2 * B[n - 2].real - A3 * B[n - 3].real;

        }
        if(grade== 4)
        {
            double a0 = pow(wa, 4);
            double a1 = (double)4 * pow(wa, 4);
            double a2 = (double)6 * pow(wa, 4);
            double a3 = (double)4 * pow(wa, 4);
            double a4 = pow(wa, 4);
            double A0 = (double)16 + 20.904 * wa + 12.564 * pow(wa, 2) + 5.226 * pow(wa, 3) + pow(wa, 4);
            double A1 = ((double)-64 - 41.808 * wa) + 10.452 * pow(wa, 3) + (double)4 * pow(wa, 4);
            double A2 = ((double)96 - 25.128 * pow(wa, 2)) + (double)6 * pow(wa, 4);
            double A3 = (((double)-64 + 41.808 * wa) - 10.452 * pow(wa, 3)) + (double)4 * pow(wa, 4);
            double A4 = ((((double)16 - 20.904 * wa) + 12.564 * pow(wa, 2)) - 5.226 * pow(wa, 3)) + pow(wa, 4);
            a0 /= A0;
            a1 /= A0;
            a2 /= A0;
            a3 /= A0;
            a4 /= A0;
            A1 /= A0;
            A2 /= A0;
            A3 /= A0;
            A4 /= A0;
            B[1].real=a0 * A[1].real;
            B[2].real=(a0 * A[2].real + a1 * A[1].real) - A1 * B[1].real;
            B[3].real=(a0 * A[3].real + a1 * A[2].real + a2 * A[1].real) - A1 * B[2].real - A2 * B[1].real;
            B[4].real=(a0 * A[4].real + a1 * A[3].real + a2 * A[2].real + a3 * A[1].real) - A1 * B[3].real - A2 * B[2].real - A3 * B[1].real;
            for(int n = 5; n <= N; n++)
                B[n].real=(a0 * A[n].real + a1 * A[n - 1].real + a2 * A[n - 2].real + a3 * A[n - 3].real + a4 * A[n - 4].real) - A1 * B[n - 1].real - A2 * B[n - 2].real - A3 * B[n - 3].real - A4 * B[n - 4].real;

        }
        if(grade == 5)
        {
            double a0 = pow(wa, 5);
            double a1 = (double)5 * pow(wa, 5);
            double a2 = (double)10 * pow(wa, 5);
            double a3 = (double)10 * pow(wa, 5);
            double a4 = (double)5 * pow(wa, 5);
            double a5 = pow(wa, 5);
            double A0 = (double)32 + 51.776000000000003 * wa + 41.887999999999998 * pow(wa, 2) + 20.943999999999999 * pow(wa, 3) + 6.4720000000000004 * pow(wa, 4) + pow(wa, 5);
            double A1 = ((double)-160 - 155.328 * wa - 41.887999999999998 * pow(wa, 2)) + 20.943999999999999 * pow(wa, 3) + 19.416 * pow(wa, 4) + (double)5 * pow(wa, 5);
            double A2 = (((double)320 + 103.55200000000001 * wa) - 83.775999999999996 * pow(wa, 2) - 41.887999999999998 * pow(wa, 3)) + 12.944000000000001 * pow(wa, 4) + (double)10 * pow(wa, 5);
            double A3 = (((double)-320 + 103.55200000000001 * wa + 83.775999999999996 * pow(wa, 2)) - 41.887999999999998 * pow(wa, 3) - 12.944000000000001 * pow(wa, 4)) + (double)10 * pow(wa, 5);
            double A4 = ((((double)160 - 155.328 * wa) + 41.887999999999998 * pow(wa, 2) + 20.943999999999999 * pow(wa, 3)) - 19.416 * pow(wa, 4)) + (double)5 * pow(wa, 5);
            double A5 = (((((double)-32 + 51.776000000000003 * wa) - 41.887999999999998 * pow(wa, 2)) + 20.943999999999999 * pow(wa, 3)) - 6.4720000000000004 * pow(wa, 4)) + pow(wa, 5);
            a0 /= A0;
            a1 /= A0;
            a2 /= A0;
            a3 /= A0;
            a4 /= A0;
            a5 /= A0;
            A1 /= A0;
            A2 /= A0;
            A3 /= A0;
            A4 /= A0;
            A5 /= A0;
            B[1].real=a0 * A[1].real;
            B[2].real=(a0 * A[2].real + a1 * A[1].real) - A1 * B[1].real;
            B[3].real=(a0 * A[3].real + a1 * A[2].real + a2 * A[1].real) - A1 * B[2].real - A2 * B[1].real;
            B[4].real=(a0 * A[4].real + a1 * A[3].real + a2 * A[2].real + a3 * A[1].real) - A1 * B[3].real - A2 * B[2].real - A3 * B[1].real;
            B[5].real=(a0 * A[5].real + a1 * A[4].real + a2 * A[3].real + a3 * A[2].real + a4 * A[1].real) - A1 * B[4].real - A2 * B[3].real - A3 * B[2].real - A4 * B[1].real;
            for(int n = 6; n <= N; n++)
                B[n].real=(a0 * A[n].real + a1 * A[n - 1].real + a2 * A[n - 2].real + a3 * A[n - 3].real + a4 * A[n - 4].real + a5 * A[n - 5].real) - A1 * B[n - 1].real - A2 * B[n - 2].real - A3 * B[n - 3].real - A4 * B[n - 4].real - A5 * B[n - 5].real;

        }
}

void CWavefilterDlg::OnCancel() 
{
	/*
	dlgtest dlg;
	if(dlg.DoModal()==IDOK)
	{
	return;
	}
	*/
	CDialog::OnCancel();
}

void CWavefilterDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	int x=point.x;
	int y=point.y;
	if(x>=30&&x<=320&&y>140&&y<=280)
	{
		m_num1.Format("%d",x);
		m_num2.Format("%d",y);
	}
	UpdateData(false);
	CDialog::OnMouseMove(nFlags, point);
}

void CWavefilterDlg::TestHighPass()
{
	int i=1;
	if(m_wave.GetCurSel()==1)
		m_zhankong_msg.Format("%d%%",zhankong);
	m_point_msg.Format("%d",pointnum);
	m_period_msg.Format("%2gT",period/10.0);
	m_phase_msg.Format("%1gPI",phase*0.01);
	m_pointperperiod_msg.Format("每周期点数:%d",(int)pointnum*10/period);
	UpdateData(false);
	DrawCoordinate();
	Complex *x=new Complex[1024];
	Complex *X=new Complex[pointnum+1];
	int ftype=m_wave.GetCurSel();
	InitData(ftype,x);

	for(i=0;i<=pointnum;i++)
		X[i]=x[i];
	x1=x;
	DrawInPic1(pointnum,x1);



	int pointtemp=pointnum;
	int ffttime=0;
	while(pointtemp!=0)
	{
		pointtemp/=2;
		ffttime++;
	}
	ffttime--;
	if(pointnum>pow(2,ffttime))
	{
		ffttime++;
	}
	for(i=pointnum+1;i<=pow(2,ffttime);i++)
	{
		x[i].real=0;
		x[i].image=0;
	}

	FFT((int)pow(2,ffttime),ffttime,x);
	x2=x;
	DrawInPic2((int)pow(2,ffttime),x2);
	

	int start=3;
	double wd=(double)phase*0.01;

        wd *= PI;
		Complex *A=new Complex[1025];
		Complex *B=new Complex[1025];
		for(i=0;i<=pointnum;i++)
			A[i]=X[i];
	  for(i = 1; i <= 256; i++)
	 {
            B[i].real=0.0;
			B[i].image=0.0;
	 }
		int N;
		N=pointnum;
        double wa = (double)2 * tan(0.1*PI);
            double B0 = pow(wa, 3);
            double B1 = (double)3 * pow(wa, 3);
            double B2 = (double)3 * pow(wa, 3);
            double B3 = pow(wa, 3);
            double A0 = (double)8 + (double)8 * wa + (double)4 * pow(wa, 2) + pow(wa, 3);
            double A1 = ((double)-24 - (double)8 * wa) + (double)4 * pow(wa, 2) + (double)3 * pow(wa, 3);
            double A2 = ((double)24 - (double)8 * wa - (double)4 * pow(wa, 2)) + (double)3 * pow(wa, 3);
            double A3 = (((double)-8 + (double)8 * wa) - (double)4 * pow(wa, 2)) + pow(wa, 3);
            B0 /= A0;
            B1 /= A0;
            B2 /= A0;
            B3 /= A0;
            A1 /= A0;
            A2 /= A0;
            A3 /= A0;
			double a0,b0,b1,b2,b3,a1,a2,a3;
			double a=-cos((0.2*PI+0.6*PI)/2.0)/cos((0.2*PI-0.6*PI)/2.0);
			a0=B0-a*B1+a*a*B2-a*a*a*B3;
			a1=3*a*B0-B1*(1+2*a*a)+B2*(a*a*a+2*a)-3*a*a*B3;
			a2=3*a*a*B0-B1*(a*a*a+2*a)+B2*(1+2*a*a)-3*a*B3;
			a3=a*a*a*B0-B1*a*a+B2*a-B3;
			b0=(double)1-a*A1+a*a*A2-a*a*a*A3;
			b1=3*a-A1*(1+2*a*a)+A2*(a*a*a+2*a)-3*a*a*A3;
			b2=(a*a*a+2*a)+A2*(1+2*a*a)-3*a*A3;
			b3=a*a*a-A1*a*a+A2*a-A3;

			b2=3*a*a-A1*(a*a*a+2*a)+A2*(1+2*a*a)-3*a*A3;
            B[1].real =(a0 * A[1].real)/b0;
            B[2].real =(a0 * A[2].real + a1 * A[1].real - b1 * B[1].real)/b0;
            B[3].real = (a0 * A[3].real + a1 * A[2].real + a2 * A[1].real - b1 * B[2].real - b2 * B[1].real)/b0;
            for(int n = 4; n <= N; n++)
                B[n].real =(a0 * A[n].real + a1 * A[n - 1].real + a2 * A[n - 2].real + a3 * A[n - 3].real - b1 * B[n - 1].real - b2 * B[n - 2].real - b3 * B[n - 3].real)/b0;
	y1=B;
	DrawOutPic1(pointnum,B);
	FFT((int)pow(2,ffttime),ffttime,y1);
	y2=B;
	DrawOutPic2((int)pow(2,ffttime),y2);
}

void CWavefilterDlg::OnHighpass() 
{
	TestHighPass();
	
}

⌨️ 快捷键说明

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