您现在的位置:首页 >> 技术文章 >> MATLAB技术 >> 内容

MATLAB代做|FPGA代做-Viterbi译码+QPSK调制解调实验

时间:2021-11-17 0:43:13 点击:

  核心提示:MATLAB代做|FPGA代做-Viterbi译码+QPSK调制解调实验...

1.问题描述:

仿真Viterbi算法,仿真出在AWGN信道下的误码率对Eb/N0曲线,调制方式可以选择QPSK或者16QAM。实验所用的卷积码可以选用(7,5)。

       卷积码的译码方法可分为代数译码和概率译码两大类,概率译码比较常用的有两种,一种叫序列译码,另一种叫Viterbi译码法,本实验主要是Viterbi译码方法的实现。

它的基本思想是把接收到的矢量,和网格图上诸种可能的路径比较,删去距离大的路径,保留距离小的路径,以距离最小路径作为发码的估值

下面利用图解的方法来说明维特比解码的方法和运作过程。设输入编码器的信息序列为(1 1 0 1 1 0 0 0 ),则由编码器输出的序列 Y=(1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 ),编码器的状态转移路线为 abcdbdca。若收到的序列R=(0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 0  ),对照网格图来说明维特比译码的方法。

      由于该卷积码的约束长度为 3位,因此先选择接收序列的前 6 位序列R1 =(0 1 0 1 0 1),同到达第 3时刻可能的 8 个码序列(即 8 条路径)进行比较,并计算出码距。该例中到达第3 时刻a点的路径序列是(0 0 0 0 0 0)和(1 1 1 0 1 1 ) ,它们与R1的距离分别是 3 和4;到达第 3 时刻b点的路径序列是(0 0 0 0 1 1)和(1 1 1 0 0 0) ,它们与R1的距离分别是 3 和4,到达第 3 时刻c点的路径序列是(0 0 1 1 1 0)和(1 1 0 1 1 0) ,与 R1 的距离分别是 4 和1;到达第 3 时刻d 点的路径序列是(0 0 1 1 0 1)和(1 1 0 1 1 0) ,与 R1 的距离分别是 2 和3。上述每个节点都保留码距较小的路径为幸存路径,所以幸存路径码序列是(0 0 0 0 0 0) 、 (0 0 0 0 1 1) 、 (1 1 0 1 0 1)和(0 0 1 1 0 1) ,如图4(a)所示。用与上面类同的方法可以得到第 4、5、6、7 时刻的幸存路径。需指出对于某一个节点而言比较两条路径与接收序列的累计码距时,若发生两个码距值相等,则可以任选一路径作为幸存路径,此时不会影响最终的译码结果。图 4(b)给出了第 5 时刻的幸存路径,在码的终了时刻a状态,得到一根幸存路径,如图 4(c)所示。由此看到译码器输出是R’ =(1 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0) ,即可变换成序列(1 1 0 1 1 0 0 0) ,恢复了发端原始信息。比较 R’和R序列,可以看到在译码过程中己纠正了在码序列第 1 和第7位上的差错。当然,差错出现太频繁,以至超出卷积码的纠错能力,则会发生误纠,这是不希望的。

Viterbi译码的缺点是随着约束长度的增加算法的复杂度增加很快。约束长度N为7时要比较的路径就有64条,为8时路径变为128条。 (2<<(N-1))。所以Viterbi译码一般应用在约束长度小于10的场合中。

2.3 QPSK调制与解调

本实验重在Viterbi译码,所以调制解调只采用了简单的对应关系,使用B调制方式,11->(1,1),01->(-1.1),00->(-1,-1),10->(1,-1),解调时第一象限判为11,第二象限判为01,第三象限判为00,第四象限判为10.

2.部分程序:

 

clc

clear all

Frame = 100;

for i = 1 : Frame

SignNum = 1000;

 Length = SignNum + 3;

OrigiSeq=(sign(randn(1,SignNum))+1)/2;       

OrigiSeq=[OrigiSeq 0 0 0] ;                      

ConCode = ConEncode(OrigiSeq, Length);       

QPSKCode = QPSKEncode(ConCode, Length);       

a = 1: -0.1 : 0.1;

p = 10*log10(a);

error = zeros(10,10);

for k = 1:length(p)

    NoiseSeq = wgn(1,2*Length,p(k));              

    RecCode = QPSKCode + NoiseSeq;                

    DQPSKCode = QPSKDecode(RecCode, Length);      

    Decoder = Viterbi(DQPSKCode, Length);         

    error(i,k) = sum(abs(Decoder-OrigiSeq));

end

end

AveError = zeros(1,10);

for column = 1:10

    for row = 1:10

        AveError(column) = AveError(column) + error(row,column);

    end

end

AveError;

x = 1:10;

plot(x,AveError./1000);

xlabel('Eb/N0')

ylabel('Pe')

grid on

function ConCode = ConEncode(OrigiSeq, Length)

ConCode1 = mod(conv(OrigiSeq, [1,1,1]), 2);

ConCode2 = mod(conv(OrigiSeq, [1,0,1]), 2);

ConCode1 = ConCode1(1:Length);

ConCode2 = ConCode2(1:Length);

ConCode = zeros(1,2*Length);

    for j = 1 : Length

        ConCode(2*j-1) = ConCode1(j);

        ConCode(2*j) = ConCode2(j);

    end

function QPSKCode = QPSKEncode(ConCode, Length)

 

QPSKCode = zeros(size(ConCode));

for i = 1 : Length

    L = 2*i-1;

    R = 2*i;

    if ConCode(L:R) == [1 1]

        QPSKCode(L:R) = [1 1];

    elseif ConCode(L:R) == [0 1]

        QPSKCode(L:R) = [-1 1];

    elseif ConCode(L:R) == [0 0]

        QPSKCode(L:R) = [-1 -1];

    else

        QPSKCode(L:R) = [1 -1];

    end

end

              

function DQPSKCode = QPSKDecode(QPSKCode, Length)

 

 DQPSKCode = zeros(size(QPSKCode));

for i = 1 : Length

    L = 2*i-1;

    R = 2*i;

    if QPSKCode(L)>=0 &  QPSKCode(R)>=0

        DQPSKCode(L:R) = [1 1];

    elseif QPSKCode(L)<=0 &  QPSKCode(R)>=0

        DQPSKCode(L:R) = [0 1];

    elseif QPSKCode(L)<=0 &  QPSKCode(R)<=0

        DQPSKCode(L:R) = [0 0];

    else

        DQPSKCode(L:R) = [1 0];

    end

end

 

