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

📄 waveanalysisview.cpp

📁 32位嵌入式系统实现
💻 CPP
字号:
// WaveAnalysisView.cpp : implementation of the CWaveAnalysisView class
//

#include "stdafx.h"
#include "WaveAnalysis.h"
#include "math.h"
#include "timefft.h"
#include "WaveAnalysisDoc.h"
#include "WaveAnalysisView.h"

#include <vector>

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


/////////////////////////////////////////////////////////////////////////////
// CWaveAnalysisView

IMPLEMENT_DYNCREATE(CWaveAnalysisView, CView)

BEGIN_MESSAGE_MAP(CWaveAnalysisView, CView)
	//{{AFX_MSG_MAP(CWaveAnalysisView)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CWaveAnalysisView construction/destruction

CWaveAnalysisView::CWaveAnalysisView()
{
	// TODO: add construction code here

}

CWaveAnalysisView::~CWaveAnalysisView()
{
}

BOOL CWaveAnalysisView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CWaveAnalysisView drawing





void CWaveAnalysisView::OnDraw(CDC* pDC)
{
	int i;

	//定义并获取窗体的高度和宽度
	int FormHeight=650,FormWidth=N;
	int picHeight=250,picWidth=N;
	int pic1x,pic1y,pic2x,pic2y;
	int n;
	float y1max=1,y2max=1;
    //波形时域X轴和Y轴的起点和终点
	int n1=0,n1n=N;		//起始点 终止点
	int x1=n1n-n1;			//长度
    //波形频域X轴和Y轴的起点和终点
	int n2=0,n2n=N;
    int x2=n2n-n2;
	//定义测试数据缓冲区
	float y1[N];
	float y2[N];

	//填充数据
	for (i=0;i<N;i++)
	{
		y1[i]=sin(2*3.14159*i/8)+sin(2*3.14159*i/64)+2;	
	}

	//计算
	//定义FFT计算缓冲区
	COMPLEX FFTData[N];

	for (i=0;i<N;i++)
	{
		FFTData[i].real=y1[i];
		FFTData[i].imag=0;
	}
	fft(FFTData);
	for (i=0;i<N;i++)
	{
		y2[i]=FFTData[i].real*FFTData[i].real+FFTData[i].imag*FFTData[i].imag;
	}
	y2[0]=0;				//取消直流分量,以便于绘图





	//寻找最大值
	for (int h=0;h<N;h++)
	{
	    if(y1[h]>y1max)
			y1max=y1[h];
	}

	for (h=0;h<N;h++)
	{
	    if(y2[h]>y2max)
			y2max=y2[h];
	}
	/********************************************************/
	/*						开始绘图						*/
	/********************************************************/
	//绘制底色
	pDC->SelectStockObject(LTGRAY_BRUSH);
	pDC->SelectStockObject(OEM_FIXED_FONT);
	
	pDC->Rectangle(0,0,1024,768);
	//写入标题
	CWaveAnalysisDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	COLORREF TxtColor,BKColor;
	TxtColor=RGB(0,0,0);
	BKColor=RGB(194,194,194);
	pDC->SetTextColor(TxtColor);
	pDC->SetBkColor(BKColor);
	
	pDC->TextOut(FormWidth/2-100,1,"波形时频域分析");
	pDC->TextOut(1,20,"时域波形");
	pDC->TextOut(1,FormHeight/2+40,"频域波形");

	//定义画笔
	CPen * poldPen;
    CPen SolidPen(PS_SOLID,2,RGB(0,0,0));		//实心画笔
    CPen SolidPenY(PS_SOLID,1,RGB(0,0,255));	//实心画笔
    CPen SolidPen1(PS_SOLID,1,RGB(255,0,128));	//实心画笔
	CPen SolidPen2(PS_SOLID,1,RGB(0,255,0));	//实心画笔



	//绘制时域区域
	pDC->SelectStockObject(DKGRAY_BRUSH);
	pDC->SelectObject(&SolidPen);				//将画笔装入pDC
	pic1x=10;
	pic1y=50;
	pDC->Rectangle(pic1x,pic1y,pic1x+picWidth,pic1y+picHeight);
	pDC->SelectObject(&SolidPenY);
	for (i=pic1y+picHeight/9;i<pic1y+picHeight;i+=30)
	{
		pDC->MoveTo(pic1x,i);
	    pDC->LineTo(pic1x+picWidth,i);
	}
	for (i=pic1x+picWidth/20;i<pic1x+picWidth;i+=50)
	{
		pDC->MoveTo(i,pic1y);
	    pDC->LineTo(i,pic1y+picHeight);
	}

	//绘制时域各个点
	pDC->SelectObject(&SolidPen1);
	for (n=n1;n<x1-1;n++)
	{
		pDC->MoveTo(pic1x+n*picWidth/x1,pic1y+(picHeight-y1[n]*picHeight/y1max));
		pDC->LineTo(pic1x+(n+1)*picWidth/x1,pic1y+(picHeight-y1[n+1]*picHeight/y1max));
	}
	//绘制频域区域
	pDC->SelectObject(&SolidPen);
	pic2x=10;
	pic2y=60+FormHeight/2;
	pDC->Rectangle(pic2x,pic2y,pic2x+picWidth,pic2y+picHeight);
	pDC->SelectObject(&SolidPenY);
	for (i=pic2y+picHeight/9;i<pic2y+picHeight;i+=30)
	{
		pDC->MoveTo(pic2x,i);
		pDC->LineTo(pic2x+picWidth,i);
	}
	for (i=pic2x+picWidth/20;i<pic2x+picWidth;i+=50)
	{
		pDC->MoveTo(i,pic2y);
		pDC->LineTo(i,pic2y+picHeight);
	}
	//绘制频域各个点
	pDC->SelectObject(&SolidPen2);
	for (n=n2;n<x2-1;n++)
	{
		pDC->MoveTo(pic2x+n*picWidth/x2,pic2y+(picHeight-y2[n]*picHeight/y2max));
		pDC->LineTo(pic2x+(n+1)*picWidth/x2,pic2y+(picHeight-y2[n+1]*picHeight/y2max));
	}



}




/////////////////////////////////////////////////////////////////////////////
// CWaveAnalysisView printing

BOOL CWaveAnalysisView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CWaveAnalysisView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CWaveAnalysisView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CWaveAnalysisView diagnostics

#ifdef _DEBUG
void CWaveAnalysisView::AssertValid() const
{
	CView::AssertValid();
}

void CWaveAnalysisView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CWaveAnalysisDoc* CWaveAnalysisView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWaveAnalysisDoc)));
	return (CWaveAnalysisDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CWaveAnalysisView message handlers


⌨️ 快捷键说明

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