% 直扩频信号生成
clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
% 创建输入信号
num_bits = 12; % 定义要发送的比特数
input_signal = randi([0,1],1,num_bits); % 生成随机信号
% 修改输入信号,使其以1和-1表示
input_signal(input_signal==0) = -1;
% 生成伪随机噪声码
chip_length = 8;
PN_code = randi([0,1],1,length(input_signal)*chip_length);
PN_code(PN_code==0) = -1;
% 扩展输入信号与伪随机码对齐
for i=0:length(input_signal)-1
exp_input(chip_length*i+1:chip_length*i+chip_length) = input_signal(i+1);
end
% 生成直扩频信号
% 由于信号以1和-1表示,直接相乘
dsss_signal = exp_input .* PN_code;
% 开始均匀噪声测试
for noise_range=0:.001:1
% 向DSSS信号中添加噪声
noise = random('unif',-noise_range,noise_range,[1,length(dsss_signal)]);
noisy_signal = noise + dsss_signal;
% 提取原始信号
extracted_signal = noisy_signal ./ PN_code;
% 判断信号正负
extracted_signal(extracted_signal>=0) = 1;
extracted_signal(extracted_signal<0) = -1;
% 检查提取信号是否匹配输入
check = find(exp_input == extracted_signal); % 比较元素
if (length(check) <= length(exp_input)/2) % 若匹配少于50%
break
end
% 对码片长度积分
recovered_signal = sum(reshape(extracted_signal,chip_length,length(input_signal)));
% 再次判断正负
recovered_signal(recovered_signal>=0) = 1;
recovered_signal(recovered_signal<0) = -1;
end
sprintf('The max range is: %g to %g.',-noise_range,noise_range)
%% Plot
subplot(5,1,1)
stairs(-.5:length(input_signal)+2,[0 input_signal 0 0])
title('输入信号')
axis([0.4 length(input_signal)+.6 -1.1 1.1])
subplot(5,1,2)
stairs(-.5:length(PN_code)+1,[0 PN_code 0])
title('伪随机码')
axis([0 length(PN_code)+.6 -1.1 1.1])
subplot(5,1,3)
stairs(-.5:length(dsss_signal)+1,[0 dsss_signal 0])
title('直扩频信号')
axis([0 length(dsss_signal)+.6 -1.1 1.1])
subplot(5,1,4)
stairs(-.5:length(noisy_signal)+1,[0 noisy_signal 0])
title('带噪信号')
axis([0 length(noisy_signal)+.6 1.1*min(noisy_signal) 1.1*max(noisy_signal)])
subplot(5,1,5)
stairs(-.5:length(recovered_signal)+2,[0 recovered_signal 0 0])
title('恢复信号')
axis([0.44 length(input_signal)+.6 -1.1 1.1])