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

📄 oscillographview.cpp

📁 可以实现FIR滤波器任意阶数和窗函数下的设计。并且有可以在VC下显示幅频响应曲线和滤波效果。
💻 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 + -