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

📄 shishi.m

📁 关于扩频系统的程序的一些算法
💻 M
📖 第 1 页 / 共 2 页
字号:
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 + -