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

📄 wave.cpp

📁 可以实现FIR滤波器任意阶数和窗函数下的设计。并且有可以在VC下显示幅频响应曲线和滤波效果。
💻 CPP
字号:
// Wave.cpp: implementation of the CWave class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Oscillograph.h"
#include "Wave.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CWave::CWave()
{
	m_nLeft = 0;		//示波器左边界
	m_nTop = 0;			//示波器上边界
	m_nWidth = 0;		//示波器宽度
	m_nHeight = 0;		//示波器高度
	m_dblXMax = 1;	//X轴最大值
	m_dblXMin = 0;	//X轴最小值
	m_dblYMax = 1;	//Y轴最大值
	m_dblYMin = 0;	//Y轴最小值
	m_pWaveBuffer = NULL;	//将要显示波形的数据缓存
	m_nBufferSize = 0;		//将要显示波形的数据缓存的大小
	
}

CWave::~CWave()
{
/*	if(m_pWaveBuffer)
	{
		delete [] m_pWaveBuffer;
	}
*/
}

//设置示波器的大小
void CWave::SetSize(int x, int y, int nWidth, int nHeight)
{
	m_nLeft = x;			//示波器左边界
	m_nTop = y;				//示波器上边界
	m_nWidth = nWidth;		//示波器宽度
	m_nHeight = nHeight;	//示波器高度
}

//显示示波器界面
void CWave::ShowFigure()
{
	//绘制示波器边框
	CBrush Brush,*pOldBrush;
	Brush.CreateStockObject(BLACK_BRUSH);//选择黑色背景
	pOldBrush = pDC->SelectObject(&Brush);
	pDC->Rectangle(m_nLeft, m_nTop, m_nLeft + m_nWidth, m_nTop + m_nHeight);//画出示波器边框
	pDC->SelectObject(pOldBrush);
	Brush.DeleteObject();
	//X轴Y轴坐标
	DrawXYCoordinate();
}
//得到将要显示的波形数据缓冲区指针
void CWave::GetWave(double *pWaveBuffer, int nBufferSize)
{
	m_pWaveBuffer = pWaveBuffer;	//将要显示波形的数据缓存
	m_nBufferSize = nBufferSize;	//将要显示波形的数据缓存的大小
	m_dblXMin = 0;	//X轴最小值
	m_dblXMax = nBufferSize - 1;	//x轴最大值默认为波形点数
	m_dblYMin = m_pWaveBuffer[0];	
	m_dblYMax = m_pWaveBuffer[0];
	for(int i=0; i<m_nBufferSize; i++)
	{
		if(m_dblYMin > m_pWaveBuffer[i])
		{
			m_dblYMin = m_pWaveBuffer[i];
		}
		if(m_dblYMax < m_pWaveBuffer[i])
		{
			m_dblYMax = m_pWaveBuffer[i];
		}
	}
	m_dblXCoef = m_nWidth / (m_dblXMax - m_dblXMin);	//X轴每个单位的像素数(x轴系数) = Width/(XMax-XMin)
	m_dblYCoef = m_nHeight / (m_dblYMax - m_dblYMin);	//Y轴每个单位的像素数(Y轴系数) = Height/(YMax-YMin)
}

//得到显示示波器的设备环境
void CWave::GetDC(CDC *pDC)
{
	this->pDC = pDC;			//获得示波器的内存的设备环境
}

//显示波形
void CWave::ShowWave()
{
	//重绘X、Y轴坐标
	DrawXYCoordinate();
	//绘制曲线
	CPen Pen,*pOldPen;
	Pen.CreatePen(PS_SOLID,1,RGB(0,255,0));
	pOldPen = pDC->SelectObject(&Pen);
	int xPre,yPre,x,y;
	xPre = m_nLeft + int(m_dblXCoef*(0-m_dblXMin));
	yPre = m_nTop + int(m_dblYCoef*(m_dblYMax-m_pWaveBuffer[0]));
	for(int i=1; i<m_nBufferSize; i++)
	{
		x = m_nLeft + int(m_dblXCoef*(i-m_dblXMin));
		y = m_nTop + int(m_dblYCoef*(m_dblYMax-m_pWaveBuffer[i]));
		pDC->MoveTo(xPre, yPre);
		pDC->LineTo(x, y);
		xPre = x;
		yPre = y;
	}
	pDC->SelectObject(pOldPen);
	Pen.DeleteObject();
}

//设置示波器X轴上下限范围
void CWave::SetXLimits(double dblXMin, double dblXMax)
{
	m_dblXMin = dblXMin;	//X轴最小值
	m_dblXMax = dblXMax;	//X轴最大值
	m_dblXCoef = m_nWidth / (m_dblXMax - m_dblXMin);	//X轴每个单位的像素数(x轴系数) = Width/(XMax-XMin)
}

//设置示波器Y轴上下限范围
void CWave::SetYLimits(double dblYMin, double dblYMax)
{
	m_dblYMin = dblYMin;	//Y轴最小值
	m_dblYMax = dblYMax;	//Y轴最大值
	m_dblYCoef = m_nHeight / (m_dblYMax - m_dblYMin);	//Y轴每个单位的像素数(Y轴系数) = Height/(YMax-YMin)
}

//绘制X、Y轴坐标
void CWave::DrawXYCoordinate()
{
	//X轴Y轴坐标
	CString str;
	str.Format("%.3f",m_dblYMax);
	pDC->TextOut(m_nLeft,m_nTop,str);
	str.Format("%.3f",m_dblYMin);
	pDC->TextOut(m_nLeft,m_nTop+m_nHeight-20,str);
	str.Format("%.3f",m_dblXMin);
	pDC->TextOut(m_nLeft,m_nTop+m_nHeight,str);
	str.Format("%.3f",m_dblXMax);
	pDC->TextOut(m_nLeft+m_nWidth-30,m_nTop+m_nHeight,str);
}

⌨️ 快捷键说明

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