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

📄 vtdecodeview.cpp

📁 利用intel dsplib 库函数进行特定2FSK信号(需传导频)解调
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					csps.szRawData[0]=0;
					csps.nCount10=1;
					csps.nCount8=1;
					csps.bAdjust_index=true;
				}
				else if(((csps.dTempfre2-csps.dIndexfre)>160.0)&&((csps.dTempfre2-csps.dIndexfre)<230.0))
				{
					m_nBuffSet=16+m_nAdjust;
					csps.szRaw[0]=0;
					csps.szRawData[0]=0;
					csps.szRaw[1]=0;
					csps.szRawData[1]=0;
					csps.nCount10=2;
					csps.nCount8=2;
					csps.bAdjust_index=true;
				}
					
				if(m_nAdjust==16)  //若导频被破坏,则跳出循环
				{
					m_nBuffSet=8;
					csps.szRaw[0]=0;
					csps.szRawData[0]=0;
					csps.nCount10=1;
					csps.nCount8=1;
					csps.bAdjust_index=true;
				}
			}
		}
		else
		{
			for(m=0;m<32;m++)
			{
				csps.dTemp_a[m]=csps.dTemp_b[m];
			}
		}

	}
	

/////////////////////////////////////////////////////////////////////////////////////////////////			
//++++解调第三步:按每次32字顺序取数据(32抽样点中包含1比特信息),解调信号++++//
	
	while(m_bCon)
	{	 
		if(m_bVan)
		{
			if(m_nCount32==31)  
			{  
				m_bVan=false;
				m_bCon=false;
				for(i=0;i<32-m_nBuffSet;i++)
				{
					temp1[i]=wavedata[m_nCount32*32+m_nBuffSet+i];
				}
				waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
				return ;
			}
			else
			{
				for(i=0;i<32;i++)
				{  
					csps.snTemp[i]=wavedata[m_nCount32*32+m_nBuffSet+i];
				}  
			} 
		}
		
		if(m_nCount32==32)
		{
			m_bCon=false;
			for(i=0;i<32-m_nBuffSet;i++)
			{
				temp1[i]=wavedata[31*32+m_nBuffSet+i];
			}
			waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
			return ;
		}

		 else if(m_nCount32==0)
		 { 
			for(i=0;i<32-m_nBuffSet;i++)
			{
				csps.snTemp[i]=temp1[i];
			}

			for(i=0;i<m_nBuffSet;i++)
			{ 
				temp2[i]=wavedata[i];
			} 
		    csps.snTemp[32-m_nBuffSet+i]=temp2[i];

		}
		else
		{ 
			for(i=0;i<32;i++)
			{ 
				csps.snTemp[i]=wavedata[(m_nCount32-1)*32+m_nBuffSet+i];
			} 
			
		} 
		m_nCount32++;

		for(i=0;i<32;i++)
		{ 
			csps.dFirDataIn[i]=double(csps.snTemp[i]);
			csps.dFirDataOut[i]=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.dFftDataIn[k]=csps.dFirDataOut[k];
			else
				csps.dFftDataIn[k]=0;
		} 
		csps.dSigfre=csps.RFft_512(csps.dFftDataIn,9600.0);

		if((csps.dSigfre<csps.dIndexfre-100.0)||(csps.dSigfre>csps.dIndexfre+300.0))
		{ 
			csps.nCount++;  //没有2FSK信号时,计数
		} 

		if(csps.nCount==30)
		{ 
			csps.bSig_index=false;  //无信号计数达到30次,须重新找2FSK导频信号
			waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
			return ;
		} 

		csps.szRaw[csps.nCount10]=csps.Conclude(csps.dSigfre,csps.dIndexfre);
		csps.szRawData[csps.nCount8]=csps.Conclude(csps.dSigfre,csps.dIndexfre);
		csps.nCount8++;
		csps.nCount10++;

		if (csps.nCount8==8)
		{
			csps.nCount8=0;

			csps.szMess1=csps.ByteToBits(csps.szRawData);
			strMess1=CString(csps.szMess1);
			m_strRawData+=strMess1;
				
		}


		if(m_strRawData.GetLength()>30*MSIZE)
		{
			m_File1.Write(m_strRawData,m_strRawData.GetLength());
			m_File1.Close();
			m_strRawData.Empty();
			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);
		}

//译码,还原报文
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//		
		if(csps.nCount10==10)
		{ 
			if(csps.bKey)  //判断报文是否结束
			{
				csps.nSync=0;
				csps.bFindsync=csps.FindSync(csps.szRaw);
				if(!csps.bFindsync)  //寻找同步码“0010101011”
				{
					for(i=0;i<9;i++)
						csps.szRaw[i]=csps.szRaw[i+1];
					csps.nCount10=9;
				}
				else
				{	
					csps.nCount10=0;
					csps.nControl=0;
					csps.nBitadjust=0;
					csps.bKey=false;
					

					csps.szMess=13;
					strMess=CString(csps.szMess);
					m_strText+=strMess;
					InsertChar(strMess);
					
				
					csps.szMess=10;  
					strMess=CString(csps.szMess);
					m_strText+=strMess;
					InsertChar(strMess);
				
				
					csps.szMess=91;  
					strMess=CString(csps.szMess);
					m_strText+=strMess;
					InsertChar(strMess);
				
				
					if(csps.nParthnum==1)
						csps.szMess='A';  
					else
						csps.szMess='B';  
					strMess=CString(csps.szMess);
					m_strText+=strMess;
					InsertChar(strMess);
				
				} 
			} 

			else
			{ 
				if((csps.szRaw[0]==1)&&(csps.szRaw[9]==0) ) //如果出现比特移位现象,丢弃一比特信息
				{ 
					csps.nBitadjust++;
					csps.bKey=csps.KeyToFindSync(csps.szRaw);
                    csps.bFindsync=csps.FindSync(csps.szRaw);
					
										
					if(csps.nBitadjust<=2)
					{
						csps.nCount10=0;
						if(csps.bFindsync)
						{
							csps.nSync++;
							if(csps.nSync>1)  //排除信息中单个信息字符与同步码相同的情况
							{ 
								csps.nControl=0;
							} 
						}
						else
						{
							for(i=0;i<8;i++)
							{	
								csps.szMess0[i]=csps.szRaw[9-i];
							}
							csps.szMess=csps.ByteToBits(csps.szMess0);
							if(isascii(csps.szMess))
							{
								strMess=CString(csps.szMess);
								m_strText+=strMess;
								InsertChar(strMess);
							} 
						}
					}
					else
					{ 
						csps.nCount10=9;
						for(i=0;i<9;i++)
						{	csps.szRaw[i]=csps.szRaw[i+1];
						}
						csps.nBitadjust=0;
					} 
				}
			
				
			
				else
				{ 
					csps.nCount10=0;
					csps.bKey=csps.KeyToFindSync(csps.szRaw);
					csps.bFindsync=csps.FindSync(csps.szRaw);
					if(csps.bFindsync)
					{
						csps.nSync++;
						if(csps.nSync>1)  //排除信息中单个信息字符与同步码相同的情况
						{ 
							csps.nControl=0;
						} 
						else 
						{
							for(i=0;i<8;i++)
							{
								csps.szMess0[i]=csps.szRaw[8-i];
							} 
							csps.szMess=csps.ByteToBits(csps.szMess0);
							if(isascii(csps.szMess))
							{
								strMess=CString(csps.szMess);
								m_strText+=strMess;
								InsertChar(strMess);
						
							} 
						}
					} 

					else
					{
						csps.nSync=0;
						csps.nControl++;

						//打印三个重要的控制字符
						if((csps.nControl==2)||(csps.nControl==4)||(csps.nControl==7))
						{
							for(i=0;i<8;i++)
							{
								csps.szMess0[i]=csps.szRaw[8-i];
							}
							for(i=0;i<8;i++)
							{
								if(i>3)
								{ 
									csps.szContr1[i]=csps.szMess0[i-4];
									csps.szContr2[i]=csps.szMess0[i];
								} 
								else
								{
									csps.szContr1[i]=0;
									csps.szContr2[i]=0;
								}
							}
                        
							csps.szCon1=csps.ByteToBits(csps.szContr1);
							csps.szCon1=csps.Convert(csps.szCon1);
							csps.szMess=csps.szCon1;  
							strMess=CString(csps.szMess);
							m_strText+=strMess;
							InsertChar(strMess);
						
						
							csps.szCon2=csps.ByteToBits(csps.szContr2);
							csps.szCon2=csps.Convert(csps.szCon2);
							csps.szMess=csps.szCon2; 
							strMess=CString(csps.szMess);
							m_strText+=strMess;
							InsertChar(strMess);
						
							if(csps.nControl==7)
							{
								csps.szMess=93;
								strMess=CString(csps.szMess);
								m_strText+=strMess;
								InsertChar(strMess);
							
								csps.szMess=32;
								strMess=CString(csps.szMess);
								m_strText+=strMess;
								InsertChar(strMess);
							
							
								csps.szMess=32;
								strMess=CString(csps.szMess);
								m_strText+=strMess;
								InsertChar(strMess);								
							} 
						}

						//打印报文
						if(csps.nControl>10)
						{ 
							for(i=0;i<8;i++)
							{
								csps.szMess0[i]=csps.szRaw[8-i];
							} 
							csps.szMess=csps.ByteToBits(csps.szMess0);
							if(isascii(csps.szMess))
							{
								strMess=CString(csps.szMess);
								m_strText+=strMess;
								InsertChar(strMess);
							} 
						}						
					} 				
				} 
				if(m_strText.GetLength()>30*MSIZE)
				{
					m_File.Write(m_strText,m_strText.GetLength());
					m_File.Close();
					m_strText.Empty();
					GetDlgItem(IDC_TEXT)->SetWindowText(m_strText);
					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);
				}
			}
		}  
    }
}

void CVTDecodeView::OnMM_WIM_CLOSE(UINT wParam,LONG lParam)
{
	waveInUnprepareHeader (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ;
	waveInUnprepareHeader (hWaveIn, pWaveHdr2, sizeof (WAVEHDR)) ;

	GlobalUnlock(hData1);    
	GlobalUnlock(hData2);
	GlobalUnlock(hDataBuff);	
	
	GlobalFree(hData1);
	GlobalFree(hData2);
	GlobalFree(hDataBuff);
	

	if(m_bFilterInitManual)
	{
		csps.Filter.Filter1Free();
		csps.Filter.Filter2Free();
	}
	else
		csps.Filter.Filter1Free();

	delete pWaveHdr1;
	delete pWaveHdr2;
	MessageBeep(MB_ICONEXCLAMATION);
    AfxMessageBox("请保存好报文!!");
	return ;

	//释放音响数据块
//////////////////////////////////////////////////////////////////////////////////////////////////


}

void CVTDecodeView::OnSave() 
{
	// TODO: Add your control notification handler code here
	if(!m_strText.IsEmpty())
		m_File.Write(m_strText,m_strText.GetLength());
	m_File.Close();
	m_strText.Empty();
	GetDlgItem(IDC_TEXT)->SetWindowText(m_strText);
	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);
	return;
}

void CVTDecodeView::OnDestroy() 
{
	CFormView::OnDestroy();
	
	// TODO: Add your message handler code here
	if(m_bStop==false)
	{
		waveInReset(hWaveIn);
		waveInClose(hWaveIn);
	}
	csps.Filter.Filter0Free();
	m_strRawData.Empty();
	m_strText.Empty();
	CFormView::OnClose();	
	
}

void CVTDecodeView::OnUpdateStop(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
    //	pCmdUI->Enable(m_bStop);
	
	
}

void CVTDecodeView::OnSave1() 
{
	// TODO: Add your control notification handler code here
	if(!m_strRawData.IsEmpty())
		m_File1.Write(m_strRawData,m_strRawData.GetLength());
	m_File1.Close();
	m_strRawData.Empty();
	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);
	return;
	
}

⌨️ 快捷键说明

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