?? testfilterdlg.cpp
字號:
// TestFilterDlg.cpp : implementation file
//
#include "stdafx.h"
#include "TestFilter.h"
#include "TestFilterDlg.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define N 1024
void FFT(float xreal [], float ximag [], int n);
void IFFT (float xreal [], float ximag [], int n);
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestFilterDlg dialog
CTestFilterDlg::CTestFilterDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestFilterDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestFilterDlg)
m_fFreqLow = 0.0f;
m_fFreqHigh = 0.0f;
m_fScope = 0.5f;
m_bFilter = FALSE;
m_fDT = 0.0f;
m_fFsamp = 3976.9f;
m_fPower = 0.0f;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTestFilterDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestFilterDlg)
DDX_Text(pDX, IDC_EDIT_LOW, m_fFreqLow);
DDX_Text(pDX, IDC_EDIT_HIGH, m_fFreqHigh);
DDX_Text(pDX, IDC_EDIT_SCOPE, m_fScope);
DDX_Check(pDX, IDC_CHECK_FILTER, m_bFilter);
DDX_Text(pDX, IDC_EDIT_DT, m_fDT);
DDX_Text(pDX, IDC_EDIT_FSAMP, m_fFsamp);
DDX_Text(pDX, IDC_EDIT_FPOWER, m_fPower);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTestFilterDlg, CDialog)
//{{AFX_MSG_MAP(CTestFilterDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_DRAWWAVE, OnBtnDrawwave)
ON_BN_CLICKED(IDC_BTN_GENWAVE, OnBtnGenwave)
ON_BN_CLICKED(IDC_BTN_FFT, OnBtnFft)
ON_BN_CLICKED(IDC_BTN_READDATA, OnBtnReaddata)
ON_BN_CLICKED(IDC_BTN_JIFEN, OnBtnJifen)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestFilterDlg message handlers
BOOL CTestFilterDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CTestFilterDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CTestFilterDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//// 在這里做圖形繪制
CRect waveRect;
GetDlgItem(IDC_STATIC_WAVE)->GetWindowRect(&waveRect);
ScreenToClient(&waveRect);
//繪制頻譜
CRect FreqRect;
GetDlgItem(IDC_STATIC_FREQ)->GetWindowRect(&FreqRect);
ScreenToClient(&FreqRect);
UpdateData(TRUE);
DrawWaveData( waveRect,FreqRect, fAccWave, fFreqData,1024, m_fScope, m_fScope);
// DrawWaveData( waveRect,FreqRect, fAccWave, fVocWave,1024, m_fScope, m_fScope);
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CTestFilterDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CTestFilterDlg::OnBtnDrawwave()
{
// TODO: Add your control notification handler code here
// 計算 電壓有效值
float fPower;
GetWavePower(fAccWave,1024, &fPower);
m_fPower = fPower;
UpdateData(FALSE);
//繪制波形
CRect waveRect;
GetDlgItem( IDC_STATIC_WAVE )->GetWindowRect( &waveRect );
ScreenToClient( &waveRect );
InvalidateRect(waveRect,TRUE);
// 繪制頻譜
CRect FreqRect;
GetDlgItem( IDC_STATIC_FREQ )->GetWindowRect( &FreqRect );
ScreenToClient( &FreqRect );
InvalidateRect(FreqRect,TRUE);
}
// 繪制波形數據
void CTestFilterDlg::DrawWaveData( CRect waveRect, CRect FreqRect,FLOAT Wave[],FLOAT Freq[] , INT ptNum, FLOAT fWaveMax,FLOAT fFreqMax)
{
CPaintDC dc(this);
CPen GrayPen;
CPen RedPen;
CPen * pOldPen;
INT nIndex;
FLOAT fX0,fY0,fW,fH;
FLOAT fTemp;
INT nTemp;
INT i;
GrayPen.CreatePen(PS_SOLID,1,RGB(128,128,128));
RedPen.CreatePen(PS_SOLID,1,RGB(255,0,0));
/////////////////////繪制波形部分////////////////////////////////
pOldPen = dc.SelectObject(&GrayPen);
dc.Rectangle(waveRect);
dc.FillSolidRect(waveRect, RGB(50,50,50));
fX0 = (FLOAT)waveRect.left;
fY0 = (FLOAT)(waveRect.top+waveRect.bottom) / 2.0f;
fW = (FLOAT)waveRect.Width();
fH = (FLOAT)waveRect.Height() / 2.0f;
// 垂直線
for (nIndex=0;nIndex<10;nIndex++)
{
fTemp = fX0 + fW * nIndex / 10.0f;
nTemp = (INT)fTemp;
dc.MoveTo(nTemp, waveRect.top);
dc.LineTo(nTemp, waveRect.bottom) ;
}
// 水平線
for (nIndex=0;nIndex<4 ;nIndex++)
{
fTemp = fH * 2.0f * nIndex / 4.0f;
nTemp = waveRect.top + (INT)fTemp;
dc.MoveTo(waveRect.left, nTemp);
dc.LineTo(waveRect.right, nTemp);
}
// 繪制曲線
pOldPen = dc.SelectObject(&RedPen);
fTemp = SetWaveDataInScope(Wave[0], fWaveMax);
dc.MoveTo((INT)(fX0+fW*0/ptNum), (INT)(fY0-fTemp/fWaveMax*fH));
for(i=1;i<=ptNum-1 ;i++)
{
// 限制波形范圍
fTemp = SetWaveDataInScope(Wave[i],fWaveMax);
dc.LineTo((INT)(fX0+fW*i/ptNum), (INT)(fY0-fTemp/fWaveMax*fH));
}
dc.SelectObject(pOldPen);
/////////////繪制頻譜部分////////////////////////////////////////////
pOldPen = dc.SelectObject(&GrayPen);
dc.Rectangle(FreqRect);
dc.FillSolidRect(FreqRect, RGB(50,50,50));
fX0 = (FLOAT)FreqRect.left;
fY0 = (FLOAT)FreqRect.bottom - FreqRect.Height()/2 ;
fW = (FLOAT)FreqRect.Width();
fH = (FLOAT)FreqRect.Height()/2.0;
// 垂直線
for (nIndex=0;nIndex<10;nIndex++)
{
fTemp = fX0 + fW * nIndex / 10.0f;
nTemp = (INT)fTemp;
dc.MoveTo(nTemp, FreqRect.top);
dc.LineTo(nTemp, FreqRect.bottom) ;
}
// 水平線
for (nIndex=0;nIndex<4 ;nIndex++)
{
fTemp = fH *2.0* nIndex / 4.0f;
nTemp = FreqRect.top + (INT)fTemp;
dc.MoveTo(FreqRect.left, nTemp);
dc.LineTo(FreqRect.right, nTemp);
}
// 繪制曲線
pOldPen = dc.SelectObject(&RedPen);
fTemp = SetFreqDataInScope(Freq[0 ],fFreqMax);
dc.MoveTo((INT)(fX0 + fW * 0 / ptNum), (INT)(fY0 - fTemp / fFreqMax * fH));
for(i=1;i<=ptNum-1 ;i++)
{
// 限制范圍
fTemp = SetFreqDataInScope(Freq[i], fFreqMax);
//繪制曲線
dc.LineTo((INT)(fX0+ fW*i/ptNum), (INT)(fY0- fTemp /fFreqMax*fH));
}
//////////////////
dc.SelectObject(pOldPen);
RedPen.DeleteObject();
GrayPen.DeleteObject();
}
// 設置在波形的范圍內
float CTestFilterDlg::SetWaveDataInScope(FLOAT fValue, FLOAT fMax)
{
FLOAT fTemp = 0.0f;
if ((fValue<fMax)&&(fValue>(-1.0f)*fMax ))
{
fTemp= fValue;
}
else if(fValue>=fMax)
{
fTemp=fMax;
}
else if(fValue<=(-1.0f)*fMax)
{
fTemp=fMax*(-1.0f);
}
return fTemp;
}
void CTestFilterDlg::OnBtnGenwave()
{
// TODO: Add your control notification handler code here
int i;
float fA1,fA2,fA3,fA4,fA5;
fA1=1.20;
fA2=0.30;
fA3=0.4;
fA4=0.2;
fA5=0.6;
for(i=0;i<1024;i++)
{
fAccWave[i]=fA1* cos( 2*PI *i/128 )+
fA2* cos(2*PI *i/128 * 2 )
+fA3*cos(2*PI *i/128 * 3 )
+fA4*cos(2*PI *i/128 * 4 )
+fA5*cos(2*PI *i/128 * 5 );
// +rand()/(256*64); //// 白噪聲不能這么加上去。
}
}
/*
// 繪制頻譜數據
VOID CTestFilterDlg::DrawFreqData( CRect FreqRect, FLOAT Freq[], INT ptNum, FLOAT fFreqMax)
{
CPaintDC dc(this);
CPen GrayPen;
CPen RedPen;
CPen * pOldPen;
INT nIndex;
FLOAT fX0,fY0,fW,fH;
FLOAT fTemp;
INT nTemp;
INT i;
GrayPen.CreatePen(PS_SOLID, 1, RGB(128,128,128));
RedPen.CreatePen(PS_SOLID, 1, RGB(255,0,0));
pOldPen = dc.SelectObject(&GrayPen);
dc.Rectangle(FreqRect);
dc.FillSolidRect(FreqRect, RGB(50,50,50));
fX0 = (FLOAT)FreqRect.left;
fY0 = (FLOAT)FreqRect.bottom;
fW = (FLOAT)FreqRect.Width();
fH = (FLOAT)FreqRect.Height();
// 垂直線
for (nIndex=0;nIndex<10;nIndex++)
{
fTemp = fX0 + fW * nIndex / 10.0f;
nTemp = (INT)fTemp;
dc.MoveTo(nTemp, FreqRect.top);
dc.LineTo(nTemp, FreqRect.bottom) ;
}
// 水平線
for (nIndex=0;nIndex<4 ;nIndex++)
{
fTemp = fH * nIndex / 4.0f;
nTemp = FreqRect.top + (INT)fTemp;
dc.MoveTo(FreqRect.left, nTemp);
dc.LineTo(FreqRect.right, nTemp);
}
// 繪制曲線
pOldPen = dc.SelectObject(&RedPen);
fTemp = SetFreqDataInScope(Freq[0 ],fFreqMax);
dc.MoveTo((INT)(fX0 + fW * 0 / ptNum), (INT)(fY0 - fTemp / fFreqMax * fH));
for(i=1;i<=ptNum-1 ;i++)
{
// 限制范圍
fTemp = SetFreqDataInScope(Freq[i], fFreqMax);
//繪制曲線
dc.LineTo((INT)(fX0+ fW*i/ptNum), (INT)(fY0- fTemp /fFreqMax*fH));
}
//////////////////
dc.SelectObject(pOldPen);
RedPen.DeleteObject();
GrayPen.DeleteObject();
}
*/
// 設置在頻譜的范圍內
FLOAT CTestFilterDlg::SetFreqDataInScope(FLOAT fValue, FLOAT fMax)
{
FLOAT fTemp = 0.0f;
// 限制范圍
if ((fValue<fMax)&&(fValue> (-1*fMax )))
{
fTemp = fValue ;
}
else
{
fTemp =0.0f;
}
return fTemp;
}
// 應用FFT計算
VOID CTestFilterDlg::AppFFT(INT ptNum , float Wave[])
{
float pr[1024],pi[1024],fr[1024],fi[1024];
int nJieCi;
int i,nT;
nJieCi = -1; // 表示不是2的整數次冪
nT=1;
for(i=1;i<=10;i++)
{
nT=nT*2;
if (nT==ptNum)
{
nJieCi=i;
}
}
// 歸整的 冪整數
if( (nJieCi>=1)&&(nJieCi<=10) )
{
// 前期準備數據
for(i=0;i<=ptNum-1;i++)
{
pr[i]= Wave[i];
pi[i]=0.0;
}
// FFT計算
kkfft(pr,pi,ptNum, nJieCi ,fr,fi,0,1);
// 后期整理數據
// 0,1====fr 為幅值 fi為角度,按照角度表達
for(i=0;i<=ptNum-1;i++)
{
fFreqData[i]= fr[i];
}
UpdateData(FALSE);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -