📄 shi2007_2_1.m
字号:
% 差分解调延时的长度为一个原始信息bit长度
% 对解调数据进行符号判决,然后在对1bit内的数据求和过门限比较
% 针对不同的信噪比测试误码率
clear all
close all
clc
%-------------------------------控制信号&全局变量---------------------------%
loop_time = 12; % 测试次数
NOISE_COF = zeros(loop_time,1); % 每次测试的信噪比大小
for snr_i = 1:loop_time
NOISE_COF(snr_i) = sqrt(0.5*10^(-(-5.5 + (snr_i-1)*0.5)/10));
end
noise_ctrl = 1; % 噪声控制:1表示-受噪声影响,其他值表示不受噪声影响
fd_ctrl = 1; % 频偏控制信号,1表示在正负30KHz内的随机变量,其他表示固定值
threshold = 3.95; % 判决门限,仿真显示为3.95
FFT_NUM = 512; % FFT算法就算用到的采样点数
% MAG_ctrl = 0; % 信号幅度控制:1表示在给定区间随机取值,其他值表示固定值
phase_ctl = 0; % 1表示0到2pi的随机相位,其他值表示固定初始相位
kp_ctrl = 0; % 同步头之后扩频方式控制:1表示64chip扩1bit,其他值表示32chip扩1bit
f0 = 70*1000000; % 射频端的载波信息,70MHz
fs = 40*1000000; % AD采样频率,40MHz
w0=2*pi*f0; % 射频载波角频率
END_POINT=20; % 设置每次捕获结束位置:当第20个接收点数据来到而
% FFT(20:20+512)未出现极值时,认为捕获失败
if(kp_ctrl == 1)
kp_mode = 64; % 扩频模式选择
else
kp_mode = 32;
end
if (fd_ctrl == 1) % 频偏控制
fd = rem(15*randn(1),30); % 随机产生频偏,范围在-30KHz到30KHz内
else
fd = 0; % 固定初相
end
% fd =-30*1000;%rem(15*randn(1),30); % 固定频偏
wd = 2*pi*fd;
if (phase_ctl == 1) % 70MHz载波的初始相位控制
ini_phase=0.5*pi*rem(randn(1),2); % 随机产生初始相位,范围在-pi到pi内
else
ini_phase=0; % 固定初相
end
MAG = 0.00393118; % 未扩频数据的幅度,工程幅度值为:sqrt(0.00002~0.2)
%-------------------------------信息数据是PN码的前620chip--------------------------%
data_original_len = 1200;
PN_len = 640 + (data_original_len-5)*kp_mode;
filename='m.txt'; fid=fopen(filename,'r');
PN=fscanf(fid,'%d',PN_len);
Data_original = PN(1:data_original_len); fclose(fid);
%------------------------------对原始数据进行扩频--------------------------%
DATA_SS = zeros(640+kp_mode*(data_original_len-5),1) ;
for i = 1:data_original_len
if(i<=5)
DATA_SS((i-1)*128+1:i*128) = Data_original(i)*PN((i-1)*128+1:i*128); %前5个bit:5*128
else
DATA_SS(641+(i-6)*kp_mode:640+(i-5)*kp_mode) = Data_original(i)*PN(641+(i-6)*kp_mode:640+(i-5)*kp_mode);
end
end
% 产生本地的伪码信息,每个伪码重复四次,以便与发端采样数据匹配
PN_LOCAL = zeros(PN_len*4,1);
for i=1:PN_len
PN_LOCAL((i-1)*4+1:i*4)=PN(i);
end
samp_len = PN_len*4;
t=0:1/fs:(samp_len-1)/fs; % 采样间隔,40MHz时钟周期
%产生发射端的载波信号
data_psk=zeros(samp_len,1);
y=cos((w0+wd)*t+ini_phase); % 70MHz中频载波40MHz采样后序列(载波包含频偏)
for AD_i = 1:PN_len
data_psk((AD_i-1)*4+1:AD_i*4)=MAG*DATA_SS(AD_i)*y((AD_i-1)*4+1:AD_i*4);
end
% 带通滤波器的设计
% fsamp = 40*1000000; % 采样频率为40MHz
% fcuts = [(10-1)*1000000 (10-0.35)*1000000 (10+0.35)*1000000 (10+1)*1000000 ];
% mags = [0 1 0];
% devs = [0.01 0.05 0.01];
% [n_cof,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,fsamp);
% n_cof = n_cof + rem(n_cof,2);
filename='cof.txt'; fid=fopen(filename,'r');
cof_band = fscanf(fid,'%e');
fclose(fid);
% %===========================================================================================%
% %------------------------------开始循环模拟,以判断算法的正确性-------------------------------%
% %===========================================================================================%
% max_i = zeros(loop_time,1);
% sub_max_i = zeros(loop_time,1);
catch_point = zeros(loop_time,1);
for loop_i=1:loop_time %开始多次循环,完成解扩解调判决
noise = NOISE_COF(loop_i)*MAG*randn(length(data_psk)+16,1);
data_AD_noise = data_psk+noise(1:length(data_psk));
% 产生噪声部分(50采样点)和受噪声影响的信号部分
data_samp=[ noise(length(data_psk)+1:length(data_psk)+16)
data_AD_noise];%前16个点表示随机噪声,噪声后面为扩频数据
% %=================================================%
% %---------------------------------------对数据进行捕获---------------------------------------%
% %===========================================================================================%
DATA_JK = zeros(512,1);
% 进行第一次的伪码捕获与判决,伪码相位差恒定,但是FFT计算的数据彼此差一个采样数据,以便减少噪声的影响
for JK_START=1:END_POINT
% 扩频码相位不变,数据依次输入进行解扩后捕获PN码同步
for samp_i = JK_START:JK_START+FFT_NUM-1
DATA_JK(samp_i-JK_START+1)=PN_LOCAL(samp_i-JK_START+1)*data_samp(samp_i);
end
% 重叠叠加法进行FFT_NUM/2点的FFT,
% 找到最大值,并找到第1第FFT_NUM/4+1点及最大值周边的FFT_NUM/8点中的次大值,下同
FFT_RESULT_11=abs(fft(DATA_JK(1:FFT_NUM/2))).^2+...
abs(fft(DATA_JK(FFT_NUM/2+1:FFT_NUM))).^2+...
abs(fft(DATA_JK(FFT_NUM/4+1:FFT_NUM*3/4))).^2; % 计算512点FFT的功率谱
big_11 = FFT_RESULT_11(65);
middle_11=max([FFT_RESULT_11(1) FFT_RESULT_11(FFT_NUM/4+1)...
max(FFT_RESULT_11(FFT_NUM/16+1:FFT_NUM/8-1))...
max(FFT_RESULT_11(FFT_NUM/8+3:FFT_NUM*3/16))]);
div = big_11/middle_11;
if(div>=threshold)
catch_point(loop_i)=JK_START;
break;
end
end
%---------------------------------解扩解调---------------------------------%
% 对整个采样数据进行解扩
DATA_JK_all = zeros(samp_len,1); % samp_len不包含无数据的噪声部分
for i = catch_point(loop_i):samp_len+catch_point(loop_i)-1
DATA_JK_all(i-catch_point(loop_i)+1)=PN_LOCAL(i-catch_point(loop_i)+1)*data_samp(i);
end
% 对解扩后的数据带通滤波,滤出噪声部分,仅剩下基带
DATA_JK_FILTER = filter(cof_band,1,DATA_JK_all);
% 对滤波后的数据进行差分解调,延迟单位为一个bit的基带数据
%-------------------差分解调----------------------%
dem_len = samp_len-kp_mode*4;
dem = zeros(dem_len,1);
for dem_i = 1:dem_len
dem(dem_i)=DATA_JK_FILTER(dem_i)*DATA_JK_FILTER(dem_i+kp_mode*4);
end
cof_lowpass = fir1(32,0.1);
dem_filter = filter(cof_lowpass,1,dem);
dem_filter_adj = dem_filter > 0;
dem_conv = zeros(dem_len,1);
for conv_i = 1:dem_len
if(dem_filter_adj(conv_i)>0)
dem_conv(conv_i) = 1;
else
dem_conv(conv_i) = -1;
end
end
%---------------------判决输出---------------------%
data_adj = zeros(data_original_len,1);
for adjuge_i = 1:data_original_len-20
if(adjuge_i<=5)
if(sum(dem_conv(85+adjuge_i*512-kp_mode*4+1:85+adjuge_i*512))>=kp_mode)
data_adj(adjuge_i) = 0;
elseif(sum(dem_conv(85+adjuge_i*512-kp_mode*4+1:85+adjuge_i*512))<=-kp_mode)
data_adj(adjuge_i) = 1;
end
else
if(sum(dem_conv(85+2560+(adjuge_i-6)*kp_mode*4:85+2560+(adjuge_i-5)*kp_mode*4))>=kp_mode)
data_adj(adjuge_i) = 0;
elseif(sum(dem_conv(85+2560+(adjuge_i-6)*kp_mode*4:85+2560+(adjuge_i-5)*kp_mode*4))<=-kp_mode)
data_adj(adjuge_i) = 1;
else
data_adj(adjuge_i) = -1;
end
end
end
%将解调结果输出到文件
switch loop_i
case 1
filename = 'F:\DSSS\DEM\dem_-5.5dB.txt';
fid = fopen(filename,'w');
fprintf(fid,'%d\n',data_adj);
fclose(fid);
case 2
filename = 'F:\DSSS\DEM\dem_-5.0dB.txt';
fid = fopen(filename,'w');
fprintf(fid,'%d\n',data_adj);
fclose(fid);
case 3
filename = 'F:\DSSS\DEM\dem_-4.5dB.txt';
fid = fopen(filename,'w');
fprintf(fid,'%d\n',data_adj);
fclose(fid);
case 4
filename = 'F:\DSSS\DEM\dem_-4.0dB.txt';
fid = fopen(filename,'w');
fprintf(fid,'%d\n',data_adj);
fclose(fid);
case 5
filename = 'F:\DSSS\DEM\dem_-3.5dB.txt';
fid = fopen(filename,'w');
fprintf(fid,'%d\n',data_adj);
fclose(fid);
case 6
filename = 'F:\DSSS\DEM\dem_-3.0dB.txt';
fid = fopen(filename,'w');
fprintf(fid,'%d\n',data_adj);
fclose(fid);
case 7
filename = 'F:\DSSS\DEM\dem_-2.5dB.txt';
fid = fopen(filename,'w');
fprintf(fid,'%d\n',data_adj);
fclose(fid);
case 8
filename = 'F:\DSSS\DEM\dem_-2.0dB.txt';
fid = fopen(filename,'w');
fprintf(fid,'%d\n',data_adj);
fclose(fid);
case 9
filename = 'F:\DSSS\DEM\dem_-1.5dB.txt';
fid = fopen(filename,'w');
fprintf(fid,'%d\n',data_adj);
fclose(fid);
case 10
filename = 'F:\DSSS\DEM\dem_-1.0dB.txt';
fid = fopen(filename,'w');
fprintf(fid,'%d\n',data_adj);
fclose(fid);
case 11
filename = 'F:\DSSS\DEM\dem_-0.5dB.txt';
fid = fopen(filename,'w');
fprintf(fid,'%d\n',data_adj);
fclose(fid);
case 12
filename = 'F:\DSSS\DEM\dem_-0.0dB.txt';
fid = fopen(filename,'w');
fprintf(fid,'%d\n',data_adj);
fclose(fid);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -