📄 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*')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -