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