实验要求:
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循环