matlab仿真 数字信号载波传输(下)

打印 上一主题 下一主题

主题 582|帖子 582|积分 1746

(内容源自详解MATLAB/SIMULINK 通信系统建模与仿真   刘学勇编著第七 章内容,有兴趣的读者请阅读原书) 




  1. clear all
  2. M=8;
  3. msg=[1 4 3 0 7 5 2 6];
  4. ts=0.01;
  5. T=1;
  6. %t=0:ts:T;  
  7. t=0:ts:T-ts;
  8. %x=0:ts:length(msg);
  9. x=0:ts:length(msg)-ts;
  10. fc=1;
  11. c=sqrt(2)*exp(j*2*pi*fc*t);
  12. msg_qam=qammod(msg,M).';
  13. tx_qam=real(msg_qam*c);
  14. tx_qam=reshape(tx_qam.',1,length(msg)*length(t));
  15. %plot(x,tx_qam(1:length(x)))
  16. plot(x,tx_qam)
  17. title('8QAM信号波形')
  18. xlabel('时间t'),ylabel('载波振幅')
  19. scatterplot(msg_qam)
  20. title('8QAM信号星座图')
  21. xlabel('同相分量'),ylabel('正交分量')
复制代码


  1. clear all
  2. nsymbol=100000;
  3. M=16;
  4. graycode=[0 1 3 2 4 5 7 6 12 13 15 14 8 9 11 10];
  5. EsN0=5:20;
  6. snr1=10.^(EsN0/10);
  7. msg=randi([0,M-1],1,nsymbol);
  8. msg1=graycode(msg+1);
  9. msgmod=qammod(msg1,M);
  10. spow=norm(msgmod).^2/nsymbol;
  11. for indx=1:length(EsN0)
  12.     sigma=sqrt(spow/(2*snr1(indx)));
  13.     rx=msgmod+sigma*(randn(1,length(msgmod))+j*randn(1,length(msgmod)));
  14.     y=qamdemod(rx,M);
  15.     decmsg=graycode(y+1);
  16.     [err,ber(indx)]=biterr(msg,decmsg,log2(M));
  17.     [err,ser(indx)]=symerr(msg,decmsg);
  18. end
  19. P4=2*(1-1/sqrt(M))*qfunc(sqrt(3*snr1/(M-1)));
  20. ser1=1-(1-P4).^2;%理论误符号率
  21. ber1=1/log2(M)*ser1;%理论误比特率(1)
  22. semilogy(EsN0,ber,'-ko',EsN0,ser,'-k*',EsN0,ser1,EsN0,ber1,'-k.');
  23. title('16QAM载波调制信号在AWGN信道下的影响')
  24. xlabel('Es/N0');ylabel('误比特率和误符号率')
  25. legend('误比特率','误符号率','理论误符号率','理论误比特率')
复制代码
 (1)在盘算理论误比特率时接纳的是式7-37,7-38,在盘算理论误符号率时,因为这里是16qam,

换一种方式明白就是,符号中有四个比特,只要有一个比特错了整个符号都错了,所以误比特率一定是比误符号率小的。        





  1. clear all
  2. M=4;
  3. T=1;
  4. deltaf=1/T; %FSK的频率间隔
  5. fs=60;%采样频率
  6. ts=1/fs;%采样时间间隔
  7. t=0:ts:T;%一个符号周期的时间矢量
  8. fc=4;%载波频率
  9. msg=[0 1 3 2 randi([0,M-1],1,10000-M)];%消息序列
  10. msg_mod=fskmod(msg,M,deltaf,fs,fs);%4-fsk调制
  11. t1=0:ts:length(msg)-ts;
  12. y=real(msg_mod.*exp(j*2*pi*fc*t1));
  13. subplot(2,1,1)
  14. plot(t1(1:4*fs),y(1:4*fs))%(1)时域信号波形
  15. axis([0 4 -1.5 1.5])
  16. title('4FSK调制的信号波形')
  17. xlabel('时间');ylabel('振幅')
  18. ly=length(y);
  19. freq=[-fs/2:fs/ly:fs/2-fs/ly];
  20. Syy=10*log10(fftshift(abs(fft(y)/fs)));%调制信号频谱
  21. subplot(2,1,2)
  22. plot(freq,Syy)
复制代码
 (1)这里的图像只画出了前4个符号的图像,我们在设定msg信号的时候就已经确定了前4个符号为0 1 3 2,之后颠末fsk调制之后,每个符号采样了60个点,所以4个符号的总长度是240(FSK调制之后用60个点表现一个符号),在使用plot进行函数的绘制时,范围是从1->4*fs=240




  1. clear all
  2. nsymbol=10000; %每种信噪比下的发送符号数
  3. SymbolRate=1000;%符号速率
  4. nsamp=50;%每个符号的取样点数
  5. fs=nsamp*SymbolRate;%取样频率
  6. fd=100;
  7. %chan=rayleighchan(1/fs,fd);
  8. chan=comm.RayleighChannel('SampleRate',fs,'MaximumDopplerShift',fd);%(1)
  9. M=4;
  10. graycode=[0 1 3 2];
  11. EsN0=0:2:20;
  12. snr1=10.^(EsN0/10);
  13. msg=randi([0,M-1],1,nsymbol);   
  14. msg1=graycode(msg+1);
  15. x1=qammod(msg1,M);
  16. x1=rectpulse(x1,nsamp);
  17. x2=fskmod(msg1,M,SymbolRate,nsamp,fs);
  18. spow1=norm(x1).^2/nsymbol;
  19. spow2=norm(x2).^2/nsymbol;
  20. for indx=1:length(EsN0)
  21.     sigma1=sqrt(spow1/(2*snr1(indx)));
  22.     sigma2=sqrt(spow2/(2*snr1(indx)));
  23.     fadeSig1=chan(x1');%(3)
  24.     %fadeSig1=filter(x1);%(2)
  25.     %fadeSig2=filter(x2);
  26.     fadeSig2=chan(x2');
  27.    
  28.     rx1=fadeSig1'+sigma1*(randn(1,length(x1))+j*randn(1,length(x1)))%(4);
  29.     rx2=fadeSig2'+sigma2*(randn(1,length(x2))+j*randn(1,length(x2)));
  30.     y1=intdump(rx1,nsamp);
  31.     y1=qamdemod(y1,M);
  32.     decmsg1=graycode(y1+1);
  33.     [err,ber1(indx)]=biterr(msg,decmsg1,log2(M));
  34.     [err,ser1(indx)]=symerr(msg,decmsg1);
  35.     y2=fskdemod(rx2,M,SymbolRate,nsamp,fs);
  36.     decmsg2=graycode(y2+1);
  37.     [err,ber2(indx)]=biterr(msg,decmsg2,log2(M));
  38.     [err,ser2(indx)]=symerr(msg,decmsg2);
  39. end
  40. semilogy(EsN0,ser1,'-k*',EsN0,ber1,'-ko',EsN0,ser2,'-kv',EsN0,ber2,'-k.');
  41. title('4QAM和4FSK调制信号在瑞利衰落信道下的性能')
  42. xlabel('Es/N0');ylabel('误比特率和误符号率')
  43. legend('4QAM误符号率','4QAM误比特率','4FSK误符号率','4FSK误比特率')
复制代码
 FSK的调制方式与QAM相差不多,但是qam颠末qammod函数处置处罚之后还需要进行矩形脉冲成形r(rectpulse函数),,与此对应的还有脉冲成形的的逆过程(intdump函数),但是FSK调制不需要脉冲成形,可以在格雷映射完成之后直接调制.
此书中的瑞利信道的产生函数rayleighchan已经在新版本中无法使用了,所以接纳新的函数comm.RayleighChannel产生瑞利信号,这个函数的使用方法可以拜见
http://t.csdnimg.cn/wOHsA
使用方法简单来说可以是comm.RayleighChannel('属性1',属性1的值,'属性2',属性2的值......)。
但是这里如果直接接纳(1)处代码会报错,报错内容为
错误使用 doppler (第 47 行)
类 'comm.RayleighChannel' 中的属性 'DopplerSpectrum' 的默认值无效:
At least 5 parameters are required


这里接纳了其它人的解决方案,详见
http://t.csdnimg.cn/CU3Z2
这里我将他的方案重述一遍
起首错误缘故起因是
comm中有2个 doppler,时频工具箱和matlab自带的一些设置冲突
所以我们需要将另一个我们需要的doppler也加入matlab的工作路径中,具体方式如下

在下令行中输入
  1. which doppler
复制代码
确认目前接纳的doppler的位置,
之后
将工具箱中的comm加入路径中

我这里的路径为E:\MATLABR2021a\toolbox\comm\comm
所以在下令行输入
  1. addpath('E:\MATLABR2021a\toolbox\comm\comm');
复制代码

报错标题解决
继续代码标题,书上的滤波过程接纳的函数是filter(2),会报错
错误使用 filter
输入参数的数目不足。
这是因为接纳comm.RayleighChannel方法得到的信道有自己的使用方法,使用方法为(3)
注意,此处只能处置处罚列向量,所以需要行转置列,由于在(4)处我们又要使用滤波后的行向量效果,所以再次转置(列转行)

实验结论如下:



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

北冰洋以北

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表