首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于SystemGenerator的OFDM通信系统频率同步算法的实现

基于SystemGenerator的OFDM通信系统频率同步算法的实现

上一次我在博文中和大家一起探讨了如何用SysGen快速地实现OFDM通信系统中分组检测的问题。这次,我想继续上次的路线和大家分享一下如何实现OFDM系统频率同步算法。贯穿的宗旨仍然是,将算法划分到足够细致,直到能和SysGen中的模块一一对应。
OFDM技术即是在许多个子载波上传输信息,各个子载波必须正交才能保证正确解码。但在移动的无线信道中,由于Dopple频移或收发机的本振不可能做到完全一致,造成收发机载波频率出现偏差,从而破坏了子载波之间的正交性。因此必须对接受到的数据进行载波频率偏差的补偿。
假设要发送的序列为x(n),发送端的带通信号为t(n),接受到的信号为r(n),发送端的载波频率为f1,接收端的载波频率为f2,则

其中Ts为采样频率,delta f即为我们需要补偿的频率偏移,很明显如果我们对接收到的每一个数据都乘以一个旋转因子来补偿这个偏差那么我们的任务就搞定了。关键是我们怎么样才能得到这个delta f呢?
如果大家还记得我的前一篇博文中怎样对训练序列进行延时相关的做法,那么点子就来了。请看:

其中Lenth为训练序列的长度,我们项目中采用的是16. 为提高频率偏差的准确性,采用多次相加求平均的方法.
1.在分组检测后,到达载波同步模块的训练序列完整的有9段,即9*16=144个样值.我们将从这144个样值中计算出delta_f,再计算出补偿因子,最后对经过缓冲的输入数据进行补偿,从而完成我们的目标。设计的框图如下:

2.首先用一个计数器对输入数据计数,再通过一个比较器提取先进来的训练序列.当n<144时,数据复制一份进入到频偏估计模块。

3.频移delta_f的计算划分为两个单元来设计,首先是延时相关值的计算,之后求延时相关值的相角并取平均值,最后将该值锁存作为本单元的输出。设计结果为:

3.1延时相关的计算与我上次博文中的设计一样,只是这一次我调用了复数乘法器,并且为了保证后面计算的精度我对结果的小数点的位置进行了调整.

3.2相角的计算,我调用了Xilinx Reference Blockset中的Cordic Atan模块,这个模块比标准库中的Cordic模块要容易使用,大家可以将两者对比一下就知道了.
3.3在前面的公式中可以看到delta_f的表达式的分母中有2*pi*Ts因子,而在补偿因子的计算中又要乘以2*pi*Ts,因此,在delta_f的计算中就不用再多此一举了,其实在DSP的设计中这样的情况经常会出现,大家在做实现或写代码的时候一定要看到可以相互约去的因子,否则计算复杂占用资源不说,而且会损失精度.
前面提到我们有9段训练序列来计算延时相关值,但是延时相关的结果只有8段,即128个值,这些复数值求过相角后取平均(即除以128),可以通过向右移7位实现。
最后再除以Lenth=16,通过向右移4位实现.
4.下面介绍补偿因子的计算。
4.1我们的目的是要计算复指数,先对相角取相反数,再通过累加器进行累加,每到来一个时钟累加一次得到一个(-k*delta_f).
4.2复指数的计算我调用Xilinx Reference Blockset中的Cordic SINCOS模块得到实部与虚部,因为该模块的输入范围是-pi~pi,所以要对累加的结果进行调整.当结果>pi时,将它减去2pi,反之,当结果<-pi时,将它加上2pi,这样既可以保证ordic SINCOS模块合理的输入,又可以避免由累加造成的位宽扩展.
设计结果如下:

5.最后对经过缓存的数据进行补偿,只需要调用一个复数乘法器即可.整个设计的结果如下:

6.总结:
6.1 对于给设计本身,我是将全部可以获得的训练序列求相关再取平均,当然参与平均的数据多 了,结果应该会更可靠,但同时系统的延迟也会增加,其中我也考虑了是否容易实现。譬如说,假如用8段训练序列计算,那么得到112个相关值(或相角),再取平均的话就要除以112,显然相对于我们的移位来说就不那么方便了.
6.2关于使用SysGen的一点体会。第一,当然要将算法划分足够细致,只有算法的每个运算元素你都很清楚,用SysGen实现算法才会很顺畅。第二,在具体实现的时候,可以先不管具体的细节,比如,位宽,小数点位置,怎么截取,延时量为多少等,将需要用到模块先连接好,等总体结构基本确定了,再考虑定量的问题. 第三,设计的输入端尽量增加一级寄存器,这样有利于设计的时序收敛及稳定. 第四,明确模块库中的模块或设置对面积(即资源)的消耗情况,尤其是数据的截断,量化,数据位宽的设置是否合理,既要保证不会出现过载,又要尽量不损失小信号的精度. 第五,关于黑盒子的使用,要注意时钟clk与时钟使能clk_en的关系,在内嵌的代码中他们的关系需要设计者自己指定,SysGen只会提供一个接口给你,在多采样率设计中要尤其注意。另外,代码中信号必须赋初值,否则,有时在SysGen中会提示数据未知等错误.

好了,我终于将这一段时间做的东西和大家分享了,打字真是不容易啊!呵呵,最重要的是,我怕我叙述不清楚大家也看不清楚。所以我尽量地附了图在上面。欢迎大家一起讨论,后面几天我该要准备恶毒的考试了,呵呵!
附件大小yuanli.JPG20.54 KBdelta_f.JPG37.14 KBfenliu.JPG26.09 KBdelta_f_computing.JPG38.28 KBxcorr.JPG40.19 KBkuangtu.JPG21.01 KBbuchangyinzi.JPG44.48 KBquanti.JPG71 KB
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表