www.pudn.com > buhuo.rar > buhuo.m


 
clc, clear,close all, pause(1) 
 
%系统特性说明 
% 1:用GOLD码进行扩频 
% 
 
 
% 仿真参数预设 
SNR      = -20;         % Ec/No,扩频信号的信噪比。 
order    = 8;           % 扩频序列的阶数。其周期等于(2^order - 1) 
NumOfBit = 5;           % 单次仿真的信息一帧比特数量,取值500bit,等于1帧。 
MaxPhaseNum = 5;        % 捕获阶段时,对不同相位滑动得到的相关值从大到小排序,只对对前MaxPhaseNum个数值进行分析 
CaptureBitNum = 60;     % 累计捕获进行积分的次数。 
userNum       = 5;      % 进行扩频通信的用户数。单用户=1 
RecPhase      = fix((2^order - 1) * rand);    % 因为信道传输时延,扩频码当前的相位未知,需要进行捕获运算得到 
SimuBitNum    = 1000;  % 误码率仿真的bit数量 
% -------------------------------------------------------------- 
%  第一阶段。1:扩频信号生成和时延调整。 
% -------------------------------------------------------------- 
RxPNIndex = zeros(1,255);         % 初始化相位记录矩阵 
 
% 调用gold函数产生GOLD扩频码,并根据用户数选取GOLD序列,赋给PN变量。 
 
temp = gold(1, order); 
 
PN(1:userNum,:) = temp(1:userNum,:); 
 