function Decoder = Viterbi(ConCode,Length)

     RecSeq = ConCode;

    Decoder = zeros(1,Length);       

    D = zeros(1,4);                  

    DTemp = D;

    RouteS0 = zeros(1,2*Length);     

    RouteS1 = zeros(1,2*Length);     

    RouteS2 = zeros(1,2*Length);     

    RouteS3 = zeros(1,2*Length);     

    for k = 1 : Length

        if k == 1                    

            D(1) = RecSeq(1) + RecSeq(2);

            D(2) = abs(RecSeq(1)-1) + abs(RecSeq(2)-1);

        elseif k == 2                 

            DTemp = D;                

            DS0_S0 = RecSeq(3) + RecSeq(4);

            DS0_S1 = abs(RecSeq(3)-1) + abs(RecSeq(4)-1);

            DS1_S2 = abs(RecSeq(3)-1) + RecSeq(4);

            DS1_S3 = RecSeq(3) + abs(RecSeq(4)-1);

            D(1) = DTemp(1) + DS0_S0;

            D(2) = DTemp(1) + DS0_S1;

            D(3) = DTemp(2) + DS1_S2;

            D(4) = DTemp(2) + DS1_S3;

            RouteS0(1:4) = [0 0 0 0];

            RouteS1(1:4) = [0 0 1 0];

            RouteS2(1:4) = [1 0 0 1];

            RouteS3(1:4) = [1 0 1 1];

        else

            DS0_S0 = RecSeq(2*k-1) + RecSeq(2*k); 

            DS2_S0 = abs(RecSeq(2*k-1)-1) + abs(RecSeq(2*k)-1);

            DS0_S1 = DS2_S0;

            DS2_S1 = DS0_S0;

            DS1_S2 = abs(RecSeq(2*k-1)-1) + RecSeq(2*k);

            DS3_S2 = RecSeq(2*k-1) + abs(RecSeq(2*k)-1);

            DS1_S3 = DS3_S2;

            DS3_S3 = DS1_S2;

           

             RS0Temp = RouteS0(1:2*k-2);

            RS1Temp = RouteS1(1:2*k-2);

            RS2Temp = RouteS2(1:2*k-2);

            RS3Temp = RouteS3(1:2*k-2);

            DTemp = D;

           

             if (DTemp+DS0_S0 <= DTemp(3)+DS2_S0)

                D(1) = DTemp(1) + DS0_S0;

                RouteS0(1:2*k) = [RS0Temp 0 0];

            else

                D(1) = DTemp(3) + DS2_S0;

                RouteS0(1:2*k) = [RS2Temp 0 0];

            end

            if (DTemp(1)+DS0_S1 <= DTemp(3)+DS2_S1)

                D(2) = DTemp(1) + DS0_S1;

                RouteS1(1:2*k) = [RS0Temp 1 0];

            else

                D(2) = DTemp(3) + DS2_S1;

                RouteS1(1:2*k) = [RS2Temp 1 0];

            end

           

            if (DTemp(2)+DS1_S2 <= DTemp(4)+DS3_S2)

                D(3) = DTemp(2) + DS1_S2;

                RouteS2(1:2*k) = [RS1Temp 0 1];

            else

                D(3) = DTemp(4) + DS3_S2;

                RouteS2(1:2*k) = [RS3Temp 0 1];

            end

           

            if (DTemp(2)+DS1_S3 <= DTemp(4)+DS3_S3)

                D(4) = DTemp(2) + DS1_S3;

                RouteS3(1:2*k) = [RS1Temp 1 1];

            else

                D(4) = DTemp(4) + DS3_S3;

                RouteS3(1:2*k) = [RS3Temp 1 1];

            end

        end

    end

    for m = 1 : Length

        if (m == 1)

            if (RouteS0(1) == 0)

                Decoder(1) = 0;

            else

                Decoder(1) = 1;

            end

        elseif (m == 2)

                if (RouteS0(3) == 0)

                    Decoder(2) = 0;

                else

                    Decoder(2) = 1;

                end

        else

            L1 = 2*m - 3;

            R1 = 2*m - 2;

            L2 = 2*m - 1;

            R2 = 2*m;

            if ((RouteS0(L1:R1)==[0 0]|RouteS0(L1:R1)==[0 1]) & RouteS0(L2:R2)==[0 0])

                Decoder(m) = 0;

            elseif ((RouteS0(L1:R1)==[1 0]|RouteS0(L1:R1)==[1 1]) & RouteS0(L2:R2)==[0 1])

                Decoder(m) = 0;

            else

                Decoder(m) = 1;

            end

        end

    end

3.仿真结论:

联系:highspeedlogic

QQ :1224848052

微信:HuangL1121

邮箱:1224848052@qq.com

网站:http://www.mat7lab.com/

网站:http://www.hslogic.com/

微信扫一扫:

作者:Viterbi译码+QPSK调制解调实验 来源:Viterbi译码+QPSK调制解调实验
  • 您是如何找到本站的?
  • 百度搜索
  • Google搜索
  • 查阅资料过程中
  • 论坛发现
  • 百度贴吧发现
  • 朋友介绍
本站最新成功开发工程项目案例
相关文章
  • 没有相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
  • matlab代做|matlab专业代做|matlab淘宝代做|python人工智能代做|FPGA项目合作|C代做|C++代做(www.hslogic.com) © 2022 版权所有 All Rights Reserved.
  • Email:highspeed_logic@163.com 站长QQ: 1224848052

    专业代做/代写/承接、MATLAB、SIMULINK、FPGA项目、博士/硕士/本科课题、Coursework、Eassy、Assignment