3.12 matlab信道编码例子
在本节中,我们将使用一种教学方法和一系列matlab程序,检查工具箱在信道编码方面提供的内容。首先,我们将建立一个系统,使用卷积编码和基于硬判决解码的维特比译码。然后,我们将使用软判决译码更新算法。最后,我们将用卷积编码算法代替卷积编码,并比较每个阶段的性能。通过这些简单的练习,我们不仅将了解使用matlab和通信系统工具箱为移动通信模型增加更多复杂性是多么容易,而且我们将清楚地看到,ber性能的显著提高解释了turbo编码在lte标准的信道编码中所起的重要作用。
3.12.1 误差校正与检测
信道编码包括错误检测和纠错。通过使用crc(循环冗余校验)检测器进行错误检测,接收器可以请求传输的重复,这被称为自动重复请求。前向纠错编码允许基于传输信号中包括的冗余比特来校正错误。错误检测和前向纠错的混合称为harq(hybrid automatic repeat request,混合自动重复请求)构成了大多数3g标准的组成部分,并且也被用于lte标准。纠错码通常分为分组码和卷积码。卷积码在2g和3g移动通信标准中有着广泛的应用,主要是因为其复杂度较低。
在这一节中,我们将详细说明我们已经增长的matlab模型,它已经包含了调制,包括信道编码。作为解释在lte标准中使用turbo编码的价值和动机的完美工具,我们将比较卷积编码和turbo编码的性能。此外,为了解释在使用接收机设计中所涉及的折衷,我们将比较具有和不带软判决译码的调制编码组合的性能。
3.12.2 卷积码
卷积码是由输入序列与编码器的脉冲响应卷积而产生的。编码器接受k位输入样本块,并通过对当前数据块和m个先前输入块进行操作,产生n位输出样本块。编码器的编码速率由比rc=k/n给出,卷积编码器由这三个参数(n,k,m)指定。图3.6示出了卷积编码器。
3.12.3 硬判决viterbi译码
在本练习的第一次迭代中,我们修改了上一节中的matlab函数,以在调制中添加信道编码方案。当使用信道编码方案时,发射机通过无线信道发送冗余比特和消息比特。接收机接收发送的信号,并使用冗余位来检测和校正信道引入的一些错误。让我们开始向通信系统添加卷积编码器和维特比解码器。该通信系统使用硬判决维特比译码,其中解调器将接收信号映射到位,然后将位传递到维特比译码器进行纠错。下面的matlab函数(chap3_ex03_qpsk_viterbi)使用qpsk调制和awgn信道的硬判决viterbi解码。
1function [ ber,bits ] = chap3_ex03_qpsk_viterbi( ebno,maxnumerrs,maxnumbits ) 2%% initializations 3 4persistent modulator awgn demodulator biterror convencoder viterbi 5 6if isempty(modulator) 7 modulator = comm.qpskmodulator('bitinput',true); 8 awgn = comm.awgnchannel; 9 demodulator = comm.qpskdemodulator('bitoutput',true);10 biterror = comm.errorrate;11 convencoder = comm.convolutionalencoder('terminationmethod','terminated');12 viterbi = comm.viterbidecoder('inputformat','hard','terminationmethod','terminated');13end14%% constants15frm = 2048;16m = 4;17k = log2(m);18coderate = 1/2;19snr = ebno + 10*log10(k)+10*log10(coderate);20awgn.ebno = snr;2122%% processing loop modeling transmitter, channel model and receiver23numerrs = 0;24numbits = 0;25results = zeros(3,1);26while((numerrs< maxnumerrs)&&(numbits< maxnumbits))27 % transmitter28 u = randi([0 1],frm,1);29 encoded = convencoder.step(u);30 mod_sig = modulator.step(encoded);3132 % channel 33 rx_sig = awgn.step(mod_sig);3435 % receiver36 demod = demodulator.step(rx_sig);37 decoded = viterbi.step(demod);38 y = decoded(1:frm);39 results = biterror.step(u,y);40 numerrs = results(2);41 numbits = results(3);42end4344%% clean up & collect results45ber = results(1);46bits = results(3);47reset(biterror);4849end通过在bertool中运行该函数,我们可以测量硬判决维特比译码的性能,并与上限理论结果进行比较。检查图3.7中的结果,我们可以看到模拟的ber曲线低于理论上限值,这与我们的期望是一致的。这些结果表明,为了达到更好的性能,我们需要改进我们的解码算法。
图3.7 viterbi译码的性能和awgn信道的qpsk调制对比
3.12.4 软判决viterbi译码
在这个迭代中,我们通过使用软判决译码算法来改进ber性能结果。在软判决译码中,解调器将接收到的信号映射到对数似然比。这些概率度量是基于接收到正确数据的可能性的对数而不是损坏的数据。当提供对数似然比作为对维特比解码器的输入时,解码器的误码率性能得到改善。通过改变几个解调器和维特比译码器系统目标参数,可以得到一种实现软判决维特比译码的算法。下面的matlab函数(chap3_ex04_qpsk_viterbi_soft() )已被更新为使用软判决维特比译码。
1function [ ber,bits ] = chap3_ex04_qpsk_viterbi_soft( ebno,maxnumerrs,maxnumbits ) 2%% initializations 3 4persistent modulator awgn demodulator biterror convencoder viterbi quantizer 5 6if isempty(modulator) 7 modulator = comm.qpskmodulator('bitinput',true); 8 awgn = comm.awgnchannel; 9 demodulator = comm.qpskdemodulator('bitoutput',true,'decisionmethod','log-likelihood ratio','variancesource','input port');10 biterror = comm.errorrate;11 convencoder = comm.convolutionalencoder('terminationmethod','terminated');12 viterbi = comm.viterbidecoder('inputformat','soft','softinputwordlength',4,'outputdatatype','double','terminationmethod','terminated');13 quantizer = dsp.scalarquantizerencoder('partitioning','unbounded','boundarypoints',-7:7,'outputindexdatatype','uint8');141516end17%% constants18frm = 2048;19m = 4;20k = log2(m);21coderate = 1/2;22snr = ebno + 10*log10(k)+10*log10(coderate);23noise_var = 10.^(-snr/10);24awgn.ebno = snr;2526%% processing loop modeling transmitter, channel model and receiver27numerrs = 0;28numbits = 0;29results = zeros(3,1);30while((numerrs< maxnumerrs)&&(numbits< maxnumbits))31 % transmitter32 u = randi([0 1],frm,1);33 encoded = convencoder.step(u);34 mod_sig = modulator.step(encoded);3536 % channel 37 rx_sig = awgn.step(mod_sig);3839 % receiver40 demod = demodulator.step(rx_sig,noise_var);41 llr = quantizer.step(-demod);42 decoded = viterbi.step(llr);43 y = decoded(1:frm);44 results = biterror.step(u,y);45 numerrs = results(2);46 numbits = results(3);47end4849%% clean up & collect results50ber = results(1);51bits = results(3);52reset(biterror);5354end理论上,我们预期结果会有2db的改进,这正是图3.8中所示的模拟曲线。接下来,我们检查turbo编码,看看它是否可以提供任何改进的ber结果。
图3.8 硬判决viterbi译码 vs 软判决viterbi译码
3.12.5 turbo 编码
turbo码大大提高了软判决viterbi译码的误码率性能。turbo编码在发射机处并行使用两个卷积编码器,在接收机处串联使用两个a后验概率(app)解码器。此示例使用率1/3 turbo编码器。对于每个输入位,输出具有一个系统位和两个奇偶位,总共三位。
下面的matlab函数已被更新,使用turbo编码器和解码器。注意,turbo解码是一个迭代迭代,性能随着迭代次数的增加而提高。在这个例子中,我们选择了六作为解码器执行的迭代次数。
1function [ ber,bits ] = chap3_ex05_qpsk_turbo( ebno,maxnumerrs,maxnumbits ) 2%% constants 3frm = 2048; 4trellis = poly2trellis(4,[13 15],13); 5indices = randperm(frm); 6m = 4; 7k = log2(m); 8r = frm/(3*frm+4*3); 910snr = ebno + 10*log10(k)+10*log10(r);11noise_var = 10.^(-snr/10);1213%% initializations14persistent modulator awgn demodulator biterror turboencoder turbodecoder1516if isempty(modulator)17 modulator = comm.qpskmodulator('bitinput',true);18 awgn = comm.awgnchannel;19 demodulator = comm.qpskdemodulator('bitoutput',true,'decisionmethod','log-likelihood ratio','variancesource','input port');20 biterror = comm.errorrate;21 turboencoder = comm.turboencoder('trellisstructure',trellis,'interleaverindices',indices);22 turbodecoder = comm.turbodecoder('trellisstructure',trellis,'interleaverindices',indices,'numiterations',6);23end242526%% processing loop modeling transmitter, channel model and receiver27awgn.ebno = snr;28numerrs = 0;29numbits = 0;30results = zeros(3,1);31while((numerrs< maxnumerrs)&&(numbits< maxnumbits))32 % transmitter33 u = randi([0 1],frm,1);34 encoded = turboencoder.step(u);35 mod_sig = modulator.step(encoded);3637 % channel 38 rx_sig = awgn.step(mod_sig);3940 % receiver41 demod = demodulator.step(rx_sig,noise_var);4243 decoded = turbodecoder.step(-demod);44 y = decoded(1:frm);45 results = biterror.step(u,y);46 numerrs = results(2);47 numbits = results(3);48end4950%% clean up & collect results51ber = results(1);52bits = results(3);53reset(biterror);5455end图3.9示出了在awgn信道下qpsk调制中turbo编码的结果。注意,在1db,我们有一个ber值发生在5db的硬判决和3db软判决解码。这清楚地表明了turbo编码算法的优越性。记住,这种性能增益是以计算复杂性的增加为代价的 (我的电脑单单计算 turbo coding 就花费了很长时间,而我的电脑配置是最新的 core i7)。我们的turbo解码器经过六次迭代译码以达到这一性能。我们将在turbo译码器中研究性能和复杂性之间的折衷。
3.13 本章总结
simulink及其工具箱提供了用于建模、仿真、评估性能、以及最终生成和实现通信系统代码的能力。对于建模和仿真,我们可以使用来自通信系统工具箱的算法构建块,作为系统对象或simulink块。在matlab中可以更有效地对移动标准的phy处理的许多方面进行建模和仿真,因为我们可以专注于将更高级的功能引入系统模型,而不是创建诸如调制器和编码器之类的构建块。特别感兴趣的是通信系统工具箱的系统对象。系统对象是为基于块的流系统的建模而设计的自文档化、易于使用和定制的建模和仿真组件。
当模拟复杂系统时,我们需要访问各种加速技术。这些技术帮助我们处理更多的测试数据,并在合理的模拟时间内获得统计上正确的评估。matlab工具箱,如并行处理工具箱和matlab编码器可以加快仿真。最后,为了在软件或硬件上实现设计,我们可以使用代码生成产品通过自动c或hdl代码生成来获得对精确实现细节的访问。
你了解过压故障保护模拟开关代替分立保护器件?
大数据、人工智能、互联网将在镇府新政策下迎来创业黄金时代
山寨币与竞争币的区别是什么
U-CPE公司选择Enea NFV Access开放式虚拟化和管理平台
台积电tsmc公司是做什么?是一家怎样的公司
信道编码器与译码器原理仿真
中国机器人市场增长迅速,在发展中国家市场有很大的优势
天宫二号成功发射 首次太空脑-机交互实验将启动
Apple在WWDC 2017主题演讲中推出了iOS 11
动中通数据的无线传输切换是如何实现的
Xilinx FPGA将会迎来怎样的变革
探究汽油直接喷射系统原理和相应的信号处理方法
降低动力电池重量及成本,且看新型传感器技术
盘点智能家居系统中常用的十大应用场景
MAX5113带SPI接口的14位电流DAC
蒸汽流量计远程控制系统的调试与应用
谷歌成功利用机器学习检测出糖尿病性视网膜病变,与眼科医生旗鼓相当
电池鼓包能刺破放气吗_电池鼓包还能用多久
英飞凌提供紧凑三相驱动BLDC电机驱动方案
硅基MEMS制造技术分析