⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdma_reciever.m

📁 构建CDMA通信系统
💻 M
字号:
<matlab> CDMA业务信道接收机仿真实现
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                        % 
%  该函数仿真CDMA接收机的功能,包括解扩,解交织,信道编码(卷积码)        %
%  解码,信源编码(CRC)解码5个功能模块,生成用于数字基带传输的信号序列    %  
%                                                                        %  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [original_sequence] = cdma_reciever(mul_fad_sequence,frame_length,...
    crc_select,cov_select,in_info_len,in_supv_len,sf,add_bits,i_add_bits,max_delay,fade_sign)
% sequence           输入的待解扩序列
% frame_length      CRC编码的码字长度
% crc_select          CRC编码生成多项式的选项 1 - CRC_CCITT,2 - CRC_CIT,3 - CRC32
% cov_select         卷积码的编码其选择 1 - 约束长度为9,效率1/2,2 - 约束长度9,效率1/3
% in_info_len         交织器的信息位长度
% in_supv_len        交织器的监督位长度
% sf                     扩频因子
% add_bits            CRC编码时添加的尾比特
% i_add_bits          分组交织器添加的尾比特
% max_delay         信道延迟
% fade_sign          瑞利信道衰落符号
sequence = mul_fad_sequence;
len = length(sequence);
sequence = fade_sign.*sequence(1:(len-max_delay));
despread_seq = DS_modulation_demodulation(sequence,sf,2);     % 解扩部分
despread_seq = sign(despread_seq);
inter_seq = (despread_seq + 1)/2;                                           % 转单极性码
de_inter_seq = block_cancellation_interlace(...
    inter_seq,in_info_len,in_supv_len,i_add_bits);                         % 解交织
rev_seq = convolutional_decode_Viterbi(de_inter_seq,45,cov_select);         % 卷积解码
%%
if crc_select == 1 
    code_generator = 1;                                                          % CRC解码部分
    code_len = 16;
elseif crc_select == 2
    code_generator = 2;
    code_len = 16;
else
    code_generator = 3;
    code_len = 32;
end
iterate_num = length(rev_seq)/(frame_length+code_len); 
rev_seq = reshape(rev_seq,(frame_length+code_len),iterate_num);
rev_seq = rev_seq';
decode_seq = zeros(iterate_num,frame_length);
frame_error = 0;
for k = 1:iterate_num
    [output_seq,err] = cyclic_redundancy_decode(rev_seq(k,:),(frame_length+code_len),code_generator);
    if err == 1
        frame_error = frame_error + 1;
%         decode_seq(k,:) = 0.5 * ones(1,frame_length);
        decode_seq(k,:) = output_seq;
    else
        decode_seq(k,:) = output_seq;
    end
end
decode_seq = reshape(decode_seq',1,iterate_num*frame_length);       % 解码
if ~isempty(add_bits)                                               % 在接受端增加的一个参数add_bits
    len = iterate_num*frame_length;
    decode_seq((len-add_bits+1):len) = [];
end
original_sequence = 2*decode_seq - 1;                               % 得到原序列

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -