?? stucodeinfo.cpp
字號(hào):
// StuCodeInfo.cpp: implementation of the StuCodeInfo class.
//
//////////////////////////////////////////////////////////////////////
#include "math.h"
#include "string.h"
#include "stdafx.h"
#include "ASk.h"
#include "StuCodeInfo.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
StuCodeInfo::StuCodeInfo()
{
n=ceil(log(16*F)/log(2));
m=pow(2,n);
for(int k=0;k<=16*F-1;k++)
{
No[k]=0.0;
}
}
StuCodeInfo::~StuCodeInfo()
{
}
void StuCodeInfo::D_transfer_H()//產(chǎn)生基帶信號(hào)
{
int th;
for(int j=0;j<=15;j++)
{
S0[j]=-1;
}
for(int i=3;i>=0;i--)
{
if(c/pow(10,i)>=1)
{
th=c/pow(10, i);
for(int j=3;j>=0;j--)
{
if(th>=pow(2,j))
{
S0[(4*(4-i)-1)-j]=1;
th=th-pow(2,j);
}
}
}
int mid=pow(10,i);
c=c%mid;
}
}
void StuCodeInfo::Sample()//采樣過程
{
for(int j=0;j<=15;j++)
{
for(int k=0;k<=39;k++)
{
if(S0[j]==-1)
{
Sa[40*j+k]=-1;
}
else Sa[40*j+k]=1;
}
}
}
void StuCodeInfo::Lpf1()//低通濾波1
{
double SaTem[16*F+N-1]={0.0};//卷積過程中的臨時(shí)值(16*F+N-1個(gè))
int a=(N-1)/2;//以下是理想帶通濾波器
double hd[N]={0.0};//理想濾波器時(shí)域信號(hào)
double RN[N]={0.0};//矩形窗
double h[N]={0.0};//實(shí)際濾波器
for(int k=0;k<=N-1;k++)
{
if (k==a) hd[k]=1.0;//////////////////////////////////////////////////////////////應(yīng)為1還是0.25?
else hd[k]=sin((2*PI*Ft/Fs)*(k-a))/(PI*(k-a));//以上是理想低通濾波器
}
for (int m=0;m<=N-1;m++)//以下是矩形窗
{
RN[m]=1.0;
}//以上是矩形窗
for(int g=0;g<=N-1;g++)
{
h[g]=hd[g]*RN[g];
}
/////////////以下為卷積過程
for (int i=0;i<=(16*F+N-2);i++)
{
if(i<=(N-2))
{
for(int j=0;j<=i;j++)
}
if(i>=(N-1)&&i<=(16*F-1))
{
for(int j=0;j<=i;j++)
{
{
if(j>=N) continue;
SaTem[i]+=Sa[i-j]*h[j];
}
}
}
if(i>=16*F)
{
for(int j=0;j<=i;j++)
{
{
if(j>=N||(i-j)>=16*F) continue;
SaTem[i]+=Sa[i-j]*h[j];
}
}
}
}
/////////////以上為卷積過程
//////////////////////////////以下為卷積截?cái)? for(int j=0;j<=16*F-1;j++)
{
Sa[j]=SaTem[j+a]/2;
}
//////////////////////////////以上為卷積截?cái)?
}
void StuCodeInfo::Modulate() //調(diào)制函數(shù)
{
for(int g=0;g<=16*F-1;g++ )
{
Sa[g]=Sa[g]*cos(2*PI*g*Fc/Fs);
}
}
void StuCodeInfo::Noise()
{
for(int i=0;i<=16*F-1;i++)
{
for(int j=0;j<=12;j++)
{
double r=rand();
double ri=(r-RAND_MAX/2)/(RAND_MAX/2);
No[i]+=b*ri/2;
}
}
}
void StuCodeInfo::Channel()//信道加噪函數(shù)
{
for(int i=0;i<=16*F-1;i++)
{
Sa[i]=Sa[i]+No[i];
}
}
void StuCodeInfo::Bpf()//帶通濾波
{
double SaTem[16*F+N-1]={0.0};//卷積過程中的臨時(shí)值(16*F+N-1個(gè))
int a=(N-1)/2;//以下是理想帶通濾波器
double hd[N]={0.0};//理想濾波器時(shí)域信號(hào)
double RN[N]={0.0};//矩形窗
double h[N]={0.0};//實(shí)際濾波器
for(int k=0;k<=N-1;k++)
{
if (k==a) hd[k]=1.0;///////////////////////////////////////////////////////////////////////////////////////應(yīng)為1還是0.25?
else hd[k]=(sin(2*PI*Fbc*(k-a)/Fs)-sin(2*PI*Fbf*(k-a)/Fs))/(double)(PI*(k-a));//以上是理想帶通濾波器
}
for (int m=0;m<=N-1;m++)//以下是矩形窗
{
RN[m]=1.0;
}//以上是矩形窗
for(int g=0;g<=N-1;g++)
{
h[g]=hd[g]*RN[g];
}
/////////////以下為卷積過程
for (int i=0;i<=(16*F+N-2);i++)
{
if(i<=(N-2))
{
for(int j=0;j<=i;j++)
SaTem[i]+=Sa[i-j]*h[j];
}
if(i>=(N-1)&&i<=(16*F-1))
{
for(int j=0;j<=i;j++)
{
{
if(j>=N) continue;
SaTem[i]+=Sa[i-j]*h[j];
}
}
}
if(i>=16*F)
{
for(int j=0;j<=i;j++)
{
{
if(j>=N||(i-j)>=16*F) continue;
SaTem[i]+=Sa[i-j]*h[j];
}
}
}
}
/////////////以上為卷積過程
//////////////////////////////以下為卷積截?cái)? for(int j=0;j<=16*F-1;j++)
{
Sa[j]=SaTem[j+a]/2;
}
//////////////////////////////以上為卷積截?cái)?
}
void StuCodeInfo::Demodulate()//解調(diào)函數(shù)
{
for(int g=0;g<=16*F-1;g++ )
Sa[g]=Sa[g]*cos(2*PI*g*Fc/Fs);
}
void StuCodeInfo::Lpf2()//低通濾波2
{
double SaTem[16*F+N-1]={0.0};//卷積過程中的臨時(shí)值(16*F+N-1個(gè))
int a=(N-1)/2;//以下是理想低通濾波器
double hd[N]={0.0};//理想濾波器時(shí)域信號(hào)
double RN[N]={0.0};//矩形窗
double h[N]={0.0};//實(shí)際濾波器
for(int k=0;k<=N-1;k++)
{
if (k==a) hd[k]=1.0;
else hd[k]=sin((2*PI*Ft/Fs)*(k-a))/(double)(PI*(k-a));//以上是理想低通濾波器
}
for (int m=0;m<=N-1;m++)//以下是矩形窗
{
RN[m]=1.0;
}//以上是矩形窗
for(int g=0;g<=N-1;g++)
{
h[g]=hd[g]*RN[g];
}
/////////////以下為卷積過程
for (int i=0;i<=(16*F+N-2);i++)
{
if(i<=(N-2))
{
for(int j=0;j<=i;j++)
SaTem[i]+=Sa[i-j]*h[j];
}
if(i>=(N-1)&&i<=(16*F-1))
{
for(int j=0;j<=i;j++)
{
{
if(j>=N) continue;
SaTem[i]+=Sa[i-j]*h[j];
}
}
}
if(i>=16*F)
{
for(int j=0;j<=i;j++)
{
{
if(j>=N||(i-j)>=16*F) continue;
SaTem[i]+=Sa[i-j]*h[j];
}
}
}
}
/////////////以上為卷積過程
//////////////////////////////以下為卷積截?cái)? for(int j=0;j<=16*F-1;j++)
{
Sa[j]=SaTem[j+a];
}
//////////////////////////////以上為卷積截?cái)?
}
void StuCodeInfo::Judge()//判決函數(shù)
{
for (int i=0;i<=15;i++)
{
for(int j=0;j<=F-1;j++)
{
S1[i]+=Sa[j+i*F];
}
double g=S1[i]/F;
if(g>=0.0) S1[i]=1;
else S1[i]=-1;
}
}
void StuCodeInfo::DFT_FFT()
{
for(int l=0;l<=n-1;l++)
{
AI[l]=0.0;
if(l<=16*F-1)
AR[l]=Sa[l];
else
AR[l]=0.0;
}
int i,i1,j1,j,LH,n1,k,d;
double tr,ti,p;
LH=n/2;
j=LH;
n1=n-2;
for(i=1;i<=n;i++)
{
if(i<j)
{
i1=i;
j1=j;
tr=AR[i1];
ti=AI[i1];
AR[i1]=AR[j1];
AI[i1]=AI[j1];
AR[j1]=tr;
AI[j1]=ti;
}
k=LH;
while(j>=k)
{
j=j-k;
k=(int)k/2;
}
j=j+k;
}
for(i=1;i<=m;i++)
{
d=(int)pow(2,(i-1));
for(j=0;j<=(d-1);j++)
{
p=(double)(pow(2,(m-i))*j*2.0*PI/(double)n);
for(k=j;k<=(n-1);)
{
double tr1,ti1;
tr1=AR[k+d]*cos(p)+AI[k+d]*sin(p);
ti1=AI[k+d]*cos(p)-AR[k+d]*sin(p);
AR[k+d]=AR[k]-tr1;
AI[k+d]=AI[k]-ti1;
AR[k]=AR[k]+tr1;
AI[k]=AI[k]+ti1;
k+=2*d;
}
}
}
for(int g=0;g<=n-1;g++)
A[g]=sqrt(pow(AR[g],2)+pow(AI[g],2));
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -