西电通信原理大作业(建议在阅读文章的同时在MATLAB中进行代码调试,通过工作区变量的数据长度和类型的转换深入了解该系统的运行)
具体代码、报告、PPT和演示视频可前往此处下载:https://download.csdn.net/download/yifantan/72861981?spm=1001.2014.3001.5503
相关的理论知识我们已经在课本中学过了(如果仍需要获取,前往下载报告中的第三部分有详细设计的理论知识), 我们通过对整个系统中的数据类型转换来进一步理解知识和了解这个系统是如何运作的。
接着将灰度转化后的图像数据从十进制转化为二进制,并将这些数据变换为一个列向量存储为double类型,方便后面进一步处理。 85×87×8=59160
至此我们已经将图像从85×87×3的矩阵转化为1×59160的二进制比特流。
利用MATLAB中的matintrlv函数进行交织,将位数据打乱,从而使一个突发的错误变成随机错误,提升纠错能力,具体做法是通过逐行填充元素的临时矩阵,然后逐列将矩阵数据提出一个新的1×59160矩阵。原理如下图所示:
将交织后的数据映射为QPSK符号,映射规则为:00→0,10→1,01→2,
11→3,故经映射数据从1×59160变为59160/2=29580。
映射后的数据加入100个训练符号用于接收机纠正频偏。 (实验中加的是100个1)数据变为29680位。
进行QPSK调制将数据从实数变为方便传输的复数,即0~3分别对应四个复数。
首先生成1000个ZC序列用于帧同步,Zadoff Chu序列,以作者Solomon Zadoff和David Chu命名,用于LTE中的同步和信道探测。它被广泛应用,因为它具有恒定的振幅,零循环自相关,并且不同序列之间的相关性非常低。
对调制后的数据进行上采样,采样因子为20,采样后数据变为29680×20=593600位。将其与设计好的平方根升余弦滤波器卷积后,在数据头部加入生成的ZC序列,数据从593600位变为594600位。
将数据通过设备发送!
接收机每帧接收1200000个bit,将接收数据与ZC序列做自相关,通过ZC序列的自相关特性找到帧起始位置。
利用MATLAB自带的comm.CoarseFrequencyCompensator函数纠正频偏。利用conv卷积函数进行匹配滤波;利用comm.SymbolSynchronizer进行符号同步即定时同步。
通过之前100个序列符号的相位偏移来纠正相位偏移。
之后利用相关函数进行QPSK解调,反映射和交织从而恢复图像。
经过200次实验得出该系统的平均误码率在1.96%左右,误码率波动范围不大,但存在突然增大的情况,实验中误码率最小位0.90%。接收并恢复图像一次的时间约为11秒。(此处注意:误码率仍较高,后面有改进步骤,改进后效果会明显很多,不想改进的话就换一张小一点的且颜色交聚集的图片来传输效果会很好)
通过之前的训练符号进行相偏纠正,从下图中我们可以看出左图相较右图来说明显存在40°左右的相偏。
对前四十次的实验误码率进行统计绘制成误码率曲线图如下:
图像传输的误码率需要在10-5以下较好,本系统的误码率仍较高,进一步可以进行信道编码例如进一步块交织或卷积交织,可以用turbo码来实现;另一方面可以进行信道估计和均衡以此来降低误码率。(注意后者对改善误码率有更显著的作用;其次如上文提到的可以改换更小颜色分布更集中的简单图片)。
这次实验我们做的是基于QPSK调制的图像传输与接收,在实验初期遇到很多困难,但通过查询资料和不断学习克服了这些困难,同时我们也认识到理论学习与实践中存在着明显的差别。我们更加深入的理解了信道编码、脉冲成型滤波器、帧同步、匹配滤波器、相偏纠正等知识,便于我们理论学习更深一步。
[1] 李志. 基于CAZAC序列的帧同步方法[J]. 2008.
[2] 林永照, 吴成柯, 王布宏,等. 连续相位QPSK调制的简化接收机[J]. 西安电子科技大学学报, 2009, 36(3):418-423.
**发射机代码展示** |
%% send_part % 参数设置 fs = 100e3; % 采样速率 sr = 5e3; % 码元速率 %%%%%%%%%%%%%%%%%%%%%%%%%创建发送对象%%%%%%%%%%%%%%%%%%%%%%%%%%% txPluto = sdrtx('Pluto','RadioID','usb:0','CenterFrequency',800*1e6, ... 'BasebandSampleRate',fs,'ChannelMapping',1,'Gain',0); %%%%%%%%%%%%%%%%%%图像数据获取和编码%%%%%%%%%%%%%%%%%%%%%%%%%%%%% J1=imread('xidian.png'); J=rgb2gray(J1); imshow(J); BinSer=dec2bin(J,8);%进行8位pcm编码 BinSer=BinSer';%转置方便后面处理数据 str=BinSer(:)' ;%将数据矩阵变换为一个列向量 leng=length(str);%列向量的长度 b=double(str);%用一个double类型矩阵来存储列向量str的数据 %这里注意char类型的直接用double转换是获得ASCII码的数值不是1和0的数值,但是str2num不能用于矩阵因此下面 %用一个循坏来处理 for i=1:leng b(i)=str2double(char(b(i))); end %循坏完成数据转换 bitData=b; nBytes = length(str) * 1; nCode = 1; %一个字节用8个bit编码 % 2. 进行交织 %%%%%%%%%%%%%%%%%信道编码(交织)%%%%%%%%%%%%%%%%%%%%%%%%%%%%% bitData_scramble = matintrlv(bitData,10*nCode,nBytes/10); %根据bigData来修改 10->12 %一个突发的错误变成随机错误,提升纠错能力 % 3. 映射为QPSK符号 %%%%%%%%%%%%%%%%%映射为QPSK符号,调制%%%%%%%%%%%%%%%%%%%%%%%%%%%%% symData = QPSKMap(bitData_scramble); % 添加训练符号 symData = [ones(1, 100), symData]; % 4. 调制 modData = pskmod(symData, 4, pi/4); figure(2) scatter(real(modData),imag(modData)); % 5. 利用zc序列生成同步头 onePreData = CreatZC(500); preData = repmat(onePreData, 1, 2); preLength = length(preData); % 6. 添加导频纠正相偏 无 totalData = modData; % 7. 设置发射滤波器,也就是脉冲成型滤波器 irfn = 8;%;;滤波器截断的码元范围 ipoint = fs/sr;%每个码元范围内采样的点数 20 alfa = 0.5; % 由此可以得出带宽是10e3 * (1.5) = 15e3; sendFilter = rcosdesign(alfa, irfn, ipoint, 'sqrt'); delay = irfn * ipoint / 2; upData = upsample(totalData, ipoint);%进行上采样才能得到正确结果 toSend = conv(upData, sendFilter,'same'); %figure(2); %plot(toSend); %title('send waveform'); %grid on; %%%%%%%%%%%%%%%%pluto发送的数据要为列向量%%%%%%%%%%%%%%%%%%%% toSend=[preData toSend]; toSend=toSend.'; %scatterplot(toSend); %title('发送数据的散点图'); txPluto.transmitRepeat(toSend);%toSend % while(true) %txPluto(toSend); %end
**ZC序列生成代码** |
%生成CAZAC序列 function [cazac_sequence]=CreatZC(signal_length) %参数说明 %signal_length CAZAC序列的生成长度 %cazac_sequence 生成的CAZAC序列 K=1; n=1:signal_length; if mod(signal_length,2)==0 cazac_sequence=exp(1j*2*pi*K/signal_length*(n.*n/2+n)); else cazac_sequence=exp(1j*2*pi*K/signal_length*(n.*(n+1)/2+n)); end end
具体代码、报告、PPT和演示视频可前往此处下载:https://download.csdn.net/download/yifantan/72861981?spm=1001.2014.3001.5503