• FPGA信号处理系列文章——码元同步


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

    FPGA信号处理系列文章——码元同步


    前言

    前面,我们将了锁频环和锁相环,实际上都是为了完成一件事,就是载波同步。锁相环就是为了本地载波与接收载波进行同步。那如果接收信号中还含有码元的话,特别是对于扩频信号而言,是必须进行同步的,如果码元不同步的话,则无法进行能量的累积,进而载波也无法同步。

    码元粗同步

    前面我们讲了自相关和互相关,以GPS信号为例,其自相关性能和互相关性能都非常好。
    自相关表现在:只有码元对齐才有明显的峰值
    互相关表现在:不同组的码元进行相关是不会出现明显的峰值的
    因此,通过这种相关特性很容易识别信号中是否包含一组特定的码元。
    关于粗同步,这里就不详细讲了,初同步需要将码元的位置误差限定在【-1,1】码元内。否则就无法进行下一步的码元精同步。

    超前-滞后门同步器

    超前—滞后符号同步算法利用的是信号波形的对称性,即经过匹配滤波器或相关器的输出信号是对称的,如下图所示。对于下图所示的矩形脉冲,匹配滤波器的输出在t=T时达到最大值。只要采样值在峰值上,就一定能保证符号同步

    在这里插入图片描述
    在噪声存在的情况下,如果没有在峰值点对信号采样,而在t=T-△时早采样,在t=T+△时迟采样。那么由于自相关函数相对于最佳采样时刻t=T是偶函数,早采样值得绝对值和迟采样值的绝对值就相等。在这种情况下,适当的采样时刻应该是在t=T-△和t=T+△之间的中点上。这一条件构成了超前—滞后门同步器的基础。
    下图是其功能的实现结构
    在这里插入图片描述

    鉴别器

    下面介绍两种鉴相器
    (1)非相干超前减滞后幅值法:它简称前减后幅值法,码环前减后幅值鉴别器法的计算公式为:
    在这里插入图片描述
    上式假定了接收机得到的自相关幅值的最大值为1;否则,我们可对上式进行单位化,得到如下更为常用的鉴别公式
    在这里插入图片描述
    (2) 非相干超前减滞后功率法:它是将超前支路与滞后支路上的非相干积分功率相减,即
    在这里插入图片描述
    相应地,其单位化后的计算公式为:
    在这里插入图片描述
    因为在非相干超前减滞后幅值法中的自相关幅值E和L需要经过开根号才能求得,而这种非相干超前减滞后法却可以免去开根号运算,所以后者的计算量比前者有所减少;然而,由于自相关幅值曲线与功率曲线不相重合,因而非相干超前减滞后功率法会产生一定的鉴相误差。考虑到码环鉴别器的基本思路是让码环朝着使超前支路功率与滞后支路功率相等的方向上调节复制码相位,这种鉴相法最终也会使码环达到稳态。

    对于第一种方法需要开根号,不过开根号也有近似的计算方法。
    在这里插入图片描述
    可以用以下的Robertson近似计算法来替代:
    在这里插入图片描述
    而上式也可以等价地表达成
    在这里插入图片描述

    matlab程序

    模拟一个接收信号,接收信号为GPS L1CA码,码速率为1.023Mbps,采样率为4.1e6Hz,1ms的积分时间

    clc;clear all;close all
    
    
    SampleClk = 4.1e6;  
    
    PointNum = SampleClk*4;  
    
    caCode = prn_GPS_L1CA_Gen(1); 
    
    CodeRate = 1.023e6; 
    CodeLen = 1023;
    indexInt = 0;
    
    index = CodeRate/SampleClk*[1:PointNum]+0;
    indexInt =  mod(floor(index),CodeLen) + 1;
    SampleCode = caCode(indexInt);
    
    signal0 = SampleCode ;
    
    data = signal0;
    
    code = prn_GPS_L1CA_Gen(1);
    
    n = SampleClk/1000; 
    
    
    
    
    nf = floor(length(data)/n); 
    
    
     
    AccCodReg0  = 0;
    frame = 0;
    
    DLL_BL = 2;   
    tc1 = 1/1000;  
    k1 = 1; 
    
    [cf0,cf1] = Fil2ndPara(k1,DLL_BL,tc1);   
    
    
    df(1:nf) = 0; 
    df1(1:nf) = 0;
    
    
    PQaccu = 0; 
    PIaccu = 0; 
    
    EQaccu = 0; 
    EIaccu = 0;
    LQaccu = 0; 
    LIaccu = 0; 
    
      
    dll = 0;  
    
    
    code_accu = 0; 
    counter = 1;   
    
         
    init_code_freq = 1.023e6;  
    
    E1_code = 0;
    E1_code_d1   = 0;E1_code_d2  = 0;E1_code_d3  = 0;E1_code_d4  = 0;
    P1_code = 0;
    L1_code = 0;
    
    
    
    for frame = 1 : nf
    
        code_freq = init_code_freq + dll;
        for clk = 0 : n-1 
    
            baseband = (data(((frame-1)*n+clk+1)));
            
            II = real(baseband);
            QQ = imag(baseband);
            
            code_accu_old = code_accu;
            code_accu = rem(code_accu,1);
            
            if code_accu_old > code_accu  
                if(counter == 1023) 
                    counter = 1;
                else 
                    counter = counter + 1;
                end
            end
            
            E1_code_d4 = E1_code_d3;
            E1_code_d3 = E1_code_d2;
            E1_code_d2 = E1_code_d1;
            E1_code_d1 = E1_code;
             
            E1_code = code(counter);
            P1_code = E1_code_d2;
            L1_code = E1_code_d4;
    
            PI_clk = II*P1_code;   
            PQ_clk = QQ*P1_code;    
                
            EI_clk = II*E1_code;   
            EQ_clk = QQ*E1_code;    
                  
            LI_clk = II*L1_code;    
            LQ_clk = QQ*L1_code;   
            
    
            PQaccu = PQaccu + PQ_clk;     
            PIaccu = PIaccu + PI_clk;     
            
            EQaccu = EQaccu + EQ_clk;     
            EIaccu = EIaccu + EI_clk;     
            
            LQaccu = LQaccu + LQ_clk;     
            LIaccu = LIaccu + LI_clk;     
            
    
            code_accu = code_accu + code_freq/SampleClk;
        end
        
        PQ(frame) = PQaccu;
        PI(frame) = PIaccu;
        EQ(frame) = EQaccu;
        EI(frame) = EIaccu;
        LQ(frame) = LQaccu;
        LI(frame) = LIaccu;
        
        
        if PI(frame) == 0
            PI(frame) = 0.0000001;
        end   
        
        
        PQaccu = 0;
        PIaccu = 0;
        EQaccu = 0;
        EIaccu = 0;
        LQaccu = 0;
        LIaccu = 0;
        
    
    
        dll_err(frame) = DllErr(EI,EQ,LI,LQ,frame); 
        [dll,AccCodReg0] = Fil2nd(cf0,cf1,AccCodReg0,dll_err(frame)); 
        
      
        if frame <5
            dll = 0;
        else
    
        end
    
       
        dll_frame(frame) = dll;
        
    end
    
    
    
    figure(2)
    plot(dll_frame);
    
    
    
    figure(4)
    plot(PI,'-r');
    hold on
    plot(PQ);
    hold on
    plot(EI);
    hold on
    plot(EQ);
    hold on
    plot(LI);
    hold on
    plot(LQ);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181

    绿色线和黄色线就是超前支路和滞后支路相关值,红色就是我们的最佳采样值
    在这里插入图片描述
    dll_err 表示接收码元与本地码元的频率误差
    在这里插入图片描述
    实际上,超前滞后同步类似于载波的锁相环。只是这个类似的锁相环载波频率很低而已

  • 相关阅读:
    javaScript:碰撞检测
    【附源码】Python计算机毕业设计水库洪水预报调度系统
    概率论与数理统计 P6 条件概率
    selenium⾃动化测试⾯试题及答案,看看你会多少?
    Docker学习2——Docker高级
    Git泄露
    阿里云增强版实人认证--银行卡要素核验
    文件字符流说明
    《C和指针》笔记28:可变参数和stdarg宏
    线束测试设备有哪些类型的设备,汽车线束测试仪推荐
  • 原文地址:https://blog.csdn.net/gzy0506/article/details/125360504