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

📄 vtdecodeview.cpp

📁 利用intel dsplib 库函数进行特定2FSK信号(需传导频)解调
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -