📄 oscillographview.cpp
字号:
// OscillographView.cpp : implementation of the COscillographView class
//
#include "stdafx.h"
#include "Oscillograph.h"
#include "OscillographDoc.h"
#include "OscillographView.h"
#include "Wave.h"
#include "DlgFilter.h"
#include "FIRDesign.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// COscillographView
IMPLEMENT_DYNCREATE(COscillographView, CView)
BEGIN_MESSAGE_MAP(COscillographView, CView)
//{{AFX_MSG_MAP(COscillographView)
ON_WM_PAINT()
ON_COMMAND(ID_FILTER_SETTING, OnFilterSetting)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COscillographView construction/destruction
COscillographView::COscillographView()
{
// TODO: add construction code here
m_dblSignalA = 1;
m_dblSignalFreq = 400;
m_dblNoiseA = 0.5;
m_dblNoiseFreq = 4000;
m_dblSamplingFreq = 40000;
m_nFilterOrder = 112;
m_nFilterType = 2;
m_nWindowType = 0;
m_dblWl = 200;
m_dblWh = 600;
/*
double* pA = new double[10];
for(int i=0; i<10; i++)
pA[i] = i;
delete [] pA;
// pA = NULL;
if(pA)
delete [] pA;
pA = new double[10];*/
/*
参数选取备注:
采样频率40KHz
期望信号400Hz
设计(200,600)带通滤波器滤除直流及谐波干扰
滤波器阶数:112
窗函数为矩形窗(boxcar)
若选择其它窗函数,则滤波器阶数要增加
*/
}
COscillographView::~COscillographView()
{
}
BOOL COscillographView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// COscillographView drawing
void COscillographView::OnDraw(CDC* pDC)
{
COscillographDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// COscillographView printing
BOOL COscillographView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void COscillographView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void COscillographView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// COscillographView diagnostics
#ifdef _DEBUG
void COscillographView::AssertValid() const
{
CView::AssertValid();
}
void COscillographView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
COscillographDoc* COscillographView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COscillographDoc)));
return (COscillographDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// COscillographView message handlers
void COscillographView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
/* CDC memDC;
CBitmap bitmap,*pOldbitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
memDC.CreateCompatibleDC(&dc);
pOldbitmap = memDC.SelectObject(&bitmap);
dc.BitBlt(10,10,200,200,&memDC,0,0,SRCCOPY);
dc.PatBlt(0,0,500,500,DSTINVERT);
memDC.SelectObject(pOldbitmap);
double Fs = 40000; //40KHz
double f0 = 400; //400Hz
double Wl = 100/(Fs/2); //截止频率
double Wh = 800/(Fs/2); //截止频率
*/
const int nSampleNumber = 2000;
double x[nSampleNumber],noise[nSampleNumber],y[nSampleNumber];
for(int i=0; i<nSampleNumber; i++)
{
x[i] = m_dblSignalA * sin(2*PI*m_dblSignalFreq*i/m_dblSamplingFreq);
noise[i] = m_dblNoiseA * sin(2*PI*m_dblNoiseFreq*i/m_dblSamplingFreq);
y[i] = x[i] + noise[i];
}
CRect rect;
GetClientRect(&rect);
CWave wave;
CWave wave1;
CWave wave2;
wave.GetDC(&dc);
wave1.GetDC(&dc);
wave2.GetDC(&dc);
wave.SetSize(rect.left+10,rect.top+10,rect.Width()-20,rect.Height()/3);
wave1.SetSize(rect.left+10,rect.top+20+rect.Height()/3,rect.Width()-20,rect.Height()/3);
wave2.SetSize(rect.left+10,rect.top+30+2*rect.Height()/3,rect.Width()-20,rect.Height()/4);
wave.ShowFigure();
wave1.ShowFigure();
wave2.ShowFigure();
wave.GetWave(y,nSampleNumber);
wave.ShowWave();
CFIRDesign Filter;
if(m_nFilterType<=1)
Filter.FIR(m_nFilterOrder,m_dblWl/(m_dblSamplingFreq/2),m_nFilterType+1,m_nWindowType+1);
else
Filter.FIR(m_nFilterOrder,m_dblWl/(m_dblSamplingFreq/2),m_dblWh/(m_dblSamplingFreq/2),m_nFilterType+1,m_nWindowType+1);
Filter.Filter(y,nSampleNumber);
wave1.GetWave(y,nSampleNumber);
wave1.ShowWave();
double* pAR = new double [m_nFilterOrder+1];
double* pPR = new double [m_nFilterOrder+1];
Filter.Freqz(pAR,pPR,m_nFilterOrder+1);
wave2.GetWave(pAR,m_nFilterOrder/2+1);
// wave2.SetXLimits(0,PI);
wave2.ShowWave();
delete [] pAR;
delete [] pPR;
/**/
// Do not call CView::OnPaint() for painting messages
}
void COscillographView::OnFilterSetting()
{
// TODO: Add your command handler code here
CDlgFilter dlg;
dlg.m_dblNoiseA = m_dblNoiseA;
dlg.m_dblNoiseFreq = m_dblNoiseFreq;
dlg.m_dblSignalA = m_dblSignalA;
dlg.m_dblSignalFreq = m_dblSignalFreq;
dlg.m_dblSamplingFreq = m_dblSamplingFreq;
dlg.m_dblWh = m_dblWh;
dlg.m_dblWl = m_dblWl;
dlg.m_nFilterOrder = m_nFilterOrder;
dlg.m_nFilterType = m_nFilterType;
dlg.m_nWindowType = m_nWindowType;
if(IDOK == dlg.DoModal())
{
m_dblNoiseA = dlg.m_dblNoiseA;
m_dblNoiseFreq = dlg.m_dblNoiseFreq;
m_dblSignalA = dlg.m_dblSignalA;
m_dblSignalFreq = dlg.m_dblSignalFreq;
m_dblSamplingFreq = dlg.m_dblSamplingFreq;
m_dblWh = dlg.m_dblWh;
m_dblWl = dlg.m_dblWl;
m_nFilterOrder = dlg.m_nFilterOrder;
m_nFilterType = dlg.m_nFilterType;
m_nWindowType = dlg.m_nWindowType;
// OnPaint();
// this->PostMessage(WM_PAINT);
// Invalidate(FALSE);
Invalidate(TRUE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -