📄 demodclass.cpp
字号:
// DemodClass.cpp: implementation of the DemodClass class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "mod_demod.h"
#include "DemodClass.h"
#include "AWGNClass.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
DemodClass::DemodClass(CString pnameModel,CString ptypeModel,
long vmodelSampleFreq,long vinputSampleFreq,
int vtimeStep,CString pnameGetDataFile,
CString pnamePutDataFile,int vtypeSignalGen,
double vampCarrier,long vfreqCarrier,
double vphaseCarrier,double vModPara)
{
parameter.nameModel=pnameModel;
parameter.typeModel=ptypeModel;
parameter.modelSampleFreq=vmodelSampleFreq;
parameter.inputSampleFreq=vinputSampleFreq;
parameter.timeStep=vtimeStep;
parameter.nameGetDataFile=pnameGetDataFile;
parameter.namePutDataFile=pnamePutDataFile;
parameter.typeSignalGen=vtypeSignalGen;
parameter.ampCarrier=vampCarrier;
parameter.freqCarrier=vfreqCarrier;
parameter.phaseCarrier=vphaseCarrier;
parameter.ModPara=vModPara;
}
DemodClass::~DemodClass()
{
}
void DemodClass::run()
{
switch(parameter.typeSignalGen)
{
case 1:
this->AMDemod();
break;
case 2:
this->FMDemod();
break;
case 3:
this->SSBDemod();
break;
case 4:
this->OOKDemod();
break;
case 5:
this->FSKDemod();
break;
case 6:
this->MSKDemod();
break;
case 7:
this->BPSKDemod();
break;
case 8:
this->QPSKDemod();
break;
case 9:
this->_16QAMDemod();
break;
default:
break;
}
}
////////////////////////////////////////
void DemodClass::AMDemod()
{
long i,num_of_scan;
float *h,*fn,*fn_I,*fn_Q;
double dt,fln,fhn;
double BandWidth;
BandWidth=2*Input_Signal_Freq;
dt=1.0/parameter.inputSampleFreq;
num_of_scan=parameter.timeStep/1000.0*parameter.inputSampleFreq;
//BPF,used to filt the noise
fln=(parameter.freqCarrier-0.5*BandWidth*1.2)/parameter.inputSampleFreq;
fhn=(parameter.freqCarrier+0.5*BandWidth*1.2)/parameter.inputSampleFreq;
h=firwin(12768,3,fln,fhn,1);
if(!h)
{
cout<<"Error occured when generate BPF.\n";
getch();
exit(1);
}
if(putData(h,"d:\\temp\\h.dat",12769)==FALSE)
{
free(h);
cout<<"Error occured when save h.dat.\n";
getch();
exit(1);
}
free(h);
convold("d:\\temp\\h.dat",parameter.nameGetDataFile,
"d:\\temp\\AM_Demod1.dat",32768);
fn=getData("d:\\temp\\AM_Demod1.dat",1,num_of_scan);
if(!fn)
{
cout<<"Cann't read AM_Demod1.dat.\n";
getch();
exit(1);
}
for(i=0;i<num_of_scan;i++)
*(fn+i)=*(fn+i)*2*cos(2*pi*parameter.freqCarrier*i*dt);
if(putData(fn,"d:\\temp\\AM_Demod_I.dat",num_of_scan)==FALSE)
{
cout<<"Error occured when create AM_Demod_I.dat\n";
free(fn);
getch();
}
free(fn);
fn=getData("d:\\temp\\AM_Demod1.dat",1,num_of_scan);
if(!fn)
{
cout<<"Cann't open the input file AM_Demod1.dat.\n";
getch();
exit(1);
}
for(i=0;i<num_of_scan;i++)
*(fn+i)=*(fn+i)*(-2)*sin(2*pi*parameter.freqCarrier*i*dt);
if(putData(fn,"d:\\temp\\AM_Demod_Q.dat",num_of_scan)==FALSE)
{
cout<<"Error occured when create AM_Demod_Q.dat\n";
free(fn);
getch();
}
free(fn);
//LPF
fln=0.5*BandWidth*1.2/parameter.inputSampleFreq;
h=firwin(12768,1,fln,0,1);
if(!h)
{
cout<<"Error occured when generate LPF fileter\n";
getch();
exit(1);
}
if(putData(h,"d:\\temp\\h.dat",12769)==FALSE)
{
free(h);
cout<<"Error occured when save h.dat.\n";
getch();
exit(1);
}
free(h);
convold("d:\\temp\\h.dat","d:\\temp\\AM_Demod_I.dat",
"d:\\temp\\AM_Demod_I1.dat",32768);
convold("d:\\temp\\h.dat","d:\\temp\\AM_Demod_Q.dat",
"d:\\temp\\AM_Demod_Q1.dat",32768);
fn_I=getData("d:\\temp\\AM_Demod_I1.dat",1,num_of_scan);
if(!fn_I)
{
cout<<"Cann't read AM_Demod_I1.dat.\n";
getch();
exit(1);
}
fn_Q=getData("d:\\temp\\AM_Demod_Q1.dat",1,num_of_scan);
if(!fn_Q)
{
cout<<"Cann't read AM_Demod_Q1.dat.\n";
free(fn_I);
getch();
exit(1);
}
for(i=0;i<num_of_scan;i++)
*(fn_I+i)=sqrt(*(fn_I+i)*(*(fn_I+i))+
(*(fn_Q+i))*(*(fn_Q+i)))/parameter.ampCarrier-1.0;
free(fn_Q);
//if(putData(fn_I,"d:\\temp\\AM_Out.dat",num_of_scan)==FALSE)
if(putData(fn_I,parameter.namePutDataFile,num_of_scan)==FALSE)
{
cout<<"Error occured when save file AM_Out.dat\n";
free(fn_I);
getch();
exit(1);
}
free(fn_I);
CFile::Remove("d:\\temp\\h.dat");
CFile::Remove("d:\\temp\\AM_Demod1.dat");
CFile::Remove("d:\\temp\\AM_Demod_I.dat");
CFile::Remove("d:\\temp\\AM_Demod_Q.dat");
CFile::Remove("d:\\temp\\AM_Demod_I1.dat");
CFile::Remove("d:\\temp\\AM_Demod_Q1.dat");
cout<<"AM Demodulate complete\n";
}
///////////////////////////////////////////////////
void DemodClass::FMDemod()
{
float *fn,*h;
double dt,BetaFM,BFM;
long i,num_of_scan;
double temp_n_1,temp_n,fln,fhn;
dt=1.0/parameter.inputSampleFreq;
num_of_scan=parameter.timeStep/1000.0*parameter.inputSampleFreq;
BetaFM=parameter.ModPara/(2*pi*Input_Signal_Freq);
BFM=2*(BetaFM+1)*Input_Signal_Freq;
//BPF used to filt noise
fln=(parameter.freqCarrier-BFM*0.5>0)?(parameter.freqCarrier-BFM*0.5):0;
fln=fln/parameter.inputSampleFreq;
fhn=(parameter.freqCarrier+BFM*0.5)/parameter.inputSampleFreq;
h=firwin(12768,3,fln,fhn,1);
if(!h)
{
cout<<"Error occured when generate BPF.\n";
getch();
exit(1);
}
if(putData(h,"d:\\temp\\h.dat",12769)==FALSE)
{
free(h);
cout<<"Error occured when save h.dat.\n";
getch();
exit(1);
}
free(h);
convold("d:\\temp\\h.dat",parameter.nameGetDataFile,
"d:\\temp\\FM_Demod1.dat",32768);
fn=getData("d:\\temp\\FM_Demod1.dat",1,num_of_scan);
if(!fn)
{
cout<<"Error occured when read FM_Demod1.dat.\n";
getch();
exit(1);
}
if(phasedetect(fn,parameter.freqCarrier,dt,
num_of_scan,"d:\\temp\\FM_Phase.dat")==FALSE)
{
free(fn);
cout<<"Error occured when detect phase.\n";
getch();
exit(1);
}
free(fn);
fn=getData("d:\\temp\\FM_Phase.dat",1,num_of_scan);
if(!fn)
{
cout<<"Error occured when read FM_Phase.dat.\n";
getch();
exit(1);
}
temp_n=*fn;
*fn=temp_n*parameter.inputSampleFreq/parameter.ModPara;
for(i=1;i<num_of_scan;i++)
{
temp_n_1=temp_n;
temp_n=*(fn+i);
*(fn+i)=(temp_n-temp_n_1)*parameter.inputSampleFreq/parameter.ModPara;
}
if(putData(fn,"d:\\temp\\temp.dat",num_of_scan)==FALSE)
{
free(fn);
cout<<"Error occured when save temp.dat\n";
getch();
exit(1);
}
free(fn);
//LPF filter
fln=Input_Signal_Freq*1.2/parameter.inputSampleFreq;
h=firwin(12768,1,fln,0,1);
if(!h)
{
cout<<"Error occured when generate LPF filter.\n";
getch();
exit(1);
}
if(putData(h,"d:\\temp\\h.dat",12769)==FALSE)
{
free(h);
cout<<"Error occured when save h.dat.\n";
getch();
exit(1);
}
free(h);
convold("d:\\temp\\h.dat","d:\\temp\\temp.dat",
parameter.namePutDataFile,32768);
CFile::Remove("d:\\temp\\FM_Demod1.dat");
CFile::Remove("d:\\temp\\FM_Phase.dat");
CFile::Remove("d:\\temp\\temp.dat");
CFile::Remove("d:\\temp\\h.dat");
cout<<"FM Demodulate complete.\n";
}
//////////////////////////////////////////////
void DemodClass::SSBDemod()
{
float *fn_i,*fn_q,*h;
double fln,fhn;
double dt=1.0/parameter.inputSampleFreq;
long i,num_of_scan;
num_of_scan=(long) parameter.timeStep/1000.0*parameter.inputSampleFreq;
//BPF used to filt noise
//the SSB modulation is lower band
fln=(parameter.freqCarrier-Input_Signal_Freq*1.2)/parameter.inputSampleFreq;
fhn=parameter.freqCarrier*1.005/parameter.inputSampleFreq;
h=firwin(12768,3,fln,fhn,1);
if(!h)
{
cout<<"Error occured when generate BPF.\n";
getch();
exit(1);
}
if(putData(h,"d:\\temp\\h.dat",12769)==FALSE)
{
free(h);
cout<<"Error occured when save h.dat.\n";
getch();
exit(1);
}
free(h);
convold("d:\\temp\\h.dat",parameter.nameGetDataFile,
"d:\\temp\\SSB_Demod1.dat",32768);
fn_i=getData("d:\\temp\\SSB_Demod1.dat",1,num_of_scan);
if(!fn_i)
{
cout<<"Error occured when read SSB_Demod1.dat.\n";
getch();
exit(1);
}
for(i=0;i<num_of_scan;i++)
*(fn_i+i)=*(fn_i+i)*cos(2*pi*parameter.freqCarrier*i*dt+parameter.phaseCarrier);
fn_q=getData("d:\\temp\\SSB_Demod1.dat",1,num_of_scan);
if(!fn_q)
{
cout<<"Error occured when read file SSB_Demod1.dat.\n";
free(fn_i);
getch();
exit(1);
}
if(hilbth(fn_q,num_of_scan,"d:\\temp\\temp.dat")==FALSE)
{
cout<<"Error occured when do hilbert transate.\n";
free(fn_i);
free(fn_q);
getch();
exit(1);
}
fn_q=getData("d:\\temp\\temp.dat",1,num_of_scan);
if(!fn_q)
{
cout<<"Error occured when read temp.dat.\n";
free(fn_i);
getch();
exit(1);
}
for(i=0;i<num_of_scan;i++)
*(fn_q+i)=*(fn_q+i)*sin(2*pi*parameter.freqCarrier*i*dt+parameter.phaseCarrier);
for(i=0;i<num_of_scan;i++)
*(fn_q+i)+=(*(fn_i+i));
free(fn_i);
if(putData(fn_q,"d:\\temp\\SSB_Demod_Sec.dat",num_of_scan)==FALSE)
{
cout<<"Error occured when save SSB_Demod_Sec.dat";
free(fn_q);
getch();
exit(1);
}
free(fn_q);
//LPF filter;
fln=Input_Signal_Freq*1.2/parameter.inputSampleFreq;
h=firwin(12768,1,fln,0,1);
if(!h)
{
cout<<"Error occured when generate the LPF.\n";
getch();
exit(1);
}
if(putData(h,"D:\\temp\\h.dat",12769)==FALSE)
{
free(h);
cout<<"Error occured when save h.dat.\n";
getch();
exit(1);
}
free(h);
convold("D:\\temp\\h.dat","D:\\temp\\SSB_Demod_Sec.dat",
parameter.namePutDataFile,32768);
CFile::Remove("d:\\temp\\h.dat");
CFile::Remove("d:\\temp\\SSB_Demod1.dat");
CFile::Remove("D:\\temp\\SSB_Demod_Sec.dat");
CFile::Remove("d:\\temp\\temp.dat");
cout<<"SSB demodulate complete.\n";
}
////////////////////////////////
void DemodClass::OOKDemod()
{
cout<<"Undefined.\n";
getch();
}
void DemodClass::FSKDemod()
{
cout<<"Undefined.\n";
getch();
}
void DemodClass::MSKDemod()
{
cout<<"Undefined.\n";
getch();
}
void DemodClass::BPSKDemod()
{
cout<<"Undefined.\n";
getch();
}
void DemodClass::QPSKDemod()
{
cout<<"Undefined.\n";
getch();
}
void DemodClass::_16QAMDemod()
{
cout<<"Undefined.\n";
getch();
}
void DemodClass::bitSynch()
{
cout<<"Undefined.\n";
getch();
}
/////////////////////////////
double DemodClass::window(int type,int n,int i)
{
double w;
w=1.0;
switch(type)
{
case 1:
{ w=0.54-0.46*cos(2*i*pi/(n-1));
break;
}
case 2:
{ w=0.5*(1.0-cos(2*i*pi/(n-1)));
break;
}
case 3:
{ w=0.42-0.5*cos(2*i*pi/(n-1))+0.08*cos(4*i*pi/(n-1));
break;
}
}
return(w);
}
///////////////////////////////////////////////////////
float *DemodClass::firwin(int n,int band,double fln,double fhn,int wn)
{
//n 滤波器的阶数
//band 滤波器类型,1--低通,2--高通,3--带通,4--带阻
//fln,对于低通和高通滤波器:通带边界频率,对于带通和带阻
//fln:通带下边界频率,fhn:通带上边界频率
//wn 窗函数类型:1--海明窗,2--汉宁窗,3--布拉克曼窗
//h 一个指针,指向返回的h(n)
//若失败,则返回一个空指针(NULL)
int i,n2,mid;
double s,wc1,wc2,delay;
float *h;
h=(float *) malloc((n+1)*sizeof(float));
if(!h) return NULL;
if((n%2)==0)
{
n2=n/2-1;
mid=1;
}
else
{
n2=n/2;
mid=0;
}
delay=n/2.0;
wc1=2.0*pi*fln;
if(band>=3)
wc2=2.0*pi*fhn;
switch(band)
{
case 1:
{
for(i=0;i<=n2;i++)
{ s=i-delay;
*(h+i)=(sin(wc1*s)/(pi*s))*window(wn,n+1,i);
*(h+n-i)=*(h+i);
}
if(mid==1)
*(h+n/2)=wc1/pi;
break;
}
case 2:
{
for(i=0;i<=n2;i++)
{ s=i-delay;
*(h+i)=(sin(pi*s)-sin(wc1*s))/(pi*s);
*(h+i)=*(h+i)*window(wn,n+1,i);
*(h+n-i)=*(h+i);
}
if(mid==1)
*(h+n/2)=1.0-wc1/pi;
break;
}
case 3:
{
for(i=0;i<=n2;i++)
{ s=i-delay;
*(h+i)=(sin(wc2*s)-sin(wc1*s))/(pi*s);
*(h+i)=*(h+i)*window(wn,n+1,i);
*(h+n-i)=*(h+i);
}
if(mid==1)
*(h+n/2)=(wc2-wc1)/pi;
break;
}
case 4:
{
for(i=0;i<=n2;i++)
{ s=i-delay;
*(h+i)=(sin(wc1*s)+sin(pi*s)-sin(wc2*s))/(pi*s);
*(h+i)=*(h+i)*window(wn,n+1,i);
*(h+n-i)=*(h+i);
}
if(mid==1)
*(h+n/2)=(wc1+pi-wc2)/pi;
break;
}
}
return h;
}
/////////////////////////////////////////
float *DemodClass::getData(CString filename,long start_point,long num_of_points)
{
//函数功能:将文件中的数据读到一个指针中,并返回该指针
//filename:文件
//start_point,起始位置
//num_of_points,数据点数
//若读取成功,则返加一个非空指针,否则,返回一个空指针
CFile inf(filename,CFile::modeRead);
float *fpointer;
long num_of_data;
if (!inf) return NULL;
num_of_data=inf.GetLength()/sizeof(float);
if ((start_point<=0)||(num_of_points<=0)||
(num_of_points>num_of_data)||
(start_point>num_of_data)||
(start_point+num_of_points-1>num_of_data))
return NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -