精华内容
下载资源
问答
  • 基于MATLAB的调制解调与信道编译码仿真教程.docx
    2021-05-06 07:44:47

    基于MATLAB的调制解调与信道编译码仿真教程

    基于MATLAB的调制解调与信道编译码仿真摘要:随着信息时代的步伐,通信技术得到了全面的发展,信息技术已成为了21世纪最强大的国际化动力。在通信技术中,信息的调制、解调和误码纠错都占有重要的地位。MATLAB作为一款功能强大的数学工具软件,在通信领域中得到了很广泛的应用。本文基于MATLAB对信号进行模拟仿真设计,实现对二进制相移键控、循环码的纠错仿真、BPSK的调制解调等进行仿真设计。关键字:MATLAB、调制解调、2PSK、BPSK、重复码。

    一 、二进制和四进制相移键控调制仿真设计二进制相移键控(2PSK)原理 相移键控是利用载波的相位变化来传递数字信息的,而振幅和频率保持不变。在2PSK中常用0和π分别表示二进制“0”和“1”,2PSK的信号时域表达式为: 表示为第n个符号的绝对相位,因此上式可改写为: 由于表示信号的两种码形完全相同,极性相反,故2PSK信号一般表示一个双极性全占空矩形脉冲序列与一个正弦载波相乘。=s(t)coswct其中: s(t)=g(t-nTs);这里,g(t)为脉宽Ts的单个矩形脉冲;的统计特征为 =1, & 概率为P-1, & 概率为1-P即发送二进制“0”时(),取0相位;发送二进制符号“1”时(),取π相位。这种以载波的不同相位直接法去表示相应二进制数字信号的调制方式,称为二进制绝对相移方式。

    2PSK信号时间波形2PSK信号的调制原理如下图所示,与2ASK的产生方法相比,只是对s(t)的要求不同,在2ASK中s(t)是单极性的,而在2PSK中s(t)是双极性的基带信号。

    模拟调制方法

    键控法 2PSK信号的解调通常采用相干解调法,解调原理如下原理框图所示,在相干解调中,如何得到与接受的2PSK信号同频同相的相干载是关键问题,后续进一步介绍。

    2PSK信号的调解原理框图 二进制差分相移键控2PSK相干调解时,由于载波恢复中相位有0、π模糊性,导致调解过程出现”反相工作”现象,恢复出的信号“1”和“0”倒置,从而使2PSK难以实际应用。二进制差分相移键控(2DPSK)能够克服次缺点。2DPSK是利用前后码元的载波相位变化传递数字信息,假设?φ为当前码元与前一码元的载波相位差,定义为一种数字信息与?φ之间的关系为 ?φ=0 表示数字信息“0”1 表示数字信息“1”与是可将一组二进制数字信息与其对应的2DPSK信号的载波相位关系示例如下:二进制数字信息: 1 1 0 1 0 0 1 1 02DPSK信号或相位:(0)π 0 0 π π π 0 π π 或 :(π)0 π π 0 0 0 π 0 0相应的2DPSK的典型波形如下图: ?φ=0 表示数字信息“1”π 表示数字信息“0”(a)绝对码 1 1 0 1 0(c)2DPSK(b)相对码 0 1 0 0 1 1 对于相同的基带数字信息序列,由于序列初始码元的参考相位不同,2DPSK信号的位置可以不同。2DPSK信号的相位并不直接代表基带信号,而前后码元相对相位的差才唯一决定信息的符号。 1.3 四进制幅度调制原理振幅键控时利用载波的振幅变化来传递数字信息,而其频率和初始相位保持不变。4ASK信号的一般表达式为e4ASK=nang(t-nTB)cosωct如果其中是0的四进制信号,只要让载波信号与多进制信号通过乘法器即可调制完成。如果两个电平都不是0,只要让载波信号的振幅固定,通过乘法器与多进制信号相乘。

    而解调的两种方法包括非相干解调和相干解调,其原理图如下:

    程序流程图:

    2PSK调制流程图

    二、二进制对称信道下的重复码编译码及错误概率统计仿真设计2.1 循环码的编码循环码是采用循环移位的特性界定的一种线性分组码,除了具有线性分组码的一般特性之外,还具有循环性,是一种无权码。循环码的最大特点就是码字循环特性,所谓循环特性是指循环码中任何一组循环码循环移位后,所得到的码组仍是循环码。若(an-1 an-2 ,,,a1an)为一组循

    更多相关内容
  • 基于matlab的调制解调与信道编译码仿真 基于 MATLAB 的调制解调与信道编译码仿真摘要:随着信息时代的步伐,通信技术得到了全面的发展,信息技术已成为了21 世纪最强大的国际化动力。在通信技术中,信息的调制、解调...

    41528d3028836879cd698677c3999917.gif基于matlab的调制解调与信道编译码仿真

    基于 MATLAB 的调制解调与信道编译码仿真摘要:随着信息时代的步伐,通信技术得到了全面的发展,信息技术已成为了21 世纪最强大的国际化动力。在通信技术中,信息的调制、解调和误码纠错都占有重要的地位。MATLAB 作为一款功能强大的数学工具软件,在通信领域中得到了很广泛的应用。本文基于 MATLAB 对信号进行模拟仿真设计,实现对二进制相移键控、循环码的纠错仿真、BPSK 的调制解调等进行仿真设计。关键字:MATLAB、调制解调、2PSK、BPSK、重复码。一 、二进制和四进制相移键控调制仿真设计1.1二进制相移键控(2PSK)原理相移键控是利用载波的相位变化来传递数字信息的,而振幅和频率保持不变。在 2PSK 中常用 0 和 π 分别表示二进制“0”和“1” ,2PSK 的信号时域表达式为:2t)ecpsknwt( ) =Ao(表示为第 n 个符号的绝对相位,因此上式可改写为:n2cst-ot 1-P {psk( ) 概 为概 率 为率由于表示信号的两种码形完全相同,极性相反,故 2PSK 信号一般表示一个双极性全占空矩形脉冲序列与一个正弦载波相乘。=s(t)coswct2p()sket其中:s(t)= g(t-nTs);na这里,g(t)为脉宽 Ts 的单个矩形脉冲; 的统计特征为n=na{ 1, 概率为 P-1, 概率为 1-P 即发送二进制“0”时( ) , 取 0 相位;发送二进制符号“1”时(an2p()skte) , 取 π 相位。这种以载波的不同相位直接法去表示相应二进制a1n2p()skte数字信号的调制方式,称为二进制绝对相移方式。2PSK 信号时间波形2PSK 信号的调制原理如下图所示,与 2ASK 的产生方法相比,只是对 s(t)的要求不同,在 2ASK 中 s(t)是单极性的,而在 2PSK 中 s(t)是双极性的基带信号。码 型 变 换 乘 法 器 e2psk(t)S(t)coswct双 极 性不 归 零(a) 模拟调制方法coswct180°移 相开 关 电 路0πs(t)e2PSK(b) 键控法2PSK 信号的解调通常采用相干解调法,解调原理如下原理框图所示,在相干解调中,如何得到与接受的 2PSK 信号同频同相的相干载是关键问题,后续进一步介绍。带 通 滤 波 器 相 乘 器 低 通 滤 波 器 抽 样 判 决 器e2psk(t) a cbd c定 时脉 冲coswct2PSK 信号的调解原理框图1.2 二进制差分相移键控2PSK 相干调解时,由于载波恢复中相位有 0、π 模糊性,导致调解过程出现”反相工作 ”现象,恢复出的信号 “1”和“0”倒置,从而使 2PSK 难以实际应用。二进制差分相移键控(2DPSK)能够克服次缺点。2DPSK 是利用前后码元的载波相位变化传递数字信息,假设 为当前码元∆𝜑与前一码元的载波相位差,定义为一种数字信息与 之间的关系为∆𝜑∆𝜑={0 表示数字信息“ 0”1 表示数字信息“ 1” 与是可将一组二进制数字信息与其对应的 2DPSK 信号的载波相位关系示例如下:二进制数字信息: 1 1 0 1 0 0 1 1 02DPSK 信号或相位:(0)π 0 0 π π π 0 π π或 :(π)0 π π 0 0 0 π 0 0相应的 2DPSK 的典型波形如下图:∆𝜑={0 表示数字信息“ 1”π 表示数字信息“ 0” (a)绝对码 1 1 0 1 0(b)相对码 0 1 0 0 1 1(c)2DPSK对于相同的基带数字信息序列,由于序列初始码元的参考相位不同,2DPSK信号的位置可以不同。2DPSK 信号的相位并不直接代表基带信号,而前后码元相对相位的差才唯一决定信息的符号。 1.3 四进制幅度调制原理振幅键控时利用载波的振幅变化来传递数字信息,而其频率和初始相位保持不变。4ASK 信号的一般表达式为e4𝐴𝑆𝐾=∑𝑛𝑎𝑛𝑔(𝑡‒𝑛𝑇𝐵)𝑐𝑜𝑠𝜔c𝑡如果其中是 0 的四进制信号,只要让载波信号与多进制信号通过乘法器即可调制完成。如果两个电平都不是 0,只要让载波信号的振幅固定,通过乘法器与多进制信号相乘。0 11 00 00 11 11 04 P S K 信号基带多电平单极性不归零基带多电平双极性不归零抑制载波 4 F S K 信号0 1 1 0 1 1 0 1 0 0 1 00 1 1 0 1 1 0 1 0 0 1 00 1 1 0 1 1 0 1 0 0 1 0而解调的两种方法包括非相干解调和相干解调,其原理图如下:带通滤波器全波整流器抽样判决器低通滤波器e4 A S K( t ) 输出定时脉冲非相干解调方式三带通滤波器相乘器低通滤波器抽样判决器e4 A S K( t )定时 脉冲cosωct相干解调方式1.3 程序流程图:2PSK 调制流程图二、二进制对称信道下的重复码编译码及错误概率统计仿真设计2.1 循环码的编码循环码是采用循环移位的特性界定的一种线性分组码,除了具有线性分组码的一般特性之外,还具有循环性,是一种无权码。循环码的最大特点就是码字循环特性,所谓循环特性是指循环码中任何一组循环码循环移位后,所得到的码组仍是循环码。若(an-1 an-2 ,,,a1an)为一组循环码组 则(an-2 an-3 ,,a0 an-1) 、 (an-3 an-4 ,,an-1 an-2) 、 , , ,还是循环码组,也就是说,不论是左移还是右移,也不论移多少位,仍然循环的循环码组。例如(3,1)重复码两个码字是(0,0,0)和(1,1,1)。编码 for j=1:Lfor k=1:ncode=[code;data(j,1)];endend其中 L 为信息序列的码长,n 为重复码字的长度。这种编码方式时间开销较大。2.2 循环码的译码decode=reshape(demodcode,n,L);decode=decode;weight=sun(decode);weight=weight;weight(weightn/2);dedata=weight;2.3 循环码的纠错当传输信息比特 b=1,得到码字 c=b*G=(1,1,1);若信道中存在噪声干扰,导致接收端收到一个错误的码元,如 v=(1,0,1) 此时根据多判决法可以判断发送的信息比特为 1。同理,若 b=0,收到码字 v=(1,0,0),可以判断出发送的信息 bite为 0。通过这样的方式实现纠错。有纠错定理:若分组码有最小距离 d,那么该码的最大检错数 tmd 和最大纠错数 tmc 满足:(1) 在检错模式时,有 tmd=d-1(2) 在纠错模式下, tmc=[(d-1)/2](3) 在混合检错模式下有Tmc+tmd d-1 并同时又 tmc

    展开全文
  • 信道编码器与译码器原理仿真

    千次阅读 2018-11-15 20:47:55
    图3.7 Viterbi译码的性能和AWGN信道的QPSK调制对比   3.12.4 软判决Viterbi译码 在这个迭代中,我们通过使用软判决译码算法来改进BER性能结果。在软判决译码中,解调器将接收到的信号映射到对数似然比。...

    原文 Understanding LTE with MATLAB  ,作者Houman Zarrinkoub,本文是对于该书的翻译,书中的专业性词汇给出了英文原文,图和表的排版都是参考原文,翻译不准确的地方请读者多多包涵。

    本文仅限于个人学习,研究,交流,不得用于其他商业用途!

     

     

             Understanding LTE with MATLAB——3.12到3.13节

     

    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');
    13end
    14%% Constants
    15FRM = 2048;
    16M = 4;
    17k = log2(M);
    18codeRate = 1/2;
    19snr = EbNo + 10*log10(k)+10*log10(codeRate);
    20AWGN.EbNo = snr;
    21
    22%% Processing loop modeling transmitter, channel model and receiver
    23numErrs = 0;
    24numBits = 0;
    25results = zeros(3,1);
    26while((numErrs<maxNumErrs)&&(numBits<maxNumBits))
    27    % Transmitter
    28    u = randi([0 1],FRM,1);
    29    encoded = ConvEncoder.step(u);
    30    mod_sig = Modulator.step(encoded);
    31
    32    % Channel 
    33    rx_sig = AWGN.step(mod_sig);
    34
    35    % Receiver
    36    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);
    42end
    43
    44%% Clean up & collect results
    45ber = results(1);
    46bits = results(3);
    47reset(BitError);
    48
    49end
    

     

    通过在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');
    14
    15
    16end
    17%% Constants
    18FRM = 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;
    25
    26%% Processing loop modeling transmitter, channel model and receiver
    27numErrs = 0;
    28numBits = 0;
    29results = zeros(3,1);
    30while((numErrs<maxNumErrs)&&(numBits<maxNumBits))
    31    % Transmitter
    32    u = randi([0 1],FRM,1);
    33    encoded = ConvEncoder.step(u);
    34    mod_sig = Modulator.step(encoded);
    35
    36    % Channel 
    37    rx_sig = AWGN.step(mod_sig);
    38
    39    % Receiver
    40    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);
    47end
    48
    49%% Clean up & collect results
    50ber = results(1);
    51bits = results(3);
    52reset(BitError);
    53
    54end
    

     

     

     

    理论上,我们预期结果会有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);
     9
    10snr = EbNo + 10*log10(k)+10*log10(R);
    11noise_var = 10.^(-snr/10);
    12
    13%% Initializations
    14persistent Modulator AWGN DeModulator BitError TurboEncoder TurboDecoder
    15
    16if 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);
    23end
    24
    25
    26%% Processing loop modeling transmitter, channel model and receiver
    27AWGN.EbNo = snr;
    28numErrs = 0;
    29numBits = 0;
    30results = zeros(3,1);
    31while((numErrs<maxNumErrs)&&(numBits<maxNumBits))
    32    % Transmitter
    33    u = randi([0 1],FRM,1);
    34    encoded = TurboEncoder.step(u);
    35    mod_sig = Modulator.step(encoded);
    36
    37    % Channel 
    38    rx_sig = AWGN.step(mod_sig);
    39
    40    % Receiver
    41    demod = DeModulator.step(rx_sig,noise_var);
    42
    43    decoded = TurboDecoder.step(-demod);
    44    y = decoded(1:FRM);
    45    results = BitError.step(u,y);
    46    numErrs = results(2);
    47    numBits = results(3);
    48end
    49
    50%% Clean up & collect results
    51ber = results(1);
    52bits = results(3);
    53reset(BitError);
    54
    55end
    

     

    图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代码生成来获得对精确实现细节的访问。

     

    参考文献

    [1] MathWorks Documentation Center, http://www.mathworks.com/help/MATLAB/random-number-generation.html (accessed 16 August 2013). [2] MathWorks DSP System Toolbox, http://www.mathworks.com/products/dsp-system (accessed 16 August 2013).

    [3] MathWorks Communications System Toolbox, http://www.mathworks.com/products/communications (accessed 16 August 2013).

    [4] MathWorks Phased Array System Toolbox, http://www.mathworks.com/products/phased-array (accessed 16 August 2013).

    [5] MathWorks Computer Vision System Toolbox, http://www.mathworks.com/products/computer-vision (accessed 16 August 2013).

    [6] MathWorks Simulink, http://www.mathworks.com/products/simulink (accessed 16 August 2013).

    [7] MathWorks Parallel Computing Toolbox, http://www.mathworks.com/products/parallel-computing (accessed 16 August 2013).

    [8] MathWorks Fixed-Point Designer, http://www.mathworks.com/products/fixed-point-designer (accessed 16 August 2013).

    [9] MathWorks MATLAB Coder, http://www.mathworks.com/help/coder/index.html (accessed 16 August 2013).

    [10] MathWorks HDL Coder, http://www.mathworks.com/products/hdl-coder (accessed 16 August 2013).

    [11] MathWorks HDL Verifier, http://www.mathworks.com/products/hdl-verifier (accessed 16 August 2013).

     

    点击关注了解更多精彩内容!!

     


    本章完

    2018/11/14

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 卷积码是广泛应用于卫星通信、无线通信等各种... 译码器是一种具有“翻译”功能的逻辑电路,这种电路能将输入二进制代码的各种状态,按照其原意翻译成对应的输出信号。Viterbi译码器是以Viterbi算法为基础设计的一种
  • 仿真结果表明,该译码器可实现良好的纠错功能。  RS(Reed-Solomon)码是差错控制领域中的一种重要线性分组码,既能纠正随机错误,又能纠正突发错误,且由于其出色的纠错能力,已被NASA、ESA、CCSDS等空间组织接受...
  • 利用哈夫曼编码进行信息通讯可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。 【实现要求】 系统应具有...
  • 提出了数字通信系统中在信道受到干扰时信道译码器检测或修正解调器送来错误信息的一种软件实现方案,该方案应用Visual C++6.0软件技术实现了卷积码编码器和维特比译码器功能,它不仅译码算法简单、易实现,而且可以...
  • 1、随机序列1和随机序列2要求不能一样,信道编码选择卷积码。 2、在信道编码后,加个扩频模块,用伪随机序列扩频。 扰码要求如下: 代码如下所示: err_rate = []; snr_min = -10; snr_max = 0; for snr = ...

    实验要求:

    1 、随机序列 1 和随机序列 2 要求不能一样,信道编码选择卷积码。
    2、在信道编码后,加个扩频模块,用伪随机序列扩频。

    扰码要求如下:

     代码如下所示:

    err_rate = [];
    snr_min = -10;
    snr_max = 0;
    for snr = snr_min:snr_max
        err_num = 0;
        for cir = 1:25000
            Ts = 1;%码元持续时间
            sample_rat = 100;%采样频率
            wav_freq = 10;%载波频率
            msg_num = 4;%选择生成码的个数
            exp_rat = 5;%扩频系数
            [msg] = rand_msg_cre(msg_num);%产生4个非全0随机信息
            [msg_out] = cre_m(msg,msg_num);%产生m序列
            [msg_scramblered] = scrambler(msg_out);%扰码处理
            [msg_conved] = conv_msg(msg_scramblered);%卷积码处理
            [msg_expanded] = freq_expand(msg_conved,exp_rat);%扩频
            [sig_BPSKed] = BPSK_code(msg_expanded,sample_rat,Ts,wav_freq);%2PSK编码
            [sig_channel] =awgn(sig_BPSKed,snr);%高斯信道
            [msg_rec] = BPSK_decode(sig_channel,sample_rat,Ts,wav_freq);%BPSK抽样解码
            [msg_de_expand] = Msg_de_expand(msg_rec,exp_rat);%反扩频
            [msg_vtb_decode] = vtb_decode(msg_de_expand);%维特比译码
            [msg_de_scramb] = scrambler(msg_vtb_decode);%扰码处理扰码处理后的信息不变
            [msg_de_m] = [msg_de_scramb(1),msg_de_scramb(2),msg_de_scramb(3),msg_de_scramb(4)];%m序列解出原信息
            err_num = err_num+sum(xor(msg,msg_de_m));
        end
        err_rate = [err_rate err_num/(cir*msg_num)];
    end
    snrr = snr_min:snr_max;
    semilogy(snrr,err_rate);xlabel("SNR(dB)");ylabel("error rate");

    各个函数代码如下所示:

    函数rand_msg_cre:

    function [rand_msg] = rand_msg_cre(rand_msg_num)
    %UNTITLED3 此处显示有关此函数的摘要
    %   产生信息,避免全0状态
    rand_msg = zeros(1,rand_msg_num);
    while sum(rand_msg) == 0
        rand_msg = randi([0,1],1,rand_msg_num);
    end
    end

    函数cre_m:

    function [msg_out] = cre_m(msg_in,length)
    %UNTITLED6 此处显示有关此函数的摘要
    %   产生m序列
    msg_out=zeros(1,length-1);
    for i=1:length^2-1
        msg_in(5)=xor(msg_in(4),msg_in(1));
        msg_out(i)=msg_in(1);
        msg_in(1)=msg_in(2);
        msg_in(2)=msg_in(3);
        msg_in(3)=msg_in(4);
        msg_in(4)=msg_in(5);
    end

    函数scrambler:

    function [msg_aft_scramb] = scrambler(msg_before_scramb)
    %UNTITLED 此处显示有关此函数的摘要
    %   此处显示详细说明
    m=length(msg_before_scramb);
    x(1:7)=[1 1 1 1 1 1 1];
    msg_aft_scramb=zeros(1,m);
    for i = 1:m
        x(8)=xor(x(4),x(7));
        x(7)=x(6);
        x(6)=x(5);
        x(5)=x(4);
        x(4)=x(3);
        x(3)=x(2);
        x(2)=x(1);
        x(1)=x(8);
        x_out(i)=x(1);
        msg_aft_scramb(i)=xor(msg_before_scramb(i),x_out(i));
    end
    

    函数conv_msg:

    function [msg_out] = conv_msg(msg_in)
    %UNTITLED2 此处显示有关此函数的摘要
    %   此处显示详细说明
    data_stream = [0,0];
    msg_out = [];
    for ik = 1:length(msg_in)
        data_stream = [data_stream,msg_in(ik)];
        ci = data_stream(ik+2);
        di = xor(data_stream(ik+2),data_stream(ik));
        ei = xor(xor(data_stream(ik+2),data_stream(ik+1)),data_stream(ik));
        msg_out = [msg_out,ci,di,ei];
    end

    函数freq_expand:

    function [msg_after_expand] = freq_expand(msg_before_expand,expand_ratio)
    %UNTITLED3 此处显示有关此函数的摘要
    %   此处显示详细说明
    msg_after_expand = [];
    m=length(msg_before_expand)*expand_ratio;
    x(1:7)=[1 1 1 1 1 1 1];
    msg_to_scramb=zeros(1,m);
    for i = 1:m
        x(8)=xor(x(4),x(7));
        x(7)=x(6);
        x(6)=x(5);
        x(5)=x(4);
        x(4)=x(3);
        x(3)=x(2);
        x(2)=x(1);
        x(1)=x(8);
        msg_to_scramb(i)=x(1);
    end
    for ik = 1:length(msg_before_expand)
        for jk = 1:expand_ratio
            msg_after_expand = [msg_after_expand,xor(msg_before_expand(ik),msg_to_scramb((ik-1)*expand_ratio+jk))];
        end       
    end

    函数BPSK_code:

    function [sig_BPSK] = BPSK_code(sig_into,sample_rat,Ts,wav_freq)
    %UNTITLED4 此处显示有关此函数的摘要
    %   此处显示详细说明
    sig_BPSK = [];
    Ph = 0:2*wav_freq*pi/sample_rat:2*pi*wav_freq*(Ts-1/sample_rat);%Ph为相位
    gt1 = -1*sin(Ph.*ones(1, Ts*sample_rat)); %通道消息码为1
    for ik = 1:length(sig_into)
        sig_BPSK = [sig_BPSK,(sig_into(ik)*2-1)*ones(1,length(Ph)).*gt1];
    end
    end

    函数BPSK_decode:

    function [Msg_decode] = BPSK_decode(sig_in,sample_rat,Ts,wav_freq)
    
    Ph = 0:2*wav_freq*pi/sample_rat:2*pi*wav_freq*(Ts*length(sig_in)/sample_rat-1/sample_rat);%Ph为相位
    
    sig_local = -1*sin(Ph.*ones(1,length(sig_in)));
    sig_rec = sig_in.*sig_local;
    
    hd = fir_des1;
    sig_lp = filter(hd,sig_rec);
    
    t1 = sample_rat/2:sample_rat:length(sig_in)-sample_rat/2;
    Msg_decode = [];
    for ik = 1:length(sig_in)/sample_rat
        Msg_decode = [Msg_decode,sign(sig_lp(t1(ik)))];
    end
    Msg_decode = (Msg_decode+ones(1,length(Msg_decode)))/2;
    end

    函数Msg_de_expand:

    function [msg_out] = Msg_de_expand(msg_rec,expand_rat)
    
    msg_out = [];
    m = length(msg_rec);
    x(1:7)=[1 1 1 1 1 1 1];
    msg_to_de_scramb=zeros(1,m);
    for i = 1:m
        x(8)=xor(x(4),x(7));
        x(7)=x(6);
        x(6)=x(5);
        x(5)=x(4);
        x(4)=x(3);
        x(3)=x(2);
        x(2)=x(1);
        x(1)=x(8);
        msg_to_de_scramb(i)=x(1);
    end
    Msg_to_decode = xor(msg_to_de_scramb,msg_rec);
    for ik = 1:expand_rat:length(msg_rec)-expand_rat+1
        msg_out((ik+expand_rat-1)/expand_rat) = sign(sum(Msg_to_decode(ik:(ik-1+expand_rat))));
    end
    end

    函数vtb_decode:

    function [msg_output] = vtb_decode(msg_input)
    %   code_pre 第一位为汉明距离,第二三位为预设的00,第四、五、六为第一、二、三个输入的码
    cir_len = length(msg_input)/3;
    code_pre = [0,0,0,0,0,0;
                0,0,0,0,0,1;
                0,0,0,0,1,0;
                0,0,0,0,1,1;
                0,0,0,1,0,0;
                0,0,0,1,0,1;
                0,0,0,1,1,0;
                0,0,0,1,1,1];
    code_conv = zeros(8,9);%输出序列存储位置
    for ik = 1:8%分8行,即000-111;
        for jk = 1:3%%先做1-3的幸存距离
            ci = code_pre(ik,jk+3);
            di = xor(code_pre(ik,jk+3),code_pre(ik,jk+1));
            ei = xor(xor(code_pre(ik,jk+1),code_pre(ik,jk+2)),code_pre(ik,jk+3));
            code_conv(ik,jk*3 - 2) = ci;
            code_conv(ik,jk*3 - 1) = di;
            code_conv(ik,jk*3 ) = ei;
        end%%%产生卷积码
        code_pre(ik,1) = sum(xor(code_conv(ik,1:9),msg_input(1:9)));%%汉明距
    end
    for lk = 1:4
        if code_pre(2*lk-1,1)<code_pre(2*lk,1)
            code_pre(2*lk,:) = code_pre(2*lk-1,:);
        else
            code_pre(2*lk-1,:) = code_pre(2*lk,:);
        end
    end
    %%%%%%至此1-3考察完毕
    
    for ik = 4:cir_len
        for jk = 1:8
            code_pre(jk,ik+3) = mod(jk+1,2);%%01010101
            ci = code_pre(jk,ik+3);
            di = xor(code_pre(jk,ik+3),code_pre(jk,ik+1));
            ei = xor(xor(code_pre(jk,ik+1),code_pre(jk,ik+2)),code_pre(jk,ik+3));
            code_conv(jk,ik*3-2) = ci;
            code_conv(jk,ik*3-1) = di;
            code_conv(jk,ik*3) = ei;%%产生三位卷积码
            code_pre(jk,1) = code_pre(jk,1)+sum(xor(msg_input(ik*3-2:ik*3),code_conv(jk,ik*3-2:ik*3)));%%将新增汉明距加到原有汉明距里面去
        end
        for lk = 1:4
            if code_pre(2*lk-1,1)<code_pre(2*lk,1)
                code_pre(2*lk,:) = code_pre(2*lk-1,:);
            else
            code_pre(2*lk-1,:) = code_pre(2*lk,:);
            end
        end%%筛选幸存路径
    end
    [data_min,p_min] = min(code_pre(:,1));
    msg_output = code_pre(p_min,4:3+cir_len);   
    end

    函数fir_des1:

    function Hd = fir_des1
    %FIR_DES1 返回离散时间滤波器对象。
    
    % MATLAB Code
    % Generated by MATLAB(R) 9.8 and DSP System Toolbox 9.10.
    % Generated on: 15-Apr-2021 19:48:15
    
    % Equiripple Lowpass filter designed using the FIRPM function.
    
    % All frequency values are in Hz.
    Fs = 100;  % Sampling Frequency
    
    Fpass = 1;              % Passband Frequency
    Fstop = 2;              % Stopband Frequency
    Dpass = 0.17099735734;  % Passband Ripple
    Dstop = 0.1;            % Stopband Attenuation
    dens  = 20;             % Density Factor
    
    % Calculate the order from the parameters using FIRPMORD.
    [N, Fo, Ao, W] = firpmord([Fpass, Fstop]/(Fs/2), [1 0], [Dpass, Dstop]);
    
    % Calculate the coefficients using the FIRPM function.
    b  = firpm(N, Fo, Ao, W, {dens});
    Hd = dfilt.dffir(b);
    
    % [EOF]

    运行结果如下所示:

     运行数据较多想快速出结果可减少cir循环

    展开全文
  • 仿真结果表明,该译码器可实现良好的纠错功能。  RS(Reed-Solomon)码是差错控制领域中的一种重要线性分组码,既能纠正随机错误,又能纠正突发错误,且由于其出色的纠错能力,已被NASA、ESA、CCSDS等空间组织接受...
  • 卷积码是广泛应用于卫星通信、无线通信等各种通信系统的... 译码器是一种具有“翻译”功能的逻辑电路,这种电路能将输入二进制代码的各种状态,按照其原意翻译成对应的输出信号。Viterbi译码器是以Viterbi算法为基础设
  • 译码准则

    千次阅读 2016-12-05 09:24:34
    译码准则一般都是知道信道矩阵,然后要求设计译码准则,课程要求掌握两种准则,我们一一介绍。最佳后验准则需要写出联合概率矩阵 PXYP_{XY} ,把每一列最大的概率圈出来,这就是对应的译码准则。最大似然译码准则...
  • 这要求在发送端通过一个编码系统对传输数据预先编码,在接收端将传来的数据进行译码,对于全双工信道(即可以双向传输信息的信道),毎端都需要一个完成的编/译码系统。试为这样的信息收发站编写一个哈夫曼编译码...
  • 哈夫曼编/译码器.zip

    2019-10-31 15:12:14
    对于双工信道( 即可以双向传输信息的信道 ), 每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编译码系统。 [ 基本要求 ] 一个完整的系统应具有以下功能: (1) I:初始化(Initialization)。...
  • 卷积码的维特比(Viterbi)译码

    千次阅读 2021-04-23 15:53:10
    维特比译码的性能相比分组码等其他编码的译码性能究竟好在哪里,如何来评估?编码约束度和监督位数量对维特比译码的性能是如何产生影响的,等等……直到前些天看到这篇来自MIT的数字通信系统课程的教案,诸多的疑惑...
  • 本课题是实现信源编解码:PCM编码+ 数据压缩+信道(加性噪声)+数据解压缩+PCM译码。利用C语言使编码器实现输入信号完成PCM技术的三个过程:采样、量化与编码,解码器实现还原原信号过程。 二、设计目的 脉冲编码...
  • 维特比译码器的Verilog设计(一)----维特比译码原理关于维特比译码1.编码过程中的状态转移和网格图表示如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、...
  • 利用哈夫曼编码进行通信可以提高信道利用率,缩短信息传输时间,降低传输成本。这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。写一个哈夫曼树编码译码系统。 2.基本...
  • 前言 上面几篇文章可以看到Polar码的优点,编码极其简洁,非常优雅 Polar 译码通过SC方式译码,在有限码长时,...同时它只适用于离散无记忆信道,很多视频都有提到过(例如台湾交通大学陈伯宁老师,以及原著里...
  • 5GNR漫谈6:PDSCH和PUSCH信道设计

    千次阅读 多人点赞 2020-04-20 23:26:03
    现在我们来看看具体PDSCH信道如何承载发射数据。关键的传输处理过程所需要的参数在UE的用户面(USER-PLANE)DCI信息和控制面(CONTROL-PLANE)RRC指令里面携带。在漫谈5里面我们已经了解到用于调度PDSCH的取DCI ...
  • 它本身并不具备信道编码检、纠错功能,仅起到信号预处理的作用。 块交织编码技术的基本原理与框图 块交织技术系统框图 示例说明 1、若输入数据经信道编码后为X1=(x1 x2 x3 x4 x5 x6); 2、发送端交织存储器为一个...
  • 1、从功能角度分: 检错码 纠错码 2、从对信息序列的处理方法分类: 分组码 卷积码 3、码元与原始信息位的关系: 线性码 非线性码 4、差错类型: 纠随机差错码 纠突发差错码 纠随机/突发差错码 *差错
  • 信息论之有噪信道编码详解
  • 用于已开发功能的应用程序之一(可以用于不同类型的网络协议) 卷积编码器,直接序列扩频,维特比解码器的安全加密和传输数据/消息的性能,非常强大的纠错能力。 附上整个系统的方框设计图: 每个块都是使用以下技术...
  •  KS57C2616B集成电路内部包括中央处理器,用以完成各种控制信号的输入/输出,FSK译码、各种信号指令的接收检测和转发,以及信道的选择、提供系统时钟、发射与接收的静双音频/脉冲拨号选择,振铃信号的检测、指示灯...
  • 信道与噪声

    2022-03-19 11:10:02
    1.狭义信道与广义信道: ...2.广义信道按照它包括的功能分为调制信道、编码信道。在研究调制与解调问题时,只关心调制器输出的信号形式、解调器输入端信号与噪声的最终特性,而不关心信号的中间变换过程
  • Huffman编码/译码问题

    2022-01-17 22:20:55
    对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编译码系统。 基本要求 一个完整的系统应具有以下功能: (1) I:初始化(Initialization)。从终端...
  • 移动通信普遍存在干扰与衰落的问题,这些问题会导致信号收发双方的信息差错,因此有必要增强数据在信道中传输时抵御各种干扰的能力,提高系统的可靠性,对要在信道中传送的数字信号进行的纠错检错编码的过程就是信道...
  • 课程设计哈夫曼编/译码系统

    千次阅读 热门讨论 2017-07-03 10:29:01
    问题描述:利用哈夫曼编码进行通信可以...对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站设计一个哈夫曼编译码系统。1.基本要求(1)初始化(Initialzation)。
  • 对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编译码系统。 一个完整的哈夫曼码的编译码系统系统应具有以下功能: I: 初始化(Initialization)...
  • 【单选题】若线性分组码{00011,10110,01101,11000,10010,10001},经过二元对称信道后输出码字为01100,则根据最小距离译码准则,应译为A. 00011B. 101更多相关问题[单选] 机电一体化系统中,作为各子系统之间...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,236
精华内容 894
关键字:

信道译码的功能