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

📄 matlab_cdma.txt

📁 该程序仿真CDMA接收机的功能
💻 TXT
字号:
<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;                               % 得到原序列
 
14:11 | 添加评论 | 阅读评论 (1) | 固定链接 | 引用通告 (0) | 记录它
<matalb> CDMA信道仿真-AWGN多径衰落信道
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                                                         % 
%  该函数仿真CDMA系统的信道,在输入所需用户序列和其他干扰用户序列后     %
%  在信号上叠加高斯白噪声,干扰用户多径干扰和所需用户的多径干扰和衰落。 %  
%  并根据输入延时曲线产生信道延时,输出mul_fad_sequence为信道信号输出  %
%  max_delay为信道最大延迟,fade_sign为瑞利信道中最大幅度分量的衰落量   %
%  mpath_amp为信道多径的幅度因子                                                        %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [mul_fad_sequence,max_delay,fade_sign,rake_rev_sequence,mpath_amp] = cdma_channel_simulation(...
    sequence,sf,mpath_delay,eb_no,k_factor)
% sequence      发射机的输出序列
% sf            扩频因子
% mpath_delay   多径传输延时
% snr           信道信噪比
% k_factor      莱斯k因子
mpath_delay = sort(mpath_delay);                                  % 保证多径延时按照升序排列
eb_no_linear = 10^(eb_no/10);                                     % 转换信号噪声比
[signal_row,signal_len] = size(sequence);
if signal_row == 1                                                        % 初始化干扰用户数目
    interfering_num = 0;
else
    interfering_num = signal_row - 1;
end
%%                                                              
mpath_len = length(mpath_delay);                                % 多径成分,得到多径延迟曲线的长度
mpath_amp(2:mpath_len) = rand(1,mpath_len-1);           % 随机生成多径成分幅度
scatter_power = mpath_amp*mpath_amp';                    % 多径成分离散功率
mpath_amp(1) = sqrt(scatter_power*k_factor);              % 视距成分的幅度(LOS)
[max_mpath_amp,max_index] = max(mpath_amp);          % 得到多径分量的最大幅度
mpath_amp = mpath_amp/max_mpath_amp;           % 归一化多径衰落幅度,最大幅度因子为1
 
% 设计衰落信号的IIR滤波器
FilterOrder = 4; Ripple = 0.5; BW = 0.01;               % 滤波器阶数为4,通带衰减为0.5,带宽0.01
[b,a] = cheby1(FilterOrder,Ripple,BW);                   % 得到切比雪夫1型滤波器的参数
%%
%生成信道噪声
noise_amplitude = sqrt(sf/(2*eb_no_linear));          
                                 % 计算噪声的强度,如果扩频因子越大,信号对扩频序列的影响也越大
                                 % 信道噪声与信噪比成反比,信噪比越大,噪声幅度越小
max_delay = max(mpath_delay);                          % 得到最大延时
len = signal_len;
desired_noise = noise_amplitude*randn(1,len+max_delay);                 
                               % 所需的噪声序列,长度要比信源序列的长度长最大延时单位
rake_desired_noise = desired_noise(1:len); 
%%
mpath_len = length(mpath_delay);                               % 多径成分的向量长度
interfering_sequence = sequence(2:(interfering_num+1),:);
if interfering_num > 0                                                  % 如果存在干扰器
    interfering_signal = zeros(interfering_num,len+max_delay);          % 初始化干扰器的信号
    rake_interfering_signal = zeros(mpath_len,len);
    for k = 1:mpath_len                                             % 利用多径延时曲线成员的数量开始循环
        rake_interfering_signal(k,:) = sum(mpath_amp(k)*...
            interfering_sequence,1);                                    % 多径叠加,但消除延迟
        index = 1+mpath_delay(k):len+mpath_delay(k);        % 设置索引号
        interfering_signal(:,index) = ...                                % 多径干扰信号采用加性叠加的方式
            interfering_signal(:,index) + ...
            mpath_amp(k)*interfering_sequence;       % mpath_amp相当于干扰码序列的权重因子
    end
end
%%
zf = zeros(FilterOrder,mpath_len);
desired_sequence = sequence(1,:);
desired_mpath_signal = zeros(1,len+max_delay);                          % 初始化所需的多径信号
rake_mpath_signal = zeros(mpath_len,len);
for k = 1:mpath_len                                          
    if k == 1
        fading = ones(1,len);
    else
        fading = randn(1,len/(2^sf-1)) + k*randn(1,len/(2^sf-1));
                                                                                     % 信道模型,瑞利随机过程发生器
        [fading zf(:,k)] = filter(b,a,fading,zf(:,k));
        fading = interp(fading,(2^sf-1));
        fading = abs(fading/sqrt(mean(fading.*conj(fading))));
    end
    if k == max_index
        fade_sign = sign(fading);
    end
    rake_mpath_signal(k,:) = (mpath_amp(k)*fading).*desired_sequence;   
                                                                        % rake不含延时的所需用户的多径衰落分量
    index = 1+mpath_delay(k):len+mpath_delay(k);
    desired_mpath_signal(index) = ...                                   
                                                                  % 利用瑞利随机过程发生器生成的随机衰落序列
        desired_mpath_signal(index)+...                                 % 产生衰减的效果
        (mpath_amp(k)*fading).*desired_sequence;
end
%%
if interfering_num > 0                                                  
% 合并用户多径信号,干扰用户多径信号和信道高斯白噪声
    mul_fad_sequence = desired_mpath_signal + ...
        sum(interfering_signal,1) + desired_noise;
    for k = 1:mpath_len
        rake_rev_sequence(k,:) = rake_mpath_signal(k,:) + ...
            rake_interfering_signal(k,:) + rake_desired_noise;
    end
else
    mul_fad_sequence = desired_mpath_signal + desired_noise;
    for k = 1:mpath_len
        rake_rev_sequence(k,:) = rake_mpath_signal(k,:) + rake_desired_noise;
    end
end
 
 
14:07 | 添加评论 | 固定链接 | 引用通告 (0) | 记录它
<matlab> CDMA业务信道发射机数字基带传输仿真实现
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%                                                                                                            %
%  该函数仿真CDMA发射机的功能,包括随机序列的产生,信源编码尾比特添加,    %
%  信道编码(卷积编码),分组交织和扩频调制6个功能模块,生成用于数字基带      %
%  传输的信号序列,输出还包括用于解调所需要的信源编码尾比特值add_bits,     %
%  交织器的尾比特值i_add_bits                                                                    %
%                                                                                                            %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [sequence,source_amb,add_bits,i_add_bits] = cdma_transmitter(ran_len,sam_rate,frame_length,...
    crc_select,cov_select,in_info_len,in_supv_len,sf,inter_num)
% ran_len             信源随机序列的长度
% sam_rate          信源随机序列采样率
% 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                     扩频因子
% inter_num         干扰用户数
[source_amb,source] = original_random_signal(ran_len,sam_rate);         % 信号源生成随机序列
%%
iterate_num = floor(length(source)/frame_length);                             % CRC编码部分
add_bits = [];
if rem(ran_len*sam_rate,frame_length) ~= 0
    add_bits = frame_length - rem(ran_len*sam_rate,frame_length);
    iterate_num = iterate_num + 1;
end
source = add_tail_bits(source,add_bits);
temp_sou = reshape(source,frame_length,iterate_num);                        
temp_sou = temp_sou';
if crc_select == 1 
    code_generator = 1;
    code_len = 16;
elseif crc_select == 2
    code_generator = 2;
    code_len = 16;
else
    code_generator = 3;
    code_len = 32;
end
crc_seq = zeros(iterate_num,(frame_length+code_len));
for k = 1:iterate_num
    crc_seq(k,:) = cyclic_redundancy_code(temp_sou(k,:),code_generator);
end
crc_seq = reshape(crc_seq',1,iterate_num*(frame_length+code_len));
%%
seq = add_tail_bits(crc_seq,45);                                               % 卷积编码部分
conv_seq = convolutional_code(seq,cov_select);
[inter_seq,i_add_bits] = block_interlacement(...
    conv_seq,in_info_len,in_supv_len);                                       % 分组交织部分
inter_seq = 2*inter_seq - 1;                                                    % 转双极性码
desired_seq = DS_modulation_demodulation(inter_seq,sf,1);        % 扩频调制部分
len = length(desired_seq);
sequence = zeros((1+inter_num),len);
sequence(1,:) = desired_seq;                                                  % 得到所需的数字基带传输序列
len = 2^sf - 1;
if inter_num ~= 0
    off_set = floor(len/inter_num);
end
for k = 1:inter_num
    [source_ambipolar,source] = original_random_signal(ran_len,sam_rate);% 信号源生成随机序列
    iterate_num = floor(length(source)/frame_length);                           % CRC编码部分
    add_bits = [];
    if rem(ran_len*sam_rate,frame_length) ~= 0
        add_bits = frame_length - rem(ran_len*sam_rate,frame_length);
        iterate_num = iterate_num + 1;
    end
    source = add_tail_bits(source,add_bits);
    temp_sou = reshape(source,frame_length,iterate_num);
    temp_sou = temp_sou';
    crc_seq = zeros(iterate_num,(frame_length+code_len));
    for n = 1:iterate_num
        crc_seq(n,:) = cyclic_redundancy_code(temp_sou(n,:),code_generator);
    end
    crc_seq = reshape(crc_seq',1,iterate_num*(frame_length+code_len));
    
    seq = add_tail_bits(crc_seq,45);                                                   % 卷积编码部分
    conv_seq = convolutional_code(seq,cov_select);
    inter_seq = block_interlacement(conv_seq,in_info_len,in_supv_len); % 分组交织部分
    inter_seq = 2*inter_seq - 1;                                                        % 转双极性码
    interfering_seq = DS_modulation_demodulation(inter_seq,sf,1,k*off_set);     
                                                                                                   % 扩频调制部分
    sequence(k+1,:) = interfering_seq;         % 得到所需的数字基带传输序列
end
 

⌨️ 快捷键说明

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