• 大小: 2KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-17
  • 语言: Matlab
  • 标签: MATLAB  

资源简介

m序列产生与卷积编码的设计实验,用MATLAB进行仿真,代码在压缩包中。

资源截图

代码片段和文件信息

function demo
input=randi([01][115]);%输入信号
figure
subplot(221);
drawSig(input);
grid on; title(‘Input Code‘);
M=mseq([1 0 0 1]);
subplot(222);
drawSig(M);
grid on; title(‘M Code‘);
input_r=scramble(input);%加扰
subplot(223);
drawSig(input_r);
grid on; title(‘Output Code after scramble‘);
Y=coder(input_r);%进行卷积编码
subplot(224);
drawSig(Y);
grid on; title(‘Output Code after encoding‘);
SNR =5;
S=awgn(YSNR);%经过高斯信道
G = panjue(S);
figure
subplot(221);
drawSig(G);
grid on; title(‘Output Code after Gauss channel‘);
O=decoder(G);%维特比译码
subplot(222);
drawSig(O);
grid on; title(‘Output Code after viterbi decoding‘);
Res=scramble(O);%解扰
subplot(223);
drawSig(Res);
grid on; title(‘Output Code after descramble‘); 
% errorrate
end

function  errorrate

SNRdb = 5:1:20;
msg = randi([01][1100]);
cycl =50;
ber =zeros(cycllength(SNRdb));
n=length(msg);
for i=1:cycl
    for j=1:length(SNRdb)
        input_r=scramb(msg);
        code = encoding(input_r);
        addnoise=awgn(codeSNRdb(j)‘measured‘);  
        Q = panjue(addnoise);
        L=decoder(Q);
        Out=scramb(L);
        [numberratio] = biterr(msgOut);
        ber(ij) = ratio;
    end
end
ber=mean(ber);
figure
semilogy(SNRdbber‘B‘)title(‘Error Rate‘);grid on;
xlabel(‘rb/dB‘);ylabel(‘Pe‘);
end



function [seq]=mseq(coef)
% 此函数用来生成m序列
% coef为反馈系数向量
m=length(coef);
len=2^m-1; % 得到最终生成的m序列的长度     
backQ=0; % 对应寄存器运算后的值,放在第一个寄存器
seq=zeros(1len); % 给生成的m序列预分配
registers = [1 zeros(1 m-1)]; % 给寄存器分配初始结果
for i=1:len
    seq(i)=registers(m);
    backQ = mod(sum(coef.*registers)  2); %特定寄存器的值进行异或运算,即相加后模2
    registers(2:length(registers)) = registers(1:length(registers)-1); % 移位
    registers(1)=backQ; % 把异或的值放在第一个寄存器的位置
end
end

%4级反馈移位寄存器产生16位m序列
function Y=mxulie()
F(100)=0;
a3=1;
a2=0;
a1=0;
a0=0;
for i=1:100
    F(i)=a0;
    a0=a1;
    a1=a2;
    a2=a3;
    a3=mod((a3+F(i))2);
end
Y=F;
end


function y=encoding(s) 
r=[0 0 0];
x=zeros(1length(s)*3);      %为编码后的码字分配空间 
for i=1:length(s) 
    x(3*i-2)=mod((s(i))2);   %由生成多项式画出编码器得来
    x(3*i-1)=mod((s(i)+r(2))2); 
    x(3*i)=mod((s(i)+r(1)+r(2))2); 
    r(3)=r(2);
    r(2)=r(1);                           %运算一次后移位
    r(1)=s(i); 
end
y=x;
end

% 1/33卷积编码
function Y = coder( X )
len=length(X);
T=zeros(1len+3);
F=zeros(1len*3);
for i=4:len+3
    T(i)=X(i-3);
end
for i=1:len
    F(3*(i-1)+1)=T(i+3);
    F(3*(i-1)+2)=xor(T(i+3)T(i+1));
    F(3*(i-1)+3)=xor(xor(T(i+3)T(i+2))T(i+1));
end
Y=F;
end



function  Y = panjue(X)
n=length(X);
G(n)=0;
for i=1:n
    if X(i)>0.5
        G(i) =1;
    else
        G(i) =0;
    end
end
Y=G;
end


%1/33维特比卷积解码
function Y = decoder( X )
len=length(X);
Path=zeros(4len/3‘int8‘);%4条幸存路径
Path_t=zeros(4len/3‘int8‘);
Da=0;Db=0;Dc=0;Dd=0;%抵达abcd总汉明距离
Pa=1;Pb=2;Pc=3;Pd=4;%abcd路径指针
T(9)=0;
for i=1:9
    T(i)=X(i);
end
%a
tp1=dist(T[0 0 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        6809  2019-03-20 20:53  demo.m

评论

共有 条评论