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

📄 wavefilterdlg.cpp

📁 IIR数字滤波
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// wavefilterDlg.cpp : implementation file
//

#include "stdafx.h"
#include "wavefilter.h"
#include "wavefilterDlg.h"
#include "math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define PI 3.1415926535897931

/////////////////////////////////////////////////////////////////////////////
// CWavefilterDlg dialog

CWavefilterDlg::CWavefilterDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CWavefilterDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CWavefilterDlg)
	m_period_msg = _T("");
	m_point_msg = _T("");
	m_pointperperiod_msg = _T("");
	m_zhankong_msg = _T("");
	m_ZK1 = _T("");
	m_phase_msg = _T("");
	m_num1 = _T("");
	m_num2 = _T("");
	m_num3 = _T("");
	m_num4 = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CWavefilterDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CWavefilterDlg)
	DDX_Control(pDX, IDC_PHASE, m_phase);
	DDX_Control(pDX, IDC_JIESHU, m_jieshu);
	DDX_Control(pDX, IDC_WAVE_SHAPE, m_wave);
	DDX_Control(pDX, IDC_POINT, m_point);
	DDX_Control(pDX, IDC_ZHANKONG, m_zhankong);
	DDX_Control(pDX, IDC_PERIOD, m_period);
	DDX_Text(pDX, IDC_PERIOD_MSG, m_period_msg);
	DDX_Text(pDX, IDC_POING_MSG, m_point_msg);
	DDX_Text(pDX, IDC_POINGPERPERIOD_MSG, m_pointperperiod_msg);
	DDX_Text(pDX, IDC_ZHANKONG_MSG, m_zhankong_msg);
	DDX_Text(pDX, IDC_ZK1, m_ZK1);
	DDX_Text(pDX, IDC_PAHSE_MSG, m_phase_msg);
	DDX_Text(pDX, IDC_NUM1, m_num1);
	DDX_Text(pDX, IDC_NUM2, m_num2);
	DDX_Text(pDX, IDC_NUM3, m_num3);
	DDX_Text(pDX, IDC_NUM4, m_num4);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CWavefilterDlg, CDialog)
	//{{AFX_MSG_MAP(CWavefilterDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_HSCROLL()
	ON_CBN_SELCHANGE(IDC_WAVE_SHAPE, OnSelchangeWaveShape)
	ON_BN_CLICKED(IDC_CLRPIC, OnClrpic)
	ON_CBN_SELCHANGE(IDC_JIESHU, OnSelchangeJieshu)
	ON_WM_MOUSEMOVE()
	ON_BN_CLICKED(IDC_HIGHPASS, OnHighpass)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWavefilterDlg message handlers

BOOL CWavefilterDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	m_point.SetScrollRange(16,512);
	m_point.SetScrollPos(128);


	m_period.SetScrollRange(1,100);
	m_period.SetScrollPos(10);

	m_zhankong.SetScrollRange(1,100);
	m_zhankong.SetScrollPos(50);

	m_phase.SetScrollRange(0,100);
	m_phase.SetScrollPos(20);

	pointnum=m_point.GetScrollPos();
	period=m_period.GetScrollPos();
	zhankong=m_zhankong.GetScrollPos();
	phase=m_phase.GetScrollPos();


	//m_convtype=0;
	//init_num=0;
	//foutput=false;
	m_wave.SetCurSel(0);
	m_jieshu.SetCurSel(0);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CWavefilterDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	
	}
		//MainFunction();
}

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

void CWavefilterDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	pointnum=m_point.GetScrollPos();
	period=m_period.GetScrollPos();
	zhankong=m_zhankong.GetScrollPos();
	phase=m_phase.GetScrollPos();
	if(pScrollBar->GetDlgCtrlID()==IDC_POINT)
	{
		switch(nSBCode)
		{
		case SB_LINERIGHT:	if(pointnum<1024)
								pointnum+=1;
							pScrollBar->SetScrollPos(pointnum);
								MainFunction();
			break;
		case SB_LINELEFT:	if(pointnum>16)
								pointnum-=1;
							 pScrollBar->SetScrollPos(pointnum);
							 MainFunction();
			break;
		case SB_THUMBPOSITION:pScrollBar->SetScrollPos(nPos);
							MainFunction();				
			break;
		case SB_THUMBTRACK:pScrollBar->SetScrollPos(nPos);
							MainFunction();
							break;
		}
	}
	else if(pScrollBar->GetDlgCtrlID()==IDC_PERIOD)
	{
		switch(nSBCode)
		{
		case SB_LINERIGHT:	if(period<100)
								period+=1;
							pScrollBar->SetScrollPos(period);
								MainFunction();
			break;
		case SB_LINELEFT:	if(period>=2)
								period-=1;
							 pScrollBar->SetScrollPos(period);
							 MainFunction();
			break;
		case SB_THUMBPOSITION:pScrollBar->SetScrollPos(nPos);
							MainFunction();				
			break;
		case SB_THUMBTRACK:pScrollBar->SetScrollPos(nPos);
							MainFunction();
							break;
		}
	}
	else if(pScrollBar->GetDlgCtrlID()==IDC_ZHANKONG)
	{
		switch(nSBCode)
		{
		case SB_LINERIGHT:	if(zhankong<20)
								zhankong+=1;
							pScrollBar->SetScrollPos(zhankong);
								MainFunction();
			break;
		case SB_LINELEFT:	if(zhankong>=2)
								zhankong-=1;
							 pScrollBar->SetScrollPos(zhankong);
							 MainFunction();
			break;
		case SB_THUMBPOSITION:pScrollBar->SetScrollPos(nPos);
							MainFunction();				
			break;
		case SB_THUMBTRACK:pScrollBar->SetScrollPos(nPos);
							MainFunction();
							break;
		}
	}
	else if(pScrollBar->GetDlgCtrlID()==IDC_PHASE)
	{
		switch(nSBCode)
		{
		case SB_LINERIGHT:	if(phase<100)
								phase+=1;
							pScrollBar->SetScrollPos(phase);
								MainFunction();
			break;
		case SB_LINELEFT:	if(phase>=1)
								phase-=1;
							 pScrollBar->SetScrollPos(phase);
							 MainFunction();
			break;
		case SB_THUMBPOSITION:pScrollBar->SetScrollPos(nPos);
							MainFunction();				
			break;
		case SB_THUMBTRACK:pScrollBar->SetScrollPos(nPos);
							MainFunction();
							break;
		}
	}	
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CWavefilterDlg::FFT(int N, int M, Complex data2[])
{
	int j=1;
	int i=1;
	int K;
	do
	{
		if(i<j)
		{
			Complex T;
			T.real = data2[j].real;
			T.image = data2[j].image;
			data2[j].real=data2[i].real;
			data2[j].image=data2[i].image;
			data2[i].real=T.real;
			data2[i].image=T.image;
		}
		K=N/2;
		while(K<j)
		{
			j-=K;
			K/=2;
		}
		j+=K;
		i++;
	}while(i<N);
	int LE,LE1,IP;
	int L=1;
	do
	{
		LE=(int)pow(2,L);	
		LE1=LE/2;
		Complex U={1.0,0.0};
		Complex W={cos(0-PI/(double)LE1),sin(0-PI/(double)LE1)};
		j=1;
		do
		{
			i=j;
			do
			{
				IP=i+LE1;
				Complex T;
				T.real= data2[IP].real*U.real-data2[IP].image*U.image;
				T.image = data2[IP].real*U.image+data2[IP].image*U.real;
				data2[IP].real = data2[i].real-T.real;
				data2[IP].image = data2[i].image-T.image;
				data2[i].real = data2[i].real+T.real;
				data2[i].image = data2[i].image+T.image;
				i+=LE;
			} while(i<=N);
			double tempreal=U.real;
			double tempimage=U.image;
			U.real = U.real*W.real-W.image*U.image;
			U.image = tempreal*W.image+tempimage*W.real;
			j++;
		} while(j<=LE1);
		L++;
	} while(L<=M);
}

