📄 vtdecodeview.cpp
字号:
// VTDecodeView.cpp : implementation of the CVTDecodeView class
#include "stdafx.h"
#include "VTDecode.h"
#include "VTDecodeDoc.h"
#include "VTDecodeView.h"
#include "mmsystem.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CVTDecodeView
IMPLEMENT_DYNCREATE(CVTDecodeView, CFormView)
BEGIN_MESSAGE_MAP(CVTDecodeView, CFormView)
//{{AFX_MSG_MAP(CVTDecodeView)
ON_BN_CLICKED(IDC_AD1_BUTTON, OnAd1Button)
ON_BN_CLICKED(IDC_AD2_BUTTON, OnAd2Button)
ON_UPDATE_COMMAND_UI(ID_START, OnUpdateStart)
ON_COMMAND(ID_START, OnStart)
ON_COMMAND(ID_STOP, OnStop)
ON_MESSAGE(MM_WIM_OPEN,OnMM_WIM_OPEN)
ON_MESSAGE(MM_WIM_DATA,OnMM_WIM_DATA)
ON_MESSAGE(MM_WIM_CLOSE,OnMM_WIM_CLOSE)
ON_BN_CLICKED(IDC_SAVE, OnSave)
ON_WM_DESTROY()
ON_UPDATE_COMMAND_UI(ID_STOP, OnUpdateStop)
ON_BN_CLICKED(IDC_SAVE1, OnSave1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CVTDecodeView construction/destruction
CVTDecodeView::CVTDecodeView()
: CFormView(CVTDecodeView::IDD)
{
//{{AFX_DATA_INIT(CVTDecodeView)
m_strText = _T("ok!!");
m_strRawData = _T("");
//}}AFX_DATA_INIT
// TODO: add construction code here
//UpdateData(false);
m_bStart=true;
m_bStop=false;
m_bAd1=false;
m_bAd2=false;
m_bFilterInitManual=false;
waveform.wFormatTag=WAVE_FORMAT_PCM;
waveform.nChannels=1;
waveform.nSamplesPerSec=9600;
waveform.nAvgBytesPerSec=19200;
waveform.nBlockAlign=2;
waveform.wBitsPerSample=16;
waveform.cbSize=0;
}
CVTDecodeView::~CVTDecodeView()
{
wavedata=NULL;
}
void CVTDecodeView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CVTDecodeView)
DDX_Control(pDX, IDC_TEXT, m_ctlEdit);
DDX_Control(pDX, IDC_RADIO_5270, m_ctlButton5270);
DDX_Text(pDX, IDC_TEXT, m_strText);
DDX_Text(pDX, IDC_SAVE_RAWDATA, m_strRawData);
//}}AFX_DATA_MAP
}
BOOL CVTDecodeView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CFormView::PreCreateWindow(cs);
}
void CVTDecodeView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
}
/////////////////////////////////////////////////////////////////////////////
// CVTDecodeView diagnostics
#ifdef _DEBUG
void CVTDecodeView::AssertValid() const
{
CFormView::AssertValid();
}
void CVTDecodeView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CVTDecodeDoc* CVTDecodeView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CVTDecodeDoc)));
return (CVTDecodeDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CVTDecodeView message handlers
void CVTDecodeView::OnDraw(CDC* pDC)
{
// TODO: Add your specialized code here and/or call the base class
//m_ctlButton5270.SetCheck(1);
}
void CVTDecodeView::OnAd1Button()
{
// TODO: Add your control notification handler code here
ad1Dlg.DoModal();
m_bAd1=true;
}
void CVTDecodeView::OnAd2Button()
{
// TODO: Add your control notification handler code here
ad2Dlg.DoModal();
m_bAd2=true;
}
void CVTDecodeView::OnUpdateStart(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bStart);
}
inline void CVTDecodeView::InsertChar(CString ch)
{
int Len=m_ctlEdit.GetWindowTextLength();
m_ctlEdit.GetFocus();
m_ctlEdit.SetSel(Len,Len);
m_ctlEdit.ReplaceSel(ch);
}
void CVTDecodeView::OnStart()
{
csps.Filter.BandpassFilter0Init(680.0,2080.0,9600.0);
//初始化带通滤波器
if((m_bAd1)&&(m_ctlButton5270.GetCheck())) //5270KHz
{
csps.Filter.BandpassFilter1Init(double(ad1Dlg.m_iAd1Dnfre)-150.0,double(ad1Dlg.m_iAd1Dnfre)+350.0,9600.0);
csps.Filter.BandpassFilter2Init(double(ad1Dlg.m_iAd1Upfre)-150.0,double(ad1Dlg.m_iAd1Upfre)+350.0,9600.0);
m_bAd1=false;
m_bFilterInitManual=true;
}
if((m_bAd2)&&(!m_ctlButton5270.GetCheck())) //9000KHz
{
csps.Filter.BandpassFilter1Init(double(ad2Dlg.m_iAd2Dnfre)-150.0,double(ad2Dlg.m_iAd2Dnfre)+350.0,9600.0);
csps.Filter.BandpassFilter2Init(double(ad2Dlg.m_iAd2Upfre)-150.0,double(ad2Dlg.m_iAd2Upfre)+350.0,9600.0);
m_bAd2=false;
m_bFilterInitManual=true;
}
strcpy(m_strFileName,"d:\\2fsk\\报文\\");
m_Time = CTime::GetCurrentTime();
strTemp = m_Time.Format( "%Y-%m-%d %H.%M.%S" );
strcat(m_strFileName,strTemp);
strcat(m_strFileName,".txt");
if( !m_File.Open( m_strFileName, CFile::modeCreate | CFile::modeWrite, &e ) )
{
#ifdef _DEBUG
afxDump << "File could not be opened " << e.m_cause << "\n";
#endif
}
GetDlgItem(IDC_SAVE_FILE)->SetWindowText(m_strFileName);
strcpy(m_strFileName1,"d:\\2fsk\\原始数据\\");
m_Time = CTime::GetCurrentTime();
strTemp = m_Time.Format( "%Y-%m-%d %H.%M.%S" );
strcat(m_strFileName1,strTemp);
strcat(m_strFileName1,".dat");
if( !m_File1.Open( m_strFileName1, CFile::modeCreate | CFile::modeWrite, &e) )
{
#ifdef _DEBUG
afxDump << "File could not be opened " << e.m_cause << "\n";
#endif
}
GetDlgItem(IDC_SAVE_RAWDATA)->SetWindowText(m_strFileName1);
//初始化保存文件
///////////////////////////////////////////////////////////////////////////////////////////////////
hData1=GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,MSIZE);
hData2=GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,MSIZE);
hDataBuff=GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,MSIZE);
if((!hData1)|(!hData2)|(!hDataBuff))
{
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox("Out of memory!");
exit(0);
}
pBuffer1=(PBYTE)GlobalLock(hData1);
pBuffer2=(PBYTE)GlobalLock(hData2);
pDataBuff=(PBYTE)GlobalLock(hDataBuff);
if((!pBuffer1)|(!pBuffer2)|(!pDataBuff))
{
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox("Failed to lock memory for data chunk!");
GlobalFree(hData1);
GlobalFree(hData2);
GlobalFree(hDataBuff);
exit(0);
}
//为波形输入数据块分配内存
//////////////////////////////////////////////////////////////////////////////////////////////////
pWaveHdr1=new WAVEHDR;
pWaveHdr2=new WAVEHDR;
if (waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW))
{
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox("Audio can not be open!");
exit(0);
}
//打开波形录音设备
//////////////////////////////////////////////////////////////////////////////////////////////////
pWaveHdr1->lpData=(LPTSTR)pBuffer1;
pWaveHdr1->dwBufferLength=MSIZE;
pWaveHdr1->dwBytesRecorded=0;
pWaveHdr1->dwUser=0;
pWaveHdr1->dwFlags=0;
pWaveHdr1->dwLoops=1;
pWaveHdr1->lpNext=NULL;
pWaveHdr1->reserved=0;
waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
pWaveHdr2->lpData=(LPTSTR)pBuffer2;
pWaveHdr2->dwBufferLength=MSIZE;
pWaveHdr2->dwBytesRecorded=0;
pWaveHdr2->dwUser=0;
pWaveHdr2->dwFlags=0;
pWaveHdr2->dwLoops=1;
pWaveHdr2->lpNext=NULL;
pWaveHdr2->reserved=0;
waveInPrepareHeader(hWaveIn,pWaveHdr2,sizeof(WAVEHDR));
//为波形录音设备驱动程序准备两个音响数据块
//////////////////////////////////////////////////////////////////////////////////////////////////
waveInAddBuffer (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ;
waveInAddBuffer (hWaveIn, pWaveHdr2, sizeof (WAVEHDR)) ;
//将两个音响数据块送给波形录音设备驱动程序
//////////////////////////////////////////////////////////////////////////////////////////////////
waveInStart (hWaveIn) ;
//开始录音
}
void CVTDecodeView::OnStop()
{
m_bStart=true;
m_bStop=true;
waveInReset(hWaveIn);
waveInClose(hWaveIn);
}
void CVTDecodeView::OnMM_WIM_OPEN(UINT wParam,LONG lParam)
{
m_bStart=false;
return;
}
void CVTDecodeView::OnMM_WIM_DATA(UINT wParam,LONG lParam)
{
if (m_bStop)
{
waveInReset(hWaveIn);
waveInClose(hWaveIn);
return;
}
CopyMemory (pDataBuff, ((PWAVEHDR) lParam)->lpData,((PWAVEHDR) lParam)->dwBytesRecorded) ;
wavedata=(short *)pDataBuff;
m_nCount32=0;
m_bCon=true;
////////////////////////////////////////////////////////////////////////////////////////////////
//++++解调第一步:连续32次读取32*2 bytes的数据做频率分析,判断是否存在导频信号++++//
while(!csps.bSig_index)
{
if(((PWAVEHDR) lParam)->dwBytesRecorded==2048)
{
for(i=0;i<32;i++)
{
for(j=0;j<32;j++)
{
csps.dFirDataIn[j]=double(wavedata[i*32+j]);
csps.dFirDataOut[j]=0;
}
csps.Filter.BandpassFilter0(csps.dFirDataIn,csps.dFirDataOut,32);
for(k=0;k<514;k++)
{
if(k<32)
csps.dFftDataIn[k]=csps.dFirDataOut[k];
else
csps.dFftDataIn[k]=0;
}
csps.Index_frequency[i]=csps.RFft_512(csps.dFftDataIn,9600.0);
}
//求得导频的平均值,假定其不能小于850赫兹,排除没有任何信号的情况
csps.dIndexfre=nspdMean(csps.Index_frequency,32); //++++++注意++++++//
if(csps.dIndexfre>850.0)
{
if ((m_bFilterInitManual)&&(m_ctlButton5270.GetCheck()))
{
if (csps.dIndexfre>1450.0)
{
csps.dIndexfre=double(ad1Dlg.m_iAd1Upfre);
csps.bSig_index=csps.IndexConclude1(csps.Index_frequency,csps.dIndexfre,32);
}
else
{
csps.dIndexfre=double(ad1Dlg.m_iAd1Dnfre);
csps.bSig_index=csps.IndexConclude1(csps.Index_frequency,csps.dIndexfre,32);
}
}
else if ((m_bFilterInitManual)&&(!m_ctlButton5270.GetCheck()))
{
if (csps.dIndexfre>1450.0)
{
csps.dIndexfre=double(ad2Dlg.m_iAd2Upfre);
csps.bSig_index=csps.IndexConclude1(csps.Index_frequency,csps.dIndexfre,32);
}
else
{
csps.dIndexfre=double(ad2Dlg.m_iAd2Dnfre);
csps.bSig_index=csps.IndexConclude1(csps.Index_frequency,csps.dIndexfre,32);
}
}
else
csps.bSig_index=csps.IndexConclude(csps.Index_frequency,32);
}
if(csps.bSig_index) //找到了导频信号,sig_index=true;
{
//初始化带通滤波器
if(m_bFilterInitManual==false)
{
csps.Filter.BandpassFilter1Init(csps.dIndexfre-150.0,csps.dIndexfre+350.0,9600.0);
}
if(csps.dIndexfre>1400.0)
iFilterChoose=2;
else
iFilterChoose=1;
csps.bMess_index=false;
csps.bAdjust_index=false;
csps.nCount=0;
m_nAdjust=0;
m_nCount3=3;
csps.nParthnum++;
if(csps.nParthnum==2)
{
csps.nParthnum=0;
}
}
waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
return;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
//++++++++调整滤波器++++++++//
while(m_nCount3)
{
for(i=0;i<32;i++)
{
for(j=0;j<32;j++)
{
csps.snTemp[j]=wavedata[i*32+j];
csps.dFirDataIn[j]=double(csps.snTemp[j]);
csps.dFirDataOut[j]=0;
}
if(m_bFilterInitManual)
{
if(iFilterChoose==1)
csps.Filter.BandpassFilter1(csps.dFirDataIn,csps.dFirDataOut,32);
if(iFilterChoose==2)
csps.Filter.BandpassFilter2(csps.dFirDataIn,csps.dFirDataOut,32);
}
else
csps.Filter.BandpassFilter1(csps.dFirDataIn,csps.dFirDataOut,32);
}
m_nCount3--;
waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
return;
}
//////////////////////////////////////////////////////////////////////////////////////////
//++++解调第二步:从导频到信息,信号的频率有跳变,寻找这种变化++++//
while(!csps.bMess_index)
{
for(j=0;j<32;j++)
{
csps.snTemp[j]=wavedata[m_nCount32*32+j];
}
m_nCount32++;
if(m_nCount32==32)
{
m_nCount32=0;
waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
return ;
}
//数据输入滤波器
for(k=0;k<32;k++)
{
csps.dFirDataIn[k]=double(csps.snTemp[k]);
csps.dFirDataOut[k]=0;
}
if(m_bFilterInitManual)
{
if(iFilterChoose==1)
csps.Filter.BandpassFilter1(csps.dFirDataIn,csps.dFirDataOut,32);
if(iFilterChoose==2)
csps.Filter.BandpassFilter2(csps.dFirDataIn,csps.dFirDataOut,32);
}
else
csps.Filter.BandpassFilter1(csps.dFirDataIn,csps.dFirDataOut,32);
for(k=0;k<514;k++)
{
if(k<32)
{
csps.dTempFftData[k]=csps.dFirDataOut[k];
csps.dTemp_b[k]=csps.dTempFftData[k];
csps.dTemp_a[k+32]=csps.dTemp_b[k];
}
else
csps.dTempFftData[k]=0;
}
csps.dTempfre2=csps.RFft_512(csps.dTempFftData,9600.0);
if((csps.dTempfre2-csps.dIndexfre)>80.0) //频率变化至少要大于80赫兹,才判断有信息开始传输
{
csps.bMess_index=true;
m_bVan=true;
for(m_nAdjust=0;(!csps.bAdjust_index)&&(m_nAdjust<17);m_nAdjust++) //调整信号的抽样点到信息位的大致起点位置
{
for(m=0;m<514;m++)
{
if(m<32)
{
csps.dTempFftData[m]=csps.dTemp_a[16+m-m_nAdjust];
csps.dFftDataIn[m]=csps.dTemp_a[16+m+m_nAdjust];
}
else
{
csps.dTempFftData[m]=0;
csps.dFftDataIn[m]=0;
}
}
csps.dTempfre1=csps.RFft_512(csps.dTempFftData,9600.0);
csps.dTempfre2=csps.RFft_512(csps.dFftDataIn,9600.0);
if((csps.dTempfre1-csps.dIndexfre)<20.0)
{
m_nBuffSet=16-m_nAdjust;
csps.szRaw[0]=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -