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

📄 filterdlg.cpp

📁 FIR 有限脉冲数字滤波器设计。另外还有无IIR设计的程序
💻 CPP
字号:
// filterDlg.cpp : implementation file
//

#include "stdafx.h"
#include "filter.h"
#include "filterDlg.h"

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

//yyyyyyyyyyyyyyy
#include "math.h"
//yyyyyyyyyyyyyy

/////////////////////////////////////////////////////////////////////////////
// CFilterDlg dialog

CFilterDlg::CFilterDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFilterDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CFilterDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CFilterDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFilterDlg)
	DDX_Control(pDX, IDC_SPIN1, myspin1);
	DDX_Control(pDX, IDC_STATIC_Frequency, myStaticFrequency);
	DDX_Control(pDX, IDC_STATIC_P3, mypicture3);
	DDX_Control(pDX, IDC_STATIC_P2, mypicture2);
	DDX_Control(pDX, IDC_STATIC_P1, mypicture1);
	DDX_Control(pDX, IDC_STATIC_P0, mypicture0);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CFilterDlg, CDialog)
	//{{AFX_MSG_MAP(CFilterDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_VSCROLL()
	ON_BN_CLICKED(IDC_BUTTON_Reset, OnBUTTONReset)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFilterDlg message handlers

void CFilterDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	CDialog::OnSysCommand(nID, lParam);
}
HCURSOR CFilterDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CFilterDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	exit(0);//yyyyyyyyyyy

	CDialog::OnLButtonDblClk(nFlags, point);
}

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

	//yyyyyyyyyyyyyyy
	ShowWindow(SW_MAXIMIZE);
	PI=4*atan(1);
	
	Fs=50;//采样频率
	Ts=1.0/Fs;
	N=400;//时间点数
	f=0.2;
	w=2*PI*f;//角频率w=2πf=2πf

	myspin1.SetRange(0,Fs/2*10);//抽样频率FT必须至少是信号频率f的2倍以上才能保
							 //证信号不失真, 所以最高频率不起过FT的一半
	myspin1.SetPos(f*10);//取微调旋钮的值的十分之一倍作为输入信号的频率f
	//yyyyyyyyyyyyyyy

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CFilterDlg::OnPaint() 
{
	CDialog::OnPaint();

	//yyyyyyyyyyyyyyyy
	CString astr;
	astr.Format("%.1f(Hz)", f);
	myStaticFrequency.SetWindowText(astr);

	for (n=0; n<N; n++)//制作输入信号
		x[n]= 20*sin(w*n*Ts);

	drawCurve(GetDlgItem(IDC_STATIC_P0), x, 0, N, RGB(0,0,0));//画输入信号波形图

	lowPass();		//低通滤波
	bandPass();	//带通滤波
	highPass();		//高通滤波
	//yyyyyyyyyyyyyyyy
}


void CFilterDlg::lowPass() //低通滤波
{
	nStart=35;
	for (n=nStart; n<N; n++)//从nStart时刻起, 用滤波器的传递函数计算输出信号y[n]
	{
		y[n] =  + (7.30448274836993910000e-003)*x[n-0] + (4.31919593731019440000e-003)*x[n-1] + (3.22747781543841280000e-003)*x[n-2] + (-1.30695163717993270000e-004)*x[n-3] + (-5.86501701195418340000e-003)*x[n-4] + (-1.34161577106453720000e-002)*x[n-5] + (-2.14791278776267570000e-002)*x[n-6] + (-2.80836942387369810000e-002)*x[n-7] + (-3.09575646246190230000e-002)*x[n-8] + (-2.79322613273276020000e-002)*x[n-9] + (-1.74471051790976200000e-002)*x[n-10] + (9.42204959807585280000e-004)*x[n-11] + (2.63350444941255100000e-002)*x[n-12] + (5.63994504064386640000e-002)*x[n-13] + (8.76843050598844490000e-002)*x[n-14] + (1.16132261026385640000e-001)*x[n-15] + (1.37774500003582270000e-001)*x[n-16] + (1.49467827778601100000e-001)*x[n-17] + (1.49467827778601100000e-001)*x[n-18] + (1.37774500003582270000e-001)*x[n-19] + (1.16132261026385640000e-001)*x[n-20] + (8.76843050598844490000e-002)*x[n-21] + (5.63994504064386640000e-002)*x[n-22] + (2.63350444941255100000e-002)*x[n-23] + (9.42204959807585280000e-004)*x[n-24] + (-1.74471051790976200000e-002)*x[n-25] + (-2.79322613273276020000e-002)*x[n-26] + (-3.09575646246190230000e-002)*x[n-27] + (-2.80836942387369810000e-002)*x[n-28] + (-2.14791278776267570000e-002)*x[n-29] + (-1.34161577106453720000e-002)*x[n-30] + (-5.86501701195418340000e-003)*x[n-31] + (-1.30695163717993270000e-004)*x[n-32] + (3.22747781543841280000e-003)*x[n-33] + (4.31919593731019440000e-003)*x[n-34] + (7.30448274836993910000e-003)*x[n-35];
	}

	drawCurve(GetDlgItem(IDC_STATIC_P1), y, nStart, N, RGB(255,0,0));
}

void CFilterDlg::bandPass()//带通滤波
{
	nStart=32;
	for (n=nStart; n<N; n++)
	{
		y[n] =  + (1.46254635989702670000e-002)*x[n-0] + (1.66156058540893080000e-002)*x[n-1] + (6.22253475057316620000e-003)*x[n-2] + (-2.92290365429757030000e-003)*x[n-3] + (9.47466501489146840000e-003)*x[n-4] + (2.99761495976853390000e-002)*x[n-5] + (1.77913553095366720000e-002)*x[n-6] + (-3.43330557962613150000e-002)*x[n-7] + (-7.21827623767946210000e-002)*x[n-8] + (-4.82703321237988730000e-002)*x[n-9] + (-3.69689250792246210000e-003)*x[n-10] + (-2.82848340048952420000e-002)*x[n-11] + (-1.22949238656529860000e-001)*x[n-12] + (-1.56863695940431760000e-001)*x[n-13] + (-1.74631977240023400000e-002)*x[n-14] + (2.19207100526408850000e-001)*x[n-15] + (3.37331926936690560000e-001)*x[n-16] + (2.19207100526408850000e-001)*x[n-17] + (-1.74631977240023400000e-002)*x[n-18] + (-1.56863695940431760000e-001)*x[n-19] + (-1.22949238656529860000e-001)*x[n-20] + (-2.82848340048952420000e-002)*x[n-21] + (-3.69689250792246210000e-003)*x[n-22] + (-4.82703321237988730000e-002)*x[n-23] + (-7.21827623767946210000e-002)*x[n-24] + (-3.43330557962613150000e-002)*x[n-25] + (1.77913553095366720000e-002)*x[n-26] + (2.99761495976853390000e-002)*x[n-27] + (9.47466501489146840000e-003)*x[n-28] + (-2.92290365429757030000e-003)*x[n-29] + (6.22253475057316620000e-003)*x[n-30] + (1.66156058540893080000e-002)*x[n-31] + (1.46254635989702670000e-002)*x[n-32];
	}

	drawCurve(GetDlgItem(IDC_STATIC_P2), y, nStart, N, RGB(0,128,0));
}

