📄 shishi.m
字号:
clear
clc
close all
% ********************** 加载波和位定时同步 ***************************************************
fs = 88; % 整个系统的采样频率
dt = 1/fs;
f_i = 22;
pi2 = 2*pi;
barkercode_11 = [1 1 1 -1 -1 -1 1 -1 -1 1 -1];
pn_15 = [1 1 1 1 0 1 0 1 1 0 0 1 0 0 0];
pn_sequence = pn_15*2-1;
coeff_5 = firrcos(28,5.5,0.25,88,'rolloff','sqrt');
% coeff_44 =[4 1 -4 -4 2 12 14 -2 -30 -48 -24 48 152 248 284 248 152 48 -24 -48 -30 -2 14 12 2 -4 -4 1 4];
fid = fopen('rand_data.m','r');
source1 = fread(fid)';
fclose(fid);
source = [source1 zeros(1,100)];
sig_i = [1 pn_15 source(1:2:end)];
sig_q = [1 pn_15 source(2:2:end)];
match_regist = zeros(2,44);
% match_regist1 = zeros(2,size(barkercode_11,2));
num = [0.01 1];
den = [1 1.01 1];
[Af,Bf,Cf,Df] = tf2ss(num,den);
for i = 1:length(sig_i)
if i == 1
DQpsk(1,i) = 1;
DQpsk(2,i) = 1;
else
DQpsk(1,i) = abs(xor(sig_i(i),sig_q(i))-1)*xor(sig_i(i),pre_i) + xor(sig_i(i),sig_q(i))*xor(sig_q(i),pre_q);
DQpsk(2,i) = abs(xor(sig_i(i),sig_q(i))-1)*xor(sig_q(i),pre_q) + xor(sig_i(i),sig_q(i))*xor(sig_i(i),pre_i);
end
pre_i = DQpsk(1,i);
pre_q = DQpsk(2,i);
end
DQpsk = DQpsk*2-1;
Expand_sig = kron(DQpsk,barkercode_11); % spread
Ep_insert_sig = zeros(2,length(Expand_sig)*8); % insert 8 zero
Ep_insert_sig(:,1:8:end) = Expand_sig;
Filter_sig(1,:) = conv(Ep_insert_sig(1,:),coeff_5); % low_filter (fc = 11,fs =88);
Filter_sig(2,:) = conv(Ep_insert_sig(2,:),coeff_5);
t = [0:dt:(size(Filter_sig,2)-1)*dt];
Md_sig_c = Filter_sig(1,:).*cos(pi2*22*t);
Md_sig_s = Filter_sig(2,:).*sin(pi2*22*t);
clear Ep_insert_sig;
clear Filter_sig;
clear Ep_insert_sig;
sig_stor_c = resample(Md_sig_c,8802,8800);
sig_stor_s = resample(Md_sig_s,8802,8800);
dt1 = 1/88.02;
t = [0:dt1:(length(sig_stor_s)-1)*dt1];
noice = randn(1,length(sig_stor_c));
step = 0.5;
snr_min = -10;
snr_max = 2;
err_rate = [];
store = [];
sig_ave_pow = (norm(sig_stor_c)^2+norm(sig_stor_s)^2)/length(sig_stor_c);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 接受端 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for snr = snr_min:step:snr_max
snr
Md_sig = sig_stor_c + sig_stor_s; % I
Md_sig = Md_sig/sqrt(sig_ave_pow)+ sqrt(10^(-snr/10))*noice*sqrt(0.5);
%--------------高频部分略过,通过下载波,可以得到 Md_sig_c 和 Md_sig_s --------------------
nco_out = 0;
nco_nature = 22.01;
i = 0;
dc_rig = zeros(1,29);
ds_rig = zeros(1,29);
match_out = zeros(2,44);
phase_err = 0;
fx = zeros(2,2);
%-----------------Timing_parament--------------------------------------------
count = 0;
catch_count = 0;
Peak_distance = 44; % 峰值间距初值
pre_filr = zeros(2,4);
syn_track_flag = 0;
syn_start_flag = 0;
sig_out_flag = 0;
window_count = 0; % 峰值标志位计数。
catch_window = zeros(2,44);
peak_val_regist1 = zeros(1,44);
track_window = zeros(2,7);
peak_val_regist2 = zeros(1,7);
pre_index = 0;
peak_space = 0;
index_regist = zeros(1,4);
control_regist = zeros(1,4);
%--------------------------------------------------------------------------
match_count = 0;
count2 = 0;
pn_regist = zeros(2,15);
pn_mul_result = 0;
flag =0;
pn_mul1 = 0;
xf1 = zeros(1,2);
xf2 = zeros(1,2);
xf3 = zeros(1,2);
decode_out = [];
show_flag = 1;
t = [0:dt:(length(sig_stor_s)-1)*dt];
for i = 1:length(sig_stor_c)
%---------------- down convert frequency-----------------------------------------------
dc = Md_sig(i)*cos(pi2*nco_nature*t(i));
ds = Md_sig(i)*sin(pi2*nco_nature*t(i));
dc_rig(2:end) = dc_rig(1:end-1);
ds_rig(2:end) = ds_rig(1:end-1);
dc_rig(1) = dc;
ds_rig(1) = ds;
d_convert_c = dc_rig*coeff_5';
d_convert_s = ds_rig*coeff_5';
%------------------ Timing synchronization------------------------------------------------
count = count+1; % 调整计数器,反映从滤波器出来的数据个数,(包括插值的数值)
%-----------------------------------------------------------------------
if mod(count,2)==1
match_count = match_count + 1;
%---------------Match filter -----------------------------------------------------------
pre_filr(:,2:end) = pre_filr(:,1:end-1);
pre_filr(1,1) = d_convert_c;
pre_filr(2,1) = d_convert_s;
tempt_c = sum(pre_filr(1,:));
tempt_s = sum(pre_filr(2,:));
match_regist(:,1:end-1) = match_regist(:,2:end);
match_regist(1,end) = tempt_c;
match_regist(2,end) = tempt_s;
match_out(:,2:end) = match_out(:,1:end-1);
tempt1 = match_regist(1,1:4:end)*barkercode_11';
tempt2 = match_regist(2,1:4:end)*barkercode_11';
match_out(:,1) = [tempt1;tempt2];
%-------------------在捕获态下,每进来一个数都将它的峰值存储起来--------------------------------
if syn_track_flag == 0
catch_count = catch_count+1;
catch_window(:,2:end) = catch_window(:,1:end-1);
catch_window(:,1) = match_out(:,1);
peak_val_regist1(2:end) = peak_val_regist1(1:end-1);
peak_val_regist1(1) = tempt1^2+tempt2^2;
if peak_val_regist1(1)==0
peak_val_regist1(1) = 0;
else
peak_val_regist1(1) = 10*log10(peak_val_regist1(1));
end
if mod(catch_count,Peak_distance) == 0 & catch_count ~=0
[value index] = max(peak_val_regist1);
sig_out_flag = 1;
match_max_c = catch_window(1,index);
match_max_s = catch_window(2,index);
index_regist(2:end) = index_regist(1:end-1); % 存储两两峰值之间的距离。
index_regist(1) = index+44-pre_index;
pre_index = index;
v1 = index_regist(1) - index_regist(2);
v2 = index_regist(3) - index_regist(2);
v3 = index_regist(4) - index_regist(3);
if value>=20 % 控制峰值功率门限
control_regist(2:end) = control_regist(1:end-1);
control_regist(1) = 1;
if index<=21
catch_count = (index-22) ;
elseif index>=24
catch_count = (index-23);
else
catch_count = 0;
end
else
control_regist(2:end) = control_regist(1:end-1);
control_regist(1) = 0;
end
% 只有检测到连续4次到来的功率不小于20db的峰值,才结束同步捕获,进入跟踪阶段。
if match_count>=5100
aaaa = 0;
end
if (abs(v1)<=1) & (abs(v2)<=1) & (abs(v3)<=1) & (control_regist == ones(1,4))
syn_track_flag == 1; %%%%%%%%%%%%%%%%%%%%%%% 待回改成1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -