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

📄 fftview.cpp

📁 数字信号处理的快速傅里叶变换(FFT)代码
💻 CPP
字号:
// FFTView.cpp : implementation of the CFFTView class
//

#include "stdafx.h"
#include "FFT.h"

#include "FFTDoc.h"
#include "FFTView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CFFTView

IMPLEMENT_DYNCREATE(CFFTView, CView)

BEGIN_MESSAGE_MAP(CFFTView, CView)
	//{{AFX_MSG_MAP(CFFTView)
		// 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
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFFTView construction/destruction

CFFTView::CFFTView()
{
	// TODO: add construction code here
	//各坐标系的坐标原点
	orgX=100;
	orgYxn=90;	
	orgYFAw=160;
	orgYFPw=230;
}

CFFTView::~CFFTView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CFFTView drawing

void CFFTView::OnDraw(CDC* pDC)
{
	CFFTDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	StartDraw(pDC,pDoc);
}

/////////////////////////////////////////////////////////////////////////////
// CFFTView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CFFTView message handlers
//画坐标
//双向坐标
void CFFTView::DrawCordD(CDC* pDC,const UINT orgX,const UINT orgY)
{
	CPen pen(PS_SOLID,2,RGB(0,0,0));
	CPen* pOldPen=pDC->SelectObject(&pen);
	
		//画Y轴
	pDC->MoveTo(orgX,orgY-60);
	pDC->LineTo(orgX,orgY+60);
	
	pDC->MoveTo(orgX,orgY-60);
	pDC->LineTo(orgX-5,orgY-60+5);
	pDC->MoveTo(orgX,orgY-60);
	pDC->LineTo(orgX+5,orgY-60+5);

		//画X轴
	pDC->MoveTo(orgX,orgY);
	pDC->LineTo(orgX+550,orgY);

	pDC->MoveTo(orgX+550,orgY);
	pDC->LineTo(orgX+550-5,orgY-5);
	pDC->MoveTo(orgX+550,orgY);
	pDC->LineTo(orgX+550-5,orgY+5);
	
	pDC->SelectObject(pOldPen);
}

//单向坐标
void CFFTView::DrawCordS(CDC* pDC,const UINT orgX,const UINT orgY)
{
	CPen pen(PS_SOLID,2,RGB(0,0,0));
	CPen* pOldPen=pDC->SelectObject(&pen);
	
		//画Y轴
	pDC->MoveTo(orgX,orgY-60);
	pDC->LineTo(orgX,orgY);
	
	pDC->MoveTo(orgX,orgY-60);
	pDC->LineTo(orgX-5,orgY-60+5);
	pDC->MoveTo(orgX,orgY-60);
	pDC->LineTo(orgX+5,orgY-60+5);

		//画X轴
	pDC->MoveTo(orgX,orgY);
	pDC->LineTo(orgX+550,orgY);

	pDC->MoveTo(orgX+550,orgY);
	pDC->LineTo(orgX+550-5,orgY-5);
	pDC->MoveTo(orgX+550,orgY);
	pDC->LineTo(orgX+550-5,orgY+5);
	
	pDC->SelectObject(pOldPen);
}
//画时域序列
void CFFTView::DrawXn(CDC* pDC,const double xn,const UINT n)
{
	CPen pen1(PS_SOLID,1,RGB(255,0,0)),
		 pen2(PS_SOLID,1,RGB(0,0,255));
	CPen* pOldPen=pDC->SelectObject(&pen1);

	int val;
	val=(int)(xn*40.0);
	
	if(val>0)
	{
		pDC->MoveTo(orgX+n,orgYxn-2);
		pDC->LineTo(orgX+n,orgYxn-val-2);
		
	   pDC->SelectObject(&pen2);

		pDC->MoveTo(orgX+n,orgYxn-val-2);
		pDC->LineTo(orgX+n,orgYxn-val-1);
	}
	if(val<0)
	{
		pDC->MoveTo(orgX+n,orgYxn+1);
		pDC->LineTo(orgX+n,orgYxn-val+1);

		pDC->SelectObject(&pen2);

		pDC->MoveTo(orgX+n,orgYxn-val+1);
		pDC->LineTo(orgX+n,orgYxn-val);
	}

	pDC->SelectObject(pOldPen);
}

//画相频序列
void CFFTView::DrawPw(CDC* pDC,const double Pk,const UINT k)
{
	CPen pen1(PS_SOLID,1,RGB(255,0,0)),
		 pen2(PS_SOLID,1,RGB(0,0,255));
	CPen* pOldPen=pDC->SelectObject(&pen1);

	int val;
	val=(int)(Pk*60);
	
	if(GetDocument()->m_DORF==1)
	{
		if(val>0)
		{
			pDC->MoveTo(orgX+k,orgYFPw-2);
			pDC->LineTo(orgX+k,orgYFPw-val-2);
			
			pDC->SelectObject(&pen2);

			pDC->MoveTo(orgX+k,orgYFPw-val-2);
			pDC->LineTo(orgX+k,orgYFPw-val-1);
		}
		if(val<0)
		{
			pDC->MoveTo(orgX+k,orgYFPw+1);
			pDC->LineTo(orgX+k,orgYFPw-val+1);

			pDC->SelectObject(&pen2);

			pDC->MoveTo(orgX+k,orgYFPw-val+1);
			pDC->LineTo(orgX+k,orgYFPw-val);
		}
	}
	if(GetDocument()->m_DORF==2)
	{
		if(val>0)
		{
			pDC->MoveTo(orgX+k,orgYDPw-2);
			pDC->LineTo(orgX+k,orgYDPw-val-2);

			pDC->SelectObject(&pen2);

			pDC->MoveTo(orgX+k,orgYDPw-val-2);
			pDC->LineTo(orgX+k,orgYDPw-val-1);
		}
		if(val<0)
		{
			pDC->MoveTo(orgX+k,orgYDPw+1);
			pDC->LineTo(orgX+k,orgYDPw-val+1);

			pDC->SelectObject(&pen2);

			pDC->MoveTo(orgX+k,orgYDPw-val+1);
			pDC->LineTo(orgX+k,orgYDPw-val);
		}
	}

	pDC->SelectObject(pOldPen);
}

//画幅频序列
void CFFTView::DrawAw(CDC* pDC,const double Ak,const UINT k)
{
	CPen pen1(PS_SOLID,1,RGB(255,0,0)),
		 pen2(PS_SOLID,1,RGB(0,0,255));
	CPen* pOldPen=pDC->SelectObject(&pen1);
	
	int val;
	val=(int)(Ak*60);
	
	if(GetDocument()->m_DORF==1)
	{
		if(val)
		{
			pDC->MoveTo(orgX+k,orgYFAw-2);
			pDC->LineTo(orgX+k,orgYFAw-val-2);

			pDC->SelectObject(&pen2);

			pDC->MoveTo(orgX+k,orgYFAw-val-2);
			pDC->LineTo(orgX+k,orgYFAw-val-1);
		}
	}
	else
	{
		if(val)
		{
			pDC->MoveTo(orgX+k,orgYDAw-2);
			pDC->LineTo(orgX+k,orgYDAw-val-2);

			pDC->SelectObject(&pen2);

			pDC->MoveTo(orgX+k,orgYDAw-val-2);
			pDC->LineTo(orgX+k,orgYDAw-val-1);
		}
	}

	pDC->SelectObject(pOldPen);
}

void CFFTView::StartDraw(CDC* pDC,CFFTDoc* pDoc)
{
	UINT i;
	CString sTemp,sTemp1;

	//画坐标
	DrawCordS(pDC,orgX,orgYxn);
	pDC->TextOut(orgX+5-95,orgYxn-60,"x(n)");
	pDC->TextOut(orgX-10,orgYxn-12,"0");
	pDC->TextOut(orgX+550-5,orgYxn+5,"n");

	DrawCordS(pDC,orgX,orgYFAw);
	pDC->TextOut(orgX+5-95,orgYFAw-60,"|X(k)|-FFT");
	pDC->TextOut(orgX-10,orgYFAw-12,"0");
	pDC->TextOut(orgX+550-5,orgYFAw+5,"k");

	DrawCordD(pDC,orgX,orgYFPw);  //画坐标  双向坐标
	pDC->TextOut(orgX+5-95,orgYFPw-60,"Φ(k)-FFT");
	pDC->TextOut(orgX-10,orgYFPw-12,"0");
	pDC->TextOut(orgX+550-5,orgYFPw+5,"k");

	//画时域x(n)序列
	double d=0.0;
	for(i=0;i<MAXN;i++)
	{
		if(d<fabs(pDoc->Getxn(i)))
			d=fabs(pDoc->Getxn(i));
	}
	for(i=0;i<MAXN;i++)
	{
		DrawXn(pDC,pDoc->Getxn(i)/d,i);
	}

	//画FFT频域X(k)的幅频、相频特性
	pDoc->m_DORF=1;
	pDoc->Aw();
	pDoc->Pw();
	for(i=0;i<MAXN;i++)
	{
		DrawAw(pDC,pDoc->GetAw(i),i);
		DrawPw(pDC,pDoc->GetPw(i),i);
}}

⌨️ 快捷键说明

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