void CFilterDlg::highPass()//高通滤波
{
	nStart=56;
	for (n=nStart; n<N; n++)
	{
		y[n] =  + (-4.18895566322672860000e-004)*x[n-0] + (1.63212264284170500000e-003)*x[n-1] + (2.36057995368874710000e-003)*x[n-2] + (-5.03667211282072590000e-018)*x[n-3] + (-3.42077229346956840000e-003)*x[n-4] + (-3.44654860626427300000e-003)*x[n-5] + (1.30449964258766300000e-003)*x[n-6] + (5.99764344314007110000e-003)*x[n-7] + (4.15166767761832290000e-003)*x[n-8] + (-3.91608977212142690000e-003)*x[n-9] + (-9.29741689681251770000e-003)*x[n-10] + (-3.91699102675244560000e-003)*x[n-11] + (8.29861386862795410000e-003)*x[n-12] + (1.31135803114022750000e-002)*x[n-13] + (1.96398639347565660000e-003)*x[n-14] + (-1.50380901885251680000e-002)*x[n-15] + (-1.71124844885663340000e-002)*x[n-16] + (2.89759099604715380000e-003)*x[n-17] + (2.51795668317144170000e-002)*x[n-18] + (2.08758619534975960000e-002)*x[n-19] + (-1.30391462122095660000e-002)*x[n-20] + (-4.15447352998318320000e-002)*x[n-21] + (-2.39651511497029450000e-002)*x[n-22] + (3.58038947856009270000e-002)*x[n-23] + (7.60332598872910380000e-002)*x[n-24] + (2.59953578304444180000e-002)*x[n-25] + (-1.21912994505818000000e-001)*x[n-26] + (-2.87889192260276650000e-001)*x[n-27] + (6.40878183334200100000e-001)*x[n-28] + (-2.87889192260276650000e-001)*x[n-29] + (-1.21912994505818000000e-001)*x[n-30] + (2.59953578304444180000e-002)*x[n-31] + (7.60332598872910380000e-002)*x[n-32]
				+ (3.58038947856009270000e-002)*x[n-33] + (-2.39651511497029450000e-002)*x[n-34] + (-4.15447352998318320000e-002)*x[n-35] + (-1.30391462122095660000e-002)*x[n-36] + (2.08758619534975960000e-002)*x[n-37] + (2.51795668317144170000e-002)*x[n-38] + (2.89759099604715380000e-003)*x[n-39] + (-1.71124844885663340000e-002)*x[n-40] + (-1.50380901885251680000e-002)*x[n-41] + (1.96398639347565660000e-003)*x[n-42] + (1.31135803114022750000e-002)*x[n-43] + (8.29861386862795410000e-003)*x[n-44] + (-3.91699102675244560000e-003)*x[n-45] + (-9.29741689681251770000e-003)*x[n-46] + (-3.91608977212142690000e-003)*x[n-47] + (4.15166767761832290000e-003)*x[n-48] + (5.99764344314007110000e-003)*x[n-49] + (1.30449964258766300000e-003)*x[n-50] + (-3.44654860626427300000e-003)*x[n-51] + (-3.42077229346956840000e-003)*x[n-52] + (-5.03667211282072590000e-018)*x[n-53] + (2.36057995368874710000e-003)*x[n-54] + (1.63212264284170500000e-003)*x[n-55] + (-4.18895566322672860000e-004)*x[n-56];
	}

	drawCurve(GetDlgItem(IDC_STATIC_P3), y, nStart, N, RGB(0,0,255));
}

void CFilterDlg::drawCurve(CWnd* pwnd, double* v, int nStart, int nEnd, COLORREF thisColor)//画信号v[n]曲线
{
	CDC* pDC=pwnd->GetDC();
	CRect rect;
	pwnd->GetClientRect(&rect);

	int x0, y0, n;
	x0=30;	y0=rect.Height()/2;//坐标原点
	double ratioX=1;//横轴缩放比例

	//画纵横坐标轴
	CPen myPen(PS_SOLID, 2, RGB(0,0,0));//选用粗线型
	pDC->SelectObject(&myPen);
	pDC->MoveTo(x0-20,y0);
	pDC->LineTo(rect.Width()-20,y0);//横轴
	pDC->MoveTo(x0,10);
	pDC->LineTo(x0,rect.Height()-10);//纵轴
	myPen.DeleteObject();

	myPen.CreatePen(PS_SOLID, 1, thisColor);//改变线色
	pDC->SelectObject(&myPen);

	isFirstPoint=TRUE;
	for (n=nStart; n<N; n++)//输出信号
	{
		if(isFirstPoint)
			pDC->MoveTo(x0+n*ratioX, y0-v[n]);//绘图指针移到第一个点
		else
			pDC->LineTo(x0+n*ratioX, y0-v[n]);//画至当前点(即第二个往后的所有点)

		isFirstPoint=FALSE;
	}

	myPen.DeleteObject();
}

void CFilterDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	//yyyyyyyyyyyyyyy
	f=nPos/10.0;
	w=2*PI*f;

	if (nPos>=Fs/2*10)
		myspin1.SetPos(0);

	Invalidate();
	//yyyyyyyyyyyyyyy

	CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CFilterDlg::OnBUTTONReset() 
{
	myspin1.SetPos(0);
	f=0;
	w=2*PI*f;

	Invalidate();
}

⌨️ 快捷键说明

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