通信原理 实验:加入m序列、扰码、扩频、卷积码以及维特比译码功能的数字基带系统仿真

实验要求:

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循环

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值