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

📄 fftview.cpp

📁 FFT算法进行FFT 、IFFT、功率谱计算
💻 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
	// 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)
//	ON_MESSAGE(WM_MSG_WAVE, OnMsgWave)
END_MESSAGE_MAP()

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

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

}

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);
	//添加背景图
/*	HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, _T("1.bmp"), IMAGE_BITMAP,
                    0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
    m_bitmap.Attach(hBitmap);  
	BITMAP bm;
	//m_bitmap.GetBitmap(&bm);	
    CDC dcImage;
	if (dcImage.CreateCompatibleDC(pDC))
	{CBitmap* pOldBitmap = dcImage.SelectObject(&m_bitmap);
	pDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &dcImage, 0, 0, SRCCOPY);
	dcImage.SelectObject(pOldBitmap);
		DeleteObject(m_bitmap.Detach());
	}*/

	CString str;
	int i,maxx;
	CRect rc;GetClientRect(rc);
	if(rc.Height()<=100||rc.Width()<=100)return;
	CPoint pcenter1(rc.left,rc.top+rc.Height()/2-2),pcenter2(rc.right,rc.top+rc.Height()/2-2);
	CPen pWhite(PS_SOLID,1,RGB(255,255,255));
	CPen pGray(PS_SOLID,1,RGB(192,192,192));
	CPen pDark(PS_SOLID,1,RGB(96,96,96));
	CPen pBlue(PS_SOLID,2,RGB(0,0,255));
	CPen pGrid(PS_DOT,1,RGB(0,96,0));
//写标题
	pDC->SetTextColor(RGB(0,0,128));
    pDC->TextOut(rc.left+rc.Width()/2-40,rc.top,"频域波形");
//画窗格
	CRect rfreq;
	rfreq.top =rc.top +30;rfreq.bottom =rc.bottom -30;
	rfreq.left =rc.left+10;rfreq.right =rc.right-10 ;
    //pDC->TextOut(rfreq.left-5,rfreq.bottom+5,"0");
	if(pDoc->m_bPower) maxx=pDoc->slice/2;
	else maxx=pDoc->M;
	//str.Format("%d",maxx);
	//pDC->TextOut(rfreq.right-30,rfreq.bottom+5,str);//M

    pDC->SelectObject(&pGrid);
	int wnum,hnum;
	wnum=rfreq.Width()/40;
	hnum=rfreq.Height()/40;
	for(i=0;i<=wnum;i++)//画竖线
	{pDC->MoveTo(rfreq.left+i*rfreq.Width()/wnum,rfreq.top);
     pDC->LineTo(rfreq.left+i*rfreq.Width()/wnum,rfreq.bottom);
	 str.Format("%d",maxx*i/wnum);
	 pDC->TextOut(rfreq.left+i*rfreq.Width()/wnum-10,rfreq.bottom+5,str);

	}
	for(i=0;i<=hnum;i++)//画横线
	{pDC->MoveTo(rfreq.left,rfreq.top+i*rfreq.Height()/hnum);
	 pDC->LineTo(rfreq.right,rfreq.top+i*rfreq.Height()/hnum);
	}
//频域波形
	pDC->SelectObject(&pBlue);
	double ys,xs;
	int signa=0,signb=0,y0;
	str.Format("%e",pDoc->fym);
	pDC->TextOut(rfreq.left,rfreq.top-20,str);//ym1
	if(pDoc->m_bPower){
			for(i=0;i<pDoc->slice/2;i++)  {
		if (pDoc->mag[i]>fabs(pDoc->fym/20)) signa=1;
		if (pDoc->mag[i]<-1*fabs(pDoc->fym/20)) signb=1;
		}
		if ((signa==1)&&(signb==1)) ys=(double)(rfreq.Height()>>1)/pDoc->fym;
		else ys=(double)(rfreq.Height()/pDoc->fym);
		y0=rfreq.top+rfreq.Height()/2;
    	xs=(double)(rfreq.Width())/(pDoc->slice/2);
		 if((signa==1)&&(signb==0)) y0=rfreq.bottom;
         else if((signb==1)&&(signa==0)) y0=rfreq.top;

	for(i=0;i<(pDoc->slice/2)-1;i++)
	{pDC->MoveTo(xs*i+rfreq.left,y0-pDoc->mag[i]*ys);
	pDC->LineTo(xs*(i+1)+rfreq.left,y0-pDoc->mag[i+1]*ys);}
 	}//mag[slice/2]
	else{
    xs=(double)(rfreq.Width())/pDoc->N;
	ys=(double)(rfreq.Height())/pDoc->fym;
	for(i=0;i<(pDoc->M)-1;i++)
	{pDC->MoveTo(xs*i+rfreq.left,rfreq.bottom-pDoc->famp[i]*ys);
	 pDC->LineTo(xs*(i+1)+rfreq.left ,rfreq.bottom -pDoc->famp[i+1]*ys);
	}}
}

/////////////////////////////////////////////////////////////////////////////
// CFFTView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// 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::OnInitialUpdate() 
{   CFFTDoc* pDoc = GetDocument();	ASSERT_VALID(pDoc);
	CView::OnInitialUpdate();
//3d风格的窗口(下沉),发送窗口改变大小的消息	
	ModifyStyleEx(0,WS_EX_CLIENTEDGE,SWP_FRAMECHANGED);	
	pDoc->SinWave();
}

⌨️ 快捷键说明

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