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

📄 shishi.m

📁 关于扩频系统的程序的一些算法
💻 M
📖 第 1 页 / 共 2 页
字号:
                        tempt = fix(sum(index_regist)/4);
%                         control_regist = zeros(1,4);   % 控制寄存器清零。
                        if tempt<43
                            Peak_distance = Peak_distance-1;
                        end
                        if tempt>45
                            Peak_distance = Peak_distance+1;
                        end
                        window_shift = index;
                    end
                end
            end
            if syn_track_flag == 1  % 进入跟踪阶段。
                window_count = window_count+1;
                if window_count>=window_shift-3 & window_count<=window_shift+3
                    track_window(:,2:end) = track_window(:,1:end-1);
                    track_window(1,1) = match_out(1,1);
                    track_window(2,1) = match_out(2,1);
                    peak_val_regist2(2:end) = peak_val_regist2(1:end-1);
                    peak_val_regist2(1) = tempt1^2+tempt2^2;
                    if peak_val_regist2(1)==0
                        peak_val_regist2(1) = 0;
                    else
                        peak_val_regist2(1) = 10*log10(peak_val_regist2(1));
                    end
                end
                if window_count == 48
                    [value index] = max(peak_val_regist2);
                    sig_out_flag = 1;
                    match_max_c = track_window(1,index);
                    match_max_s = track_window(2,index);
                    if index~=3
                        window_shift = Peak_distance + (index-3); 
                    end
                    if value>=16     % 控制峰值功率门限
                        control_regist(2:end) = control_regist(1:end-1);
                        control_regist(1) = 1;
                    else
                        control_regist(2:end) = control_regist(1:end-1);
                        control_regist(1) = 0;               
                    end
                    if control_regist == zeros(1,4)   % 
                        syn_track_flag =0;
                        catch_count = 0;
                        peak_val_regist1 = zeros(1,44);
                        catch_window = zeros(2,44);
                    end 
                end
                
            end
%             if mod(match_count,44) == 0
%                 sig_out_flag =1;
%             end
            %-------------------------------------------------------------
            if sig_out_flag ==1
                sig_out_flag = 0;
%                 [value index] = max(abs(match_out(1,:)));
%                 match_max_c = match_out(1,index);
%                 [value index] = max(abs(match_out(2,:)));
%                 match_max_s = match_out(2,index);
                tempt1 = match_max_c/sqrt(match_max_c^2+match_max_s^2);
                tempt2 = match_max_s/sqrt(match_max_c^2+match_max_s^2);
                
                match_max_c = tempt1;
                match_max_s = tempt2;
                
                if count2  ==0
                    diterm_sig_c = 1;
                    diterm_sig_s = 1;
                    S_afc = 0;
                    phase_err = S_afc;
                    %                         decode_out = [1 1];
                    pre_crot = sqrt(2)/2;
                    pre_srot = 0;
                    count2  = count2 +1;
                end
                if count2 >=1
                    count2  = count2 +1;
                    if count2  ==20
                        count2  = count2 ;
                    end
                    diterm_sig_c = match_max_c * pre_crot + match_max_s * pre_srot;
                    diterm_sig_s = match_max_s * pre_crot - match_max_c * pre_srot;
                    diterm_sig_c = diterm_sig_c/sqrt(2);
                    diterm_sig_s = diterm_sig_s/sqrt(2);
                    
                    pre_crot = (match_max_c+match_max_s)/2;
                    pre_srot = (match_max_s-match_max_c)/2;                   
                    
                    if    diterm_sig_c>0 & diterm_sig_s>0
                        decode(1) = -1;
                        decode(2) = -1;
                    elseif diterm_sig_c<0 & diterm_sig_s>0
                        decode(1) = -1;
                        decode(2) = 1;
                    elseif diterm_sig_c<0 & diterm_sig_s<0
                        decode(1) = 1;
                        decode(2) = 1;
                    elseif diterm_sig_c>0 & diterm_sig_s<0
                        decode(1) = 1;
                        decode(2) = -1;
                    end
                    if flag ==1  % flag 为帧同步标志位。
                        if decode(1)==-1
                            decode(1) = 0;
                        end
                        if decode(2) ==-1
                            decode(2) = 0;
                        end                              
                        decode_out = [decode_out decode];
                    else
                        pn_regist(:,1:end-1) = pn_regist(:,2:end);
                        pn_regist(:,end) = [decode(1);decode(2)];
                        pn_mul_result = pn_regist(1,:)*pn_sequence'+pn_regist(2,:)*pn_sequence';
                    end
                    %----------------  err inspect---------------------------
                    S_afc = sign(diterm_sig_c)*diterm_sig_s - sign(diterm_sig_s)*diterm_sig_c;
                    phase_err = S_afc/(match_max_c^2+match_max_s^2)/2;
                end              
            end
            
            if snr<=-8
                if pn_mul_result >=16
                    flag = 1;
                    if flag == 1&show_flag==1
                        pn_mul_result
                        show_flag =0;
                    end
                end
            elseif snr<-4
                if pn_mul_result >=19
                    flag = 1;
                    if flag == 1&show_flag==1
                        pn_mul_result
                        show_flag =0;
                    end
                end
            elseif snr<0
                if pn_mul_result >=20
                    flag = 1;
                    if flag == 1&show_flag==1
                        pn_mul_result
                        show_flag =0;
                    end
                end
            else
                if pn_mul_result >=22
                    flag = 1;
                    if flag == 1&show_flag==1
                        pn_mul_result
                        show_flag =0;
                    end
                end
            end
        else
            continue;
        end
        if i<=88
            nco_out = 0;
        else
            fx(:,2) = fx(:,1) +1.*Af*fx(:,1)/88 + 1.*Bf*phase_err/88;
            nco_out = Cf*fx(:,1);
            fx(:,1) = fx(:,2);
            %             xf1(2) = xf1(1);
            %             xf1(1) = phase_err-xf3(1);
            %             xf2(2) = xf2(1);
            %             xf3(2) = xf3(1);
            %             xf2(1) = (xf2(2)+(c1+c2)*xf1(1)-c1*xf1(2));  % 环路滤波器的输出
            %             xf3(1) = xf2(1)+xf3(2);
            %             nco_out = xf3(1);
            %             store = [store nco_out];
            
        end       
    end
    err_num = 0;
    err_bit = zeros(1,length(source1));
    if length(decode_out)==length(source1)-2
        decode_out = [decode_out 0 0];
    end
    for i = 1:length(source1)
        if (decode_out(i)~= source1(i))
            err_num = err_num+1;
            err_bit(i) = 1;
        end
    end
    err_rate = [err_rate err_num/length(source1)];
end
snr = snr_min:step:snr_max;
semilogy(snr,err_rate,'r-*');
err_rate
grid on


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -