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

📄 buhuo.m

📁 扩频通信中的捕获问题
💻 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*')

⌨️ 快捷键说明

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