📄 filterdlg.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 + -