ASK 课程设计代码.docx
- 文档编号:9606057
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:15
- 大小:17.65KB
ASK 课程设计代码.docx
《ASK 课程设计代码.docx》由会员分享,可在线阅读,更多相关《ASK 课程设计代码.docx(15页珍藏版)》请在冰豆网上搜索。
ASK课程设计代码
//SigTranmit.cpp:
implementationoftheSigTranmitclass.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"ASK.h"
#include"SigTranmit.h"
#include"math.h"
#ifdef_DEBUG
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#definenewDEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
SigTranmit:
:
SigTranmit()
{
c=1;//窗函数初始选择1
myID=5555;
myIntensity=5;
}
SigTranmit:
:
~SigTranmit()
{
}
voidSigTranmit:
:
SetDigtal(intID,intIntensity)
{
myID=ID;
myIntensity=Intensity;
}
//基带信号
voidSigTranmit:
:
BaseSignal()
{
inti,j;
intID[4];//输入的是四位数字
ID[0]=myID/1000;//取出最高位
ID[1]=myID/100%10;//依次取出各位
ID[2]=myID/10%10;
ID[3]=myID%10;
//编码,双极性编码,0用-1表示,1用+1
for(i=0,j=0;i<4;i++,j+=4)
{
switch(ID[i])
{
case0:
//输入0,变成二进制四位0000,编码为-1-1-1-1
S0[j]=-1,S0[j+1]=-1,S0[j+2]=-1,S0[j+3]=-1;
break;
case1:
S0[j]=-1,S0[j+1]=-1,S0[j+2]=-1,S0[j+3]=1;
break;
case2:
S0[j]=-1,S0[j+1]=-1,S0[j+2]=1,S0[j+3]=-1;
break;
case3:
S0[j]=-1,S0[j+1]=-1,S0[j+2]=1,S0[j+3]=1;
break;
case4:
S0[j]=-1,S0[j+1]=1,S0[j+2]=-1,S0[j+3]=-1;
break;
case5:
S0[j]=-1,S0[j+1]=1,S0[j+2]=-1,S0[j+3]=1;
break;
case6:
S0[j]=-1,S0[j+1]=1,S0[j+2]=1,S0[j+3]=-1;
break;
case7:
S0[j]=-1,S0[j+1]=1,S0[j+2]=1,S0[j+3]=1;
break;
case8:
S0[j]=1,S0[j+1]=-1,S0[j+2]=-1,S0[j+3]=-1;
break;
case9:
S0[j]=1,S0[j+1]=-1,S0[j+2]=-1,S0[j+3]=1;
break;
}
}
//采样S0[]为编码后的信号,Sa1[]为采样后的信号
for(i=0;i<16;i++)//16个码元,每个码元采样点数为M=20
{
for(j=M*i;j { Sa1[j]=(float)S0[i];//比如,i=0时,则第一个码元周期内的20个点的值都为第一个采样点S0[0]的值 //循环完成后,就可以得到16个码元的矩形波形 } } for(i=0;i<16*M;i++) Sa[i]=Sa1[i];//Sa[]存放通过系统中的每一环节后的信号 Dft(Sa1,16*M);//进行DFT运算,时域->频域,用于画频域图 } //低通滤波器 voidSigTranmit: : Lpf() { //用窗函数法实现,N=127为窗函数长度 inti; switch(c) { case1: BLKMC(N); break; case2: HNC(N); break; case3: HMC(N); break; } LHDN();//线性相位法设计理想窗 for(i=0;i { H1[i]=Hd[i]*Wn[i]; } Dft(H1,N);//DFT获取频域值 for(i=0;i { Hb[i]=A[i];//A[]存放DFT运算后的频域幅值 } } //带通滤波器 voidSigTranmit: : Bpf() { //用窗函数法实现,N=127为窗函数长度 inti; switch(c) { case1: BLKMC(N); break; case2: HNC(N); break; case3: HMC(N); break; } BHDN();//线性相位法设计理想窗 for(i=0;i { H2[i]=Hd[i]*Wn[i]; } Dft(H2,N);//DFT获取频域值 for(i=0;i { Hb[i]=A[i];//A[]存放DFT运算后的频域幅值 } } //调制 voidSigTranmit: : Modulate() { //对16*M个点进行相乘 for(inti=0;i<16*M;i++) { Sa[i]=Sa[i]*(float)cos(2.0*PI*(fc/fs)*i); } } //信道模拟 voidSigTranmit: : Channel() { Noise(myIntensity); for(inti=0;i<16*M;i++) { Sa[i]=Sa[i]+No[i];//加性噪声 } } //解调 voidSigTranmit: : Demodulate() { for(inti=0;i<16*M;i++) { Sa[i]=Sa[i]*(float)cos(2.0*PI*(fc/fs)*i); } } //恢复判决 voidSigTranmit: : Adjust() { inti,j,k; floata=0.0; //16*M个点,恢复出16个码元的高低电平,只要和零比较即可 for(i=0;i<16;i++) { for(j=0;j { a+=Sa[j+i*M]; } a/=M;//将一个码元内的20个采样点的值相加取平均,然后进行判决 if(a>=0)a=1;//大于0,判为1,<0,判为-1 elsea=-1; for(k=0;k { Sa[k+i*M]=a;//将一个码元的20个点的值取一致,出现矩形脉冲 } } Dft(Sa,16*M);//时域转化为频域 } //DFT运算 voidSigTranmit: : Dft(floatx[],intm) { //X[k]=DFT[x(n)]=∑x(n)*exp(-j*2*PI*k*n/N)+……n=0,1,2……N-1 //x[]为时域序列,m为DFT点数 for(inti=0;i { AR[i]=0.0;AI[i]=0.0; //分实部虚部运算, for(intj=0;j { AR[i]=AR[i]+x[j]*(float)cos(-2.0*PI*i*j/m); AI[i]=AI[i]+x[j]*(float)sin(-2.0*PI*i*j/m); } A[i]=(float)(sqrt(pow(AR[i],2)+pow(AI[i],2)));//DFT运算后为复数,这里取模长,画图用幅值, //pow(AR[i],2)表示AR[i]的平方 } } /*进行IDFT运算的函数*/ voidSigTranmit: : Idft(floath[]) { inti,k; floaty[N]; for(k=0;k P[k]=(N-1)*PI*k/N; for(i=0;i y[i]=0.0; for(i=0;i { for(k=0;k { y[i]+=h[k]*cos(2*PI*k*i/N+P[k])/(float)N; H2[i]=y[i]; } } } //卷积运算 voidSigTranmit: : Conv(floatx[16*M],floath[N]) { //卷积,即滤波,信号和滤波器的特性函数卷积 intl,i,j; floatb1[1000];//存放卷积后的结果 l=16*M+N;//卷积后的长度为16*M+N-1 //y(n)=x(n)*h(n)=∑x(m)h(n-m) //关键是确定非零区间,加和的上下限 for(i=0;i { b1[i]=0.0; for(j=0;j { if(((i-j)<0)||((i-j)>16*M))//重叠区间之外,乘积为0 b1[i]=b1[i]+0; else b1[i]+=h[j]*x[i-j]; } } //16*M为输入基带信号的长度,N为滤波器的长度(=窗函数的长度) //滤波后的长度为16*M+N-1,为了消除滤波器延时特性的影响,可以去掉滤波后的序列的前(N-1)/2个点 //这样滤波后的序列长度仍为16*M for(i=0;i<16*M;i++) Sa[i]=b1[i+(N-1)/2]; } //高斯白噪声函数 voidSigTranmit: : Noise(intinten) { inti,k; floatr0=0.0; floatr[12]; //用rand()产生一个随机数,范围为0-RAND_MAX,即32767 for(k=0;k<16*M;k++) { for(i=0;i<12;i++) { r[i]=(float)(2*rand()-RAND_MAX)/RAND_MAX;//r[i]范围为-1到1 //for循环产生长为12的序列,服从均匀分布 r0+=r[i];//大数定理: 独立同分布的随机变量相加服从高斯分布 r0=float(inten*r0/12.0);//因而r0为高斯白噪声的结果 } No[k]=r0; } Dft(No,16*M);//获取噪声的频域值 } //设置和获取私有变量函数,私有变量通过属性函数可被外部类调用 //这些函数使得对话框和画图函数可以使用SigTranmit类中的变量 voidSigTranmit: : SetH1(floatH[]) { for(inti=0;i<16*M;i++) H1[i]=H[i];////存放滤波器的单位取样响应,用于画时域波形 } voidSigTranmit: : SetHb(floatH[]) { for(inti=0;i<16*M;i++) Hb[i]=H[i];////存放带通频域数据 } voidSigTranmit: : Setc(intMyc) { c=Myc;//c为窗函数的选择结果 } intSigTranmit: : Getc() { returnc; } intSigTranmit: : GetmyIntensity() { returnmyIntensity;//噪声强度 } float*SigTranmit: : GetSa() { returnSa;//Sa存放通过系统中的每一环节后的信号 } float*SigTranmit: : GetA() { returnA;//获取DFT运算后的频域幅值 } float*SigTranmit: : GetH1() { returnH1;//获取滤波器的单位取样响应 } float*SigTranmit: : GetH2() { returnH2;//获取IDFT后的数据 } float*SigTranmit: : GetHb() { returnHb;//获取带通频域数据 } float*SigTranmit: : GetNo() { returnNo;//获取噪声序列 } //低通理想窗 voidSigTranmit: : LHDN() { inti; floata=(N-1)/2;//线性相位法设计理想窗 for(i=0;i { if(i==a) Hd[i]=(float)2*lFc/fs;//lFc是低通滤波器截止频率 else Hd[i]=(float)sin((2*PI*lFc/fs)*(i-a))/(float)(PI*(i-a));//理想低通的时域表达式为sin[wc(n-a)]/PI(n-a) } } //带通滤波器 voidSigTranmit: : BHDN() { inti; floata=(N-1)/2; for(i=0;i { if(i==a) Hd[i]=(float)2*bFc2/fs-2*bFc1/fs; else Hd[i]=(float)sin((2*PI*bFc2/fs)*(i-a))/(float)(PI*(i-a))-(float)sin((2*PI*bFc1/fs)*(i-a))/(float)(PI*(i-a)); } } //汉宁窗 voidSigTranmit: : HNC(intn) { inti; for(i=0;i { if(i elseWn[i]=0.0; } } voidSigTranmit: : HMC(intn) { inti; for(i=0;i { if(i elseWn[i]=0.0; } } voidSigTranmit: : BLKMC(intn) { inti; for(i=0;i { if(i elseWn[i]=0.0; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ASK 课程设计代码 课程设计 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)