m通信系统中基于相关峰检测的信号定时同步算法的FPGA实现

简介: m通信系统中基于相关峰检测的信号定时同步算法的FPGA实现

1.算法描述

   定时同步方法主要分为基于数据辅助和非数据辅助两类。前者是在发送有效数据前发送一段具有某种特征的训练或导频符号,接收端根据符号特征建立同步,具有同步建立速度快、精度高的特点,适用于分组通信或突发通信系统;后者典型的是利用循环前缀进行同步估计,不需要插入训练符号,传输效率高,但同步捕获时间长,精度较差,通常仅适用于连续传输系统。由于实际中常用的无线通信系统大多属于分组通信或突发通信,多采用基于训练序列的定时同步方法,因此本文主要对该同步方法进行分析研究和工程实现。首先对基于训练序列的定时同步原理和同步序列的设计进行简要介绍,其次对同步序列的性能进行仿真分析,然后详细阐述定时同步模块的结构设计,最后利用FPGA编程实现并进行综合仿真,验证该设计的可行性。       

    定时同步在实际中一般比较复杂,本文,我们主要使用加入的帧头信息进行定时同步,由于接收和发送是两块板子,所以他们对应的晶振是不同的,所以两个晶振之间会存在细微的频率差,这就是时偏,利用本方案加入的帧头,对每帧数据进行采样时钟的刷新,从而实现一帧之内采样时钟的偏差不超过一个时钟周期。

   帧头信息采用PN码,PN码序列捕获指接收机在开始接收扩频信号时,选择和调整接收机的本地扩频PN序列相位,使它与发送的扩频PN序列相位基本一致,即接收机捕捉发送的扩频PN序列相位,也称为扩频PN序列的初始同步。在系统接收端,一般解扩过程都在载波同步前进行,实现捕获大多采用非相干检测。接收到扩频信号后,经射频宽带滤波放大及载波解调后,分别送往2N扩频PN序列相关处理解扩器(N是扩频PN序列长)。2N个输出中哪个输出最大,该输出对应的相关处理解扩器所用的扩频PN序列相位状态,就是发送的扩频信号的扩频PN序列相位,从而完成扩频PN序列捕获。捕获的方法有多种,如滑动相干法、序贯估值法及匹配滤波器法等,滑动相关法是最常用的方法。
AI 代码解读

2.1 滑动相关法

  接收系统在搜索同步时,它的码序列发生器以与发射机码序列发生器不同的速率工作,致使这两个码序列在相位上互相滑动,只有在达到一致点时,才停下来,因此称之为滑动相关法。接收信号与本地PN码相乘后积分,求出它们的互相关值,然后与门限检测器的某一门限值比较,判断是否已捕获到有用信号。它利用了PN码序列的相关徨性,当两个相同的码序列相位一致时,其相关值输出最大。一旦确认捕获完成,捕获指示信号的同步脉冲控制搜索控制钟,调整PN码发生器产生的PN码重复频率和相位,使之与收到的信号保持同步。由于滑动相关器对两个PN码序列按顺序比较相关,所以该方法又称顺序搜索法。滑动相关器简单,应用簋广,缺点是当两个PN码的时间差或相位差过大时,相对滑动速度簋慢,导致搜索时间过长,特别是对长PN码的捕获时间过长,必须采取措施限定捕获范围,加快捕获时间,改善其性能。

2.2 序贯估值法

  序贯估值法是另一种减少长码捕获时间的快速捕获方法,它把收到的PN码序列直接输入本地码发生器的移位寄存器,强制改变各级寄存器的起始状态,使其产生的PN码与外来码相位一致,系统即可立即进行同步跟踪状态,缩短了本地PN码与外来PN码相位一致所需的时间。该方法先检测收到码信号中的PN码,通过开关,送入n级PN码发生器的移位寄存器。待整个码序列全部进入填满后,在相关器中,将产生的PN码与收到的码信号进行相关运算,在比较器中将所得结果与门限进行比较。若未超过门限,则继续上述过程。若超过门限,则停止搜索,系统转入跟踪状态。理想情况下,捕获时间Ts=nTc,(Tc为PN码片时间宽度)。该方法捕获时间虽短,但存在一些问题,它先要对外来的PN码进行检测,才能送入移位寄存器,要做到这一点有时很困难。另外,此法抗干扰能力很差,因为逐一时片进行估值和判决,并未利用PN码的抗干扰特性。但在无干扰条件下,它仍有良好的快速初始同步性能。

2.3 匹配滤波器法

  用于PN同步捕获的匹配滤波器一般采用延时线匹配滤波器,其目的是识别码序列,它能在特殊结构中识别特殊序列,而且只识别该序列。假设一个输入信号是7bit码序列1110010双相调制的信号,每当码有1-0过渡时,反相信号进入延时线,直到第1bit在T7,第2bit在T6。当全部时延元件都填满,而且信号调制码与滤波器时延元件相位一致时,T2的信号相位与T5、T6、T7的相位相同,时延元件T1、T3、T4也具有相同的信号相位。把{T2、T5、T6、T7}与{T1、T3、T4}两组分别相加,把{T1、T3、T4}之和倒相输出,再将这两个结果相加,包含在全部7个元件中的信号能量同相相加,整个输出是未处理的7倍。根据该能量关系可以识别码序列。

2.仿真效果预览
vivado2019.2仿真结果如下:

image.png
image.png

3.verilog核心程序

begin
     if(i_rst)
      begin
 
      for(i=1;i<=32;i=i+1)
      dly1[i]<={(WTH+2){1'b0}};    
      
      for(i=1;i<=8;i=i+1)
      dly2[i]<={(WTH+4){1'b0}};          
      
      for(i=1;i<=2;i=i+1)
      dly3[i]<={(WTH+6){1'b0}};    
      
      o_peak<={(WTH+6){1'b0}};      
      end
else begin
     
        dly1[1]  <=  dly_peaks[1*SAMP]  +  dly_peaks[2*SAMP]  +  dly_peaks[3*SAMP]  + dly_peaks[4*SAMP];
        dly1[2]  <=  dly_peaks[5*SAMP]  +  dly_peaks[6*SAMP]  +  dly_peaks[7*SAMP]  + dly_peaks[8*SAMP];
        dly1[3]  <=  dly_peaks[9*SAMP]  +  dly_peaks[10*SAMP] +  dly_peaks[11*SAMP] + dly_peaks[12*SAMP];
        dly1[4]  <=  dly_peaks[13*SAMP] +  dly_peaks[14*SAMP] +  dly_peaks[15*SAMP] + dly_peaks[16*SAMP];
        dly1[5]  <=  dly_peaks[17*SAMP] +  dly_peaks[18*SAMP] +  dly_peaks[19*SAMP] + dly_peaks[20*SAMP];
        dly1[6]  <=  dly_peaks[21*SAMP] +  dly_peaks[22*SAMP] +  dly_peaks[23*SAMP] + dly_peaks[24*SAMP];
        dly1[7]  <=  dly_peaks[25*SAMP] +  dly_peaks[26*SAMP] +  dly_peaks[27*SAMP] + dly_peaks[28*SAMP];
        dly1[8]  <=  dly_peaks[29*SAMP] +  dly_peaks[30*SAMP] +  dly_peaks[31*SAMP] + dly_peaks[32*SAMP];
        dly1[9]  <=  dly_peaks[33*SAMP] +  dly_peaks[34*SAMP] +  dly_peaks[35*SAMP] + dly_peaks[36*SAMP];
        dly1[10] <=  dly_peaks[37*SAMP] +  dly_peaks[38*SAMP] +  dly_peaks[39*SAMP] + dly_peaks[40*SAMP];
 
        dly1[11] <=  dly_peaks[41*SAMP] +  dly_peaks[42*SAMP] +  dly_peaks[43*SAMP] + dly_peaks[44*SAMP];
        dly1[12] <=  dly_peaks[45*SAMP] +  dly_peaks[46*SAMP] +  dly_peaks[47*SAMP] + dly_peaks[48*SAMP];
        dly1[13] <=  dly_peaks[49*SAMP] +  dly_peaks[50*SAMP] +  dly_peaks[51*SAMP] + dly_peaks[52*SAMP];
        dly1[14] <=  dly_peaks[53*SAMP] +  dly_peaks[54*SAMP] +  dly_peaks[55*SAMP] + dly_peaks[56*SAMP];
        dly1[15] <=  dly_peaks[57*SAMP] +  dly_peaks[58*SAMP] +  dly_peaks[59*SAMP] + dly_peaks[60*SAMP];
        dly1[16] <=  dly_peaks[61*SAMP] +  dly_peaks[62*SAMP] +  dly_peaks[63*SAMP] + dly_peaks[64*SAMP];
        dly1[17] <=  dly_peaks[65*SAMP] +  dly_peaks[66*SAMP] +  dly_peaks[67*SAMP] + dly_peaks[68*SAMP];
        dly1[18] <=  dly_peaks[69*SAMP] +  dly_peaks[70*SAMP] +  dly_peaks[71*SAMP] + dly_peaks[72*SAMP];
        dly1[19] <=  dly_peaks[73*SAMP] +  dly_peaks[74*SAMP] +  dly_peaks[75*SAMP] + dly_peaks[76*SAMP];
        dly1[20] <=  dly_peaks[77*SAMP] +  dly_peaks[78*SAMP] +  dly_peaks[79*SAMP] + dly_peaks[80*SAMP];
 
 
 
 
//=====================================================      
 
        dly2[1] <= dly1[1]+dly1[2]+dly1[3]+dly1[4];
        dly2[2] <= dly1[5]+dly1[6]+dly1[7]+dly1[8];
        dly2[3] <= dly1[9]+dly1[10]+dly1[11]+dly1[12];
        dly2[4] <= dly1[13]+dly1[14]+dly1[15]+dly1[16];
        dly2[5] <= dly1[17]+dly1[18]+dly1[19]+dly1[20];
        dly2[6] <= dly1[21]+dly1[22]+dly1[23]+dly1[24];
        dly2[7] <= dly1[25]+dly1[26]+dly1[27]+dly1[28];
        dly2[8] <= dly1[29]+dly1[30]+dly1[31]+dly1[32];
  
 
      dly3[1]<=dly2[1]+dly2[2]+dly2[3]+dly2[4];
      dly3[2]<=dly2[5]+dly2[6]+dly2[7]+dly2[8];
         
 
       
      o_peak<=dly3[1]+dly3[2];
AI 代码解读
 
module corrpeak_cal_tops(
                         i_clk,
                                 i_rst,
                                 o_I_dw,
                                 o_Q_dw,
                                 o_peakI,
                                 o_peakQ
                         );
 
                                
input i_clk;
input i_rst;
output signed[11:0]o_I_dw;
output signed[11:0]o_Q_dw;
output signed[14:0]o_peakI;
output signed[14:0]o_peakQ;
 
bignoise_signal signal_u(
                    .i_clk (i_clk), 
                    .i_rst (i_rst), 
                    .o_I_dw(o_I_dw), 
                    .o_Q_dw(o_Q_dw)
                    );
 
 
corrpeak_cal corrpeak_cal_u1(
    .i_clk        (i_clk), 
    .i_rst        (i_rst), 
    .i_base_signal(o_I_dw[11:4]), 
    .o_peak       (o_peakI)
    );
 
corrpeak_cal corrpeak_cal_u2(
    .i_clk        (i_clk), 
    .i_rst        (i_rst), 
    .i_base_signal(o_Q_dw[11:4]), 
    .o_peak       (o_peakQ)
    );
 
 
 
endmodule
AI 代码解读
相关文章
【硬件测试】基于FPGA的1024QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的1024QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同SNR条件下的性能测试。1024QAM调制将10比特映射到复平面上的1024个星座点之一,实现高效数据传输。硬件测试结果表明,在SNR=32dB和40dB时,系统表现出良好的性能。Verilog核心程序展示了各模块的连接与功能实现。
30 7
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
83 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
【硬件测试】基于FPGA的4ASK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的4ASK调制解调系统的硬件测试版本,该系统包括testbench、高斯信道模块和误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置功能。通过VIO设置不同SNR(如15dB和25dB),实现了对系统性能的实时监测与调整。4ASK是一种通过改变载波幅度表示数据的数字调制方式,适用于多种通信场景。FPGA平台的高效性和灵活性使其成为构建高性能通信系统的理想选择。
47 17
【硬件测试】基于FPGA的4FSK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前的文章《基于FPGA的4FSK调制解调系统》,增加了ILA在线数据采集模块和VIO在线SNR设置模块,实现了硬件测试版本。通过VIO设置不同SNR(如10dB和20dB),并展示了ILA采集的数据结果。四频移键控(4FSK)是一种数字调制方法,利用四个不同频率传输二进制数据,具有较高的频带利用率和抗干扰性能。输入的二进制数据分为两组,每组两个比特,对应四个频率f1、f2、f3、f4,分别代表二进制组合00、01、10、11。调制过程中选择相应频率输出,并进行幅度调制以增强抗干扰能力。接收端通过带通滤波器提取信号并还原为原始二进制数据。
28 7
【硬件测试】基于FPGA的256QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的256QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同信噪比(如30dB和40dB)的仿真测试,并提供配套操作视频。256QAM调制方案每个符号携带8比特信息,通过复数值星座图映射实现高效传输。Verilog代码展示了核心模块设计,包括SNR设置、数据处理和ILA测试分析,确保系统在实际硬件环境中的稳定性和性能。
15 2
基于FPGA的信号DM编解码实现,包含testbench和matlab对比仿真
本项目展示了DM编解码算法的实现与测试结果。FPGA测试结果显示为T1,Matlab仿真结果为T2。使用软件版本为Matlab 2022a和Vivado 2019.2。核心程序包含详细中文注释和操作视频。DM编解码通过比较信号样本差值进行编码,适用于音频等低频信号处理。硬件结构包括编码器(采样器、减法器、比较器)和解码器(解码器、积分器)。
一维信号的小波变换与重构算法matlab仿真
本程序使用MATLAB2022A实现一维信号的小波变换与重构,对正弦测试信号进行小波分解和重构,并计算重构信号与原信号的误差。核心步骤包括:绘制分解系数图像、上抽取与滤波重构、对比原始与重构信号及误差分析。小波变换通过多分辨率分析捕捉信号的局部特征,适用于非平稳信号处理,在信号去噪、压缩等领域有广泛应用。
【硬件测试】基于FPGA的16QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的16QAM基带通信系统硬件测试版本。该系统在仿真基础上增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同信噪比(如15dB、25dB)的测试。16QAM是一种正交幅度调制方式,通过两路4ASK信号叠加实现,每个符号包含4比特信息。系统采用正交调幅法生成16QAM信号,并通过DAC转换为模拟信号。解调时使用正交相干解调,经低通滤波器恢复电平信号。开发板内完成发射与接收,无需定时同步模块。代码可移植至其他开发板,具体步骤见配套文档。
26 2
基于FPGA的信号发生器verilog实现,可以输出方波,脉冲波,m序列以及正弦波,可调整输出信号频率
本项目基于Vivado2019.2实现信号发生器,可输出方波、脉冲波、m随机序列和正弦波。完整程序无水印,含详细中文注释与操作视频。FPGA技术使信号发生器精度高、稳定性强、功能多样,适用于电子工程、通信等领域。方波、脉冲波、m序列及正弦波的生成原理分别介绍,代码核心部分展示。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等