void CWavefilterDlg::GetSinData(int N, double T, Complex dataout[])
{
		int i;
		double temp;
		temp=2.0*PI*T/(double)N;
		for(i=1;i<=N;i++)
		{
			dataout[i].real=sin(temp*(double)i);
			dataout[i].image=0;
		}
}



void CWavefilterDlg::GetJuchiData(int N, double T, Complex dataout[])
{
		int i;
		int t1=(int)((double)N/T);
		double j=0.0;
		while(j<T)
		{
			for(i=(int)j*t1+1;i<=(j+1)*t1,i<=N;i++)
			{
				dataout[i].real=(i-j*t1)/t1;
				dataout[i].image=0;
			}
			j+=1;
		}
}

void CWavefilterDlg::GetTriangleData(int N, double T, Complex dataout[])
{
		int i;
		int t1=(int)((double)N/T);
		double j=0.0;
		while(j<T)
		{
			for(i=(int)(j*t1)+1;i<=(int)(j*t1+t1/2),i<=N;i++)
			{
				dataout[i].real=(i-j*t1)/t1*2.0;
				dataout[i].image=0;
			}
			for(i=(int)(j*t1+t1/2+1);i<=(j+1)*t1,i<=N;i++)
			{
				dataout[i].real=((j+1)*t1-i)/t1*2.0;
				dataout[i].image=0;
			}
			j+=1;
		}
}

void CWavefilterDlg::GetRectangleData(int N, double T, double Z, Complex dataout[])
{
		int i;
		int t1=(int)((double)N/T*Z);
		double j=0.0;
		while(j<T)
		{
			int t2=(int)(j*N/T+t1);
			for(i=(int)(j*N/T+1);i<=t2,i<=N;i++)
			{
				dataout[i].real=1;
				dataout[i].image=0;
			}
			for(i=t2+1;i<=(j+1)*N/T,i<=N;i++)
			{
				dataout[i].real=0;
				dataout[i].image=0;
			}
			j+=1;
		}
}

void CWavefilterDlg::InitData(int wavetype, Complex dataout[])
{
	double T=0.0;
	double Z=0.5;
	int i;
		T=(double)m_period.GetScrollPos()/10.0;
		if(wavetype==1)
		{
			Z=(double)m_zhankong.GetScrollPos()/100.0;
			GetRectangleData(pointnum,T,Z,dataout);
		}
		else if(wavetype==0)
		{
			GetSinData(pointnum,T,dataout);
		}
		else if(wavetype==2)
		{
			GetTriangleData(pointnum,T,dataout);
		}
		else if(wavetype==3)
		{
			GetJuchiData(pointnum,T,dataout);
		}
		else if(wavetype==4)
		{
			dataout[1].real=1;
			dataout[1].image=0;
			for(i=2;i<=pointnum;i++)
			{
				dataout[i].real=0;
				dataout[i].image=0;
			}
		}
		else if(wavetype==5)
		{
			for(i=1;i<=pointnum;i++)
			{
				dataout[i].real=1;
				//dataout[i].image=0;
			}
		}
}

void CWavefilterDlg::DrawCoordinate()
{
	CWnd *pwnd=GetDlgItem(IDC_IN_PIC1);
	CDC *PCDC=pwnd->GetDC();

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

	CRect rcclient;
	GetClientRect(&rcclient);

	CRect rc1(0,0,320,150);
	CBrush brwhite(RGB(255,0,255));
	PCDC->FillRect(rc1,&brwhite);
	PCDC->MoveTo(10,75);
	PCDC->LineTo(310,75);
	//x(n)图像绘图区,X轴(10,75,310,75),绘图高度为140,中心高度75,绘图宽度为300左右
	//---------------------------------

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

	pwnd=GetDlgItem(IDC_OUT_PIC1);
	PCDC=pwnd->GetDC();
	CRect rc3(0,0,320,150);
	PCDC->FillRect(rc3,&brwhite);
	PCDC->MoveTo(10,75);

⌨️ 快捷键说明

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