for times = 1:CaptureBitNum       % 捕获运算次数 
     
    % 1.1 随机产生发射端的(多个)用户比特,每用户1 bit 
    userBits = randn(userNum, 1); 
    userBits(userBits <= 0) = -1; 
    userBits(userBits > 0) = 1; 
 
 
    % 1.2 发射端扩频,每次完成1个用户的1个bit的扩频,得到一个扩频信号矩阵。矩阵的行数为用户数量,矩阵的列数为扩频序列周期长度 
    for i = 1:userNum 
        DSFrame(i,:) = PN(i,:) * userBits(i);         % 扩频 
    end 
 
    % 1.3 产生信道噪声 
 
    noise = randn(1, 2^order - 1); 
 
    noise = 10^(-1 * SNR / 20) * noise;               % 根据SNR进行幅度调整 
 
 
    % 1.4 在接收端,多用户信号和信道噪声混叠在一起(多用户扩频信号彼此相加,再和信道噪声直接相加得到) 
 
    ReceiveTemp = sum(DSFrame, 1) + noise; 
 
    % 1.5 因为信道传输时延,扩频码当前的相位未知,需要进行捕获运算得到 
    % 仿真中,将接收信号进行随机时延,模拟未知的相位偏移。 
 
    if(RecPhase > 1) 
        Receive = ReceiveTemp(RecPhase:2^order - 1); 
        Receive = [Receive ReceiveTemp(1:RecPhase - 1)]; 
    else 
        Receive = ReceiveTemp; 
    end 
 
    % -------------------------------------------------------------- 
    %  第二阶段。捕获过程。 
    % -------------------------------------------------------------- 
    % ------------------------------------------------------------------------- 
 
    % 2 PN码相位捕获,对同一个接收信号(相位未知),将GOLD序列的每一个相位进行匹配相关运算,记录得到的最大值 
    % 步骤:1 将相位进行循环移位,并与接收信号进行解扩运算 
    %       2 对不同相位获得的解扩绝对值进行从大到小排序 
    %       3 RxPNIndex则记录最大MaxPhaseNum个相位出现的次数 
 
 
    %2.1 本地扩频码移位,并与接收信号进行相关预算 
    for RxPhase = 0:254 
        RxPN = PN(:, (RxPhase + 1):255);        % 对GOLD码移项 
        if (RxPhase > 0) 
            RxPN = [RxPN PN(:,1:RxPhase)]; 
        end 
        RecCorrValue(RxPhase + 1) = sum(Receive * RxPN(1,:)'); 
    end 
 
    %2.2 寻找获得最大相关值时的PN相位,从大到小排序 
    [temp1 PhaseIndex] = sort(abs(RecCorrValue), 'descend');    % 按照RecCorrValue绝对值从大到小排序  
    % PhaseIndex记录的是按照解扩运算绝对值从大到小排序后,所对应的相位。 
 
    %2.3 RxPNIndex记录着所有相位的解扩值出现在前MaxPhaseNum名的次数。进入一次,计数递增1。 
    RxPNIndex(PhaseIndex(1:MaxPhaseNum)) = RxPNIndex(PhaseIndex(1:MaxPhaseNum)) + 1;    % 对取得MaxPhaseNum个解扩最大相关值的相位编号进行累加 
    MaxCorrValue(times) = max(temp1);    % 记录最大的相关值 
 
end 
 
[temp1 RxPNPhase] = max(RxPNIndex); 
 
 
if(RxPNPhase - RecPhase ~= 0) 
    error('Capture PN failed!!!'); 
end 
 
RxPNPhase 
 
% -------------------------------------------------------------- 
%  第三阶段。捕获已完成,开始正常的解扩。 
% -------------------------------------------------------------- 
% ------------------------------------------------------------------------- 
    
% 利用捕获的相位,接收机产生偏移的GOLD码,进行解扩和误码率计算。 
 
if (RxPNPhase > 1) 
    RxPN = PN(:, RxPNPhase:255);        % 对GOLD码移项 
    RxPN = [RxPN PN(:,1:RxPNPhase - 1)]; 
else 
    RxPN = PN;        % 对GOLD码移项 
end 
 
ErrorBitCount = 0; 
 
for bitNum = 1:SimuBitNum       % 误码率仿真的bit数量 
     
    % 3.1 随机产生发射端的(多个)用户比特,每用户1 bit 
    userBits = randn(userNum, 1); 
    userBits(userBits <= 0) = -1; 
    userBits(userBits > 0) = 1; 
 
    % 3.2 发射端扩频,每次完成1个用户的1个bit的扩频,得到一个扩频信号矩阵。矩阵的行数为用户数量,矩阵的列数为扩频序列周期长度 
    for i = 1:userNum 
        DSFrame(i,:) = PN(i,:) * userBits(i);         % 扩频 
    end 
 
    % 3.3 产生信道噪声 
 
    noise = randn(1, 2^order - 1); 
 
    noise = 10^(-1 * SNR / 20) * noise;               % 根据SNR进行幅度调整 
 
 
    % 3.4 在接收端,多用户信号和信道噪声混叠在一起(多用户扩频信号彼此相加,再和信道噪声直接相加得到) 
 
    ReceiveTemp = sum(DSFrame, 1) + noise; 
 
    % 3.5 因为信道传输时延,扩频码当前的相位未知,需要进行捕获运算得到 
    % 仿真中,将接收信号进行随机时延,模拟未知的相位偏移。 
 
    if(RecPhase > 1) 
        Receive = ReceiveTemp(RecPhase:2^order - 1); 
        Receive = [Receive ReceiveTemp(1:RecPhase - 1)]; 
    else 
        Receive = ReceiveTemp; 
    end 
 
    
    % 3.6 误码个数记录 
    RecBit = sum(Receive * RxPN(1,:)');    
    RecBit(RecBit <= 0) = -1; 
    RecBit(RecBit > 0) = 1; 
 
    TxBit = userBits(1);          % 只分析用户1的误码率,其它用户类似处理 
     
    if (TxBit ~= RecBit) 
        ErrorBitCount = ErrorBitCount + 1 
        pause(0.001), bitNum 
    end 
 
end 
 
BER = ErrorBitCount / SimuBitNum 
     
 
plot(SNR, BER,'r*')