☰
基于AD9361与FPGA的DPSK调制解调系统设计与实现
2026/10/20 6:11:43 网站建设 项目流程

之前做一版基于绝对相位的PSK收发系统时,整个链路调了两周没能完全收工,短距离同轴自环一切正常,一换到真实射频通道就撞上相位模糊,载波恢复非常艰难。后来把调制方式整体换成DPSK,用AD9361做射频前端,问题一下清爽许多。这篇文章就把这套完整实现整理出来:从差分编码、根升余弦成形、定时同步,到AD9361的寄存器配置、AGC选型和最终的误码率联调,覆盖一条可以完整复现的DPSK调制解调链路。适合正在做软件无线电平台的FPGA工程师、准备射频通信设计的学生,以及任何想搞明白AD9361到底该怎么用的人。

1. 系统整体设计与方案选型

1.1 为什么把射频链路交给AD9361

在做这套系统之前,我其实认真考虑过两条路线。一条是传统的超外差方案,自己画射频前端、中频链路、本振和基带ADC/DAC的板级电路;另一条是直接买了一块集成了AD9361的收发模块,用FPGA通过SPI接口控制所有射频参数。最后选了第二条,原因很直接:传统方案里每一级的增益、滤波、混频隔离都要单独调,哪怕只是一个轻微的本振泄漏问题,排查起来就是好几天;而AD9361把本振、混频器、可编程低通滤波器、增益控制和12位ADC/DAC全部集成到了一颗芯片里。

AD9361的工作频率范围是70MHz到6GHz,信号带宽从200kHz到56MHz可调,具备双收发通道,支持TDD和FDD两种工作模式。对本项目来说,这些参数完全够用,而且所有模拟链路的配置最终都转化为SPI寄存器读写,意味着整个射频前端的调谐过程可以完全自动化。更关键的是,这颗芯片内置了多项校准功能,包括本振泄漏校准、IQ不平衡校准和基带滤波器校准。在校准之前,我担心的镜频抑制和载波泄漏问题,对分离器件方案来说可能要花几周去手工补偿,在这里只是启动时几段校准序列的事。

不过它也并非没有代价。AD9361的寄存器数量和状态机复杂度远高于普通射频芯片,ENSM状态机的时序、各模块的使能顺序、校准启动的条件都直接影响能否正常工作。这个在后面配置环节会详细展开。

1.2 为什么调制方式选DPSK

DPSK的全称是差分相移键控,它的核心思想是把信息编码在相邻符号的相位差上,而不是绝对相位上。对于普通BPSK或QPSK,接收端要恢复出正确的数据,必须先消除载波相位模糊的问题。这个模糊来源于接收端本振与发送端本振之间的相位关系实际上无法事先确定,甚至可能出现180度或90度的整数倍偏转。如果没有额外的手段,解调结果可能整体反转或错乱。

DPSK用差分编码绕开了这个难题。假设当前数据比特映射为m(k),发射端真正发送的相位编码符号d(k)满足d(k) = d(k-1) × m(k),也就是说每个符号都携带了“相对前一个符号的变化量”。接收端只需要把当前符号与延迟一个符号周期的共轭相乘,得到的相位差就是原始信息,完全不需要知道绝对相位。这样做有一个附加好处:接收机的载波同步环节可以大幅简化。

代价当然也有。差分检测相对相干检测大约有1dB左右的信噪比损失,对DBPSK而言比较典型。但在这个项目里,我更看重的是链路能够在尽量短的时间内收敛、稳定工作,而不是追求0.5dB的极限性能,所以DPSK是明确更优的工程选择。验证完DBPSK之后,再扩展到DQPSK也只是编码映射表的变化,整体架构无需改动。

1.3 整体架构与数据流向

整个系统从上位机到底层硬件的流向值得提前画清楚。发射方向,PC或者板载测试模块产生原始比特流,送入FPGA,经过差分编码、符号映射、根升余弦成形滤波后,以基带I/Q的形式送到AD9361的TX数字接口,再由片上混频器搬移到设定的射频频点,经天线发射。接收方向,信号从天线进入AD9361的RX通道,经过低噪声放大器、混频器和ADC后,输出基带I/Q数字流,回到FPGA,依次经过匹配滤波、定时同步、差分解调和逆映射,最终得到恢复的比特。

还有一个容易被忽略的部分是控制链路。FPGA通过SPI读写AD9361寄存器来配置频率、带宽、增益和工作模式,同时用GPIO控制ENSM状态机的切换。整体架构里,所有射频参数和基带算法解耦,后续如果想换调制方式,不需要改动射频板卡。

2. DPSK调制解调的基带关键环节

2.1 差分编码与解码的实现

DPSK的基带核心在于差分编码。以DBPSK为例,设原始二进制比特b(k)∈{0,1},先做一次映射得到m(k),比如b(k)=0时m(k)=+1,b(k)=1时m(k)=-1。接着做差分编码,d(k) = d(k-1) × m(k),这里d(k)就是实际发送的符号。

通信标准里经常把这一步和调制合并描述:信息不在d(k)本身的相位上,而在d(k)相对d(k-1)的相位变化上。FPGA实现时用寄存器保存d(k-1),每来一个新符号把当前映射值和寄存器里的值相乘,结果同时输出并更新寄存器,逻辑非常简单。

接收端解差分采用延迟共轭相乘。设接收符号为r(k),则判决量c(k) = r(k) × conj(r(k-1))。对DBPSK而言,判决时只需要看c(k)的实部,正判为+1,负判为-1,之后再做一次逆映射得到恢复比特。这一过程的数学含义是:如果r(k)和r(k-1)的相对相位差为0,则c(k)的实部为正;如果相位差为π,则实部为负。

有一个细节容易出错:每个数据包或突发帧开头的那一个符号没有前驱,差分编码需要一个初始状态。实际项目中必须把每帧的第一个符号固定为已知参考,不能让它依赖前一帧的末尾。如果不做这个重置,跨帧传输时一旦前面发生了错误,整个后续帧都会因为差分结构而连带出错。

DQPSK的实现只是在映射表上多一个维度,原始比特两两一组映射到四个相位偏移,推荐使用Gray映射,这样相邻相位之间的误判只产生一个比特错误,有助于降低最终误码率。

2.2 成形滤波器与过采样率设计

数字通信场景下,信号带宽不能直接按“符号速率”来估算。矩形脉冲的频谱旁瓣衰减极慢,直接发送会造成严重的邻道干扰。所以工程上普遍采用升余弦或根升余弦成形滤波,本项目选择根升余弦。

为什么是根升余弦而不是升余弦?因为根升余弦的好处是发射端和接收端各用一次,两个相同的根号滚降滤波器级联后总响应等于升余弦,正好满足奈奎斯特无码间串扰条件。换句话说,我把滚降特性拆分到了收发两侧,成形和匹配滤波同时完成。

滚降因子α决定了占用带宽。信号带宽约等于(1+α)×Rs/2,其中Rs是符号速率。本项目选择α=0.35,这是一个很常用的折中:低于0.2时带宽利用率更高,但滤波器阶数和实现复杂度明显增加,定时误差的影响也更敏感;高于0.5时则浪费频谱。过采样率选择4倍,也就是每个符号采4个点。对FPGA实现来说,4倍过采样能提供定时同步需要的中间插值点,DSP资源消耗也可控。

滤波器的阶数这里用了31阶,系数在Matlab里用firrcos设计后量化成16位定点。这里特别提醒一下,AD9361的ADC只有12位,但滤波器中间累加宽度至少要保持16位,否则滤波器量化噪声会被后续定时同步放大。实测下来,16位系数配合16位中间累加,输出星座图的汇聚度比单纯12位量化好不少。

2.3 差分解调与判决

解调端最关键的是延迟共轭相乘。具体实现中,需要用一个符号周期的延迟寄存器保存上一符号的复数I/Q值,当前符号与上一符号共轭直接复数相乘。DBPSK的判决只看实部:实部大于0判为+1,小于0判为-1。DQPSK则要看实部和虚部的关系,或者直接对相位差做象限判决。

频偏对DPSK的影响机制值得说清楚。发射端和接收端的射频载波如果存在频率差Δf,那么在延迟一个符号周期T_s之后,相位会额外旋转2π×Δf×T_s。差分解调相当于对这个旋转做了差分,所以只要2π×Δf×T_s这个累积相位不至于把信号旋到判决门限另一边,系统仍能工作。工程上,归一化频偏Δf×T_s小于0.1时性能退化不大。举例来说,符号速率100kbps的DBPSK,T_s=10微秒,能容忍的频偏大约10kHz,这在2.4GHz频段几ppm晶振误差范围内是能扛住的。但如果符号速率降到1kbps,同样频偏就会成为严重问题,需要先做自动频率控制,或者引入额外导频估计。

另一个经验是判决前的归一化。因为延迟相乘结果的幅度受信号功率和噪声影响会变化,但决判只需要符号,所以不需要做除法归一化。如果非要归一化到固定幅度,反而会把噪声放大,得不偿失。

2.4 定时同步与帧同步

很多初次接触DPSK的同学会误以为差分调制可以省掉定时同步,实际上不行。差分只是消掉了载波相位模糊,但符号采样时刻仍然要校准。AD9361虽然让收发采样率来自同一个时钟参考,但发射机和接收机的独立PLL仍然存在微小频差,必须依靠接收端基带算法恢复符号定时。

定时同步这里选了Gardner算法,它利用每个符号周期内的两个相邻采样点和一个中间零点来产生误差信号。优点是独立于载波相位,适合DPSK这种没有先验载波相位信息的场景。环路滤波器比例增益设为0.01,积分增益设为0.001量级,带宽折中在跟踪速度与噪声抑制之间。实测中,如果环路带宽过大,星座点会明显抖动;太小则温度变化时符号定时漂移跟不上。

帧同步的任务是让接收端知道每个数据包从哪里开始。我采用巴克码序列做包头,接收端用滑动相关检测。巴克码自相关旁瓣低,实现只需一个移位寄存器和加法器。检测到相关峰后,再从峰值位置向后延迟若干符号进入解调模块。这里必须保证差分编码的参考符号位于巴克码之后,并且每帧重置。

3. AD9361的配置与射频链路适配

3.1 数字接口配置与速率匹配

AD9361的数字接口支持CMOS和LVDS两种电平标准,模式上有单端口、双端口以及半双工、全双工之分。本项目采用LVDS双端口全双工,每个端口各自负责I路和Q路,数据格式选择二进制补码,位宽12位。

接口总数据速率需要和采样率严格匹配。对ADC/DAC为12位I/Q双通道的情况,接口速率等于采样率乘以位宽再乘以通道数。以一个具体参数为例,符号速率设为125kbps,4倍过采样后采样率500ksps,每个采样点包括12位I和12位Q,那么总线数据速率约12Mbps。这个速率对LVDS来说比较轻松,配置时留出裕量即可。

实际调试中,数字接口最容易埋的坑是I/Q交叉和位序错乱。LVDS数据线接反、或者接收端解串器把高位当成了低位,都会直接导致星座图变成一团乱码。排查这类问题的诀窍是先用已知的测试序列送入TX,在FPGA端抓取RX数据核对,确认位映射对齐后再跑完整链路。

3.2 射频频率、带宽与滤波器配置

载波频率的选择根据应用场景决定,本项目把频点设在2.45GHz附近。AD9361内部频率合成器通过SPI寄存器设定目标频点,写入后需要检查PLL锁定状态位,锁定后再进行下一步操作。

基带低通滤波器的带宽要按照符号速率和滚降因子来算。信号带宽约为(1+α)×Rs/2,对于Rs=125kbps、α=0.35,带宽约84kHz,两倍后实际占用双基带带宽约168kHz。AD9361的模拟基带滤波器档位不是连续可调的,需要选择最接近且略大于所需带宽的档位,避免切掉有用信号边缘。

TX方向同样配置相同带宽,发射功率则根据功放饱和点留出至少6dB回退。成形后的信号虽然是恒包络调制的衍生形式,但经过RRC成形后存在峰均比,发射功率推得太高容易进入压缩区,引起星座点畸变。

有一个值得注意的频率规划问题:发送本振如果和接收本振相同,自环测试时频谱仪会看到泄漏在中心频点上的载波分量,这是混频器不平衡导致的正常现象。若泄漏电平过高,需要检查校准是否完成,而非简单认为硬件故障。

3.3 AGC模式选择和增益参数

AD9361支持手动增益MGC和自动增益AGC。AGC又分快速、慢速两种模式。对于DPSK系统,AGC模式选择直接决定接收信号的连续性。

很多人一开始喜欢无脑开AGC,认为自动增益方便省事。但实际测试中,快速AGC在输入功率快速波动时,增益步进会带来瞬态幅度变化,这些突变反映到基带就是I/Q幅度的突然跳变,星座点会短暂散开,解调误码率跟着飙升。对本项目的固定衰减自环和近距离点对点场景,接收功率相对稳定,因此我更推荐先使用MGC手动增益。具体做法是:先开AGC跑一段时间,观察增益收敛到哪个值,然后读取当前增益寄存器值,固定到MGC模式手动设置该值。这样既获得了最佳信号摆幅,又避开了AGC瞬态噪声。

慢速AGC模式适合信号起伏缓慢但持续时间长的场景,快速AGC则更适合跳频通信这类突发工作。如果后续项目需要机动性,可以再切回AGC,但必须在同步算法里加入增益突变的补偿策略。

3.4 时钟与参考源设计

AD9361有一个外部参考时钟输入,内部各PLL基于该参考源生成收发本振和采样时钟。参考源的相位噪声直接影响接收端的误差向量幅度EVM,所以必须选择低相噪晶振,而不能贪便宜用普通晶振。

发射和接收的采样时钟虽然源自同一个参考,但由于TX和RX各自有独立PLL链路,且AD9361的BBPLL在多次分频和锁相后仍存在极小的频率偏移,所以接收端定时同步模块仍然是必需的。这一点在设计基带时不能省略。

参考晶振的频率值需要在寄存器里正确设置,不一致会导致所有频率计算漂移。上电后可以先执行各模块的校准流程,包括TX/RX带通滤波器校准、本振泄漏校准和IQ平衡校准,校准完成后链路才可正常发射信号。

4. 联调实测与性能评估

4.1 测试环境搭建

联调时先不要急着上天线。我用同轴电缆把AD9361的TX输出直接连到RX输入,中间串接可调衰减器。自环测试的最大优势是隔离了空间干扰,一旦出现问题,要么是基带算法,要么是射频参数配置,排错范围很明确。

硬件连接好后,依次完成下列启动顺序:给FPGA加载固件,初始化AD9361的SPI配置,执行校准序列,等待ENSM就绪,然后才发送调制信号。测试工具方面,FPGA内部的逻辑分析仪抓取解调前和解调后的关键信号,外部频谱仪观察TX射频频谱,示波器看基带I/Q波形。

一个很重要的测试点:在AD9361的RX输出端把基带I/Q直接引到FPGA内部调试口,先不经过任何解调算法,观察频谱能量是否正确落在预期频带内。如果这一步都是乱的,后面所有算法都不用调了。

4.2 频谱和星座图观察

发射频谱用频谱仪看。一个正常的DBPSK信号在RRC成形后,频谱应该呈现左右对称的滚降形状,主瓣带宽与理论计算一致,阻带衰减明显。如果看到频谱形状奇怪,比如主瓣塌陷或杂散急剧上升,优先怀疑滤波器参数配置和过采样率是否匹配。

星座图是判断接收链路质量最直观的工具。理想情况下,解调前的基带I/Q信号在DBPSK自环测试中会看到两个较集中的聚类点,DQPSK则看到四个聚类点。星座图出现旋转,说明存在残余频偏;出现明显的椭圆而不是圆,说明IQ增益不平衡;点迹过多重叠、扩散明显,则通常对应噪声过大或定时同步未收敛。

当星座图异常时,我一般按顺序检查:先看频谱中心位置是否偏移,确认频偏大小;再看接收I/Q的峰值幅度,确认AGC或MGC的增益是否合适;最后检查定时环路的锁定指示,排除同步问题。绝大多数星座图异常都能在这三步里定位。

4.3 误码率测量方法

误码率测量需要一条确定的比特流。本项目在FPGA里实现了一个伪随机序列发生器,发送端和接收端使用相同的生成多项式,接收端解调得到比特后与本地生成序列比对,用计数器统计错误比特数。连续统计到设定数量,比如误码100个以上,确保结果有统计意义。

测试流程是逐级增大衰减值,每档停留足够时间记录误码率。从自环最高接收功率开始,大约每增加3dB衰减记录一次。测出来的误码率曲线与理论DBPSK曲线对比,实测一般会差1到2dB,这是滤波损耗、量化噪声和同步非理想带来的合理代价。如果差距超过3dB,就要回头检查链路哪里引入了额外噪声。

还应该单独测试频率偏置场景。在AD9361的TX和RX配置不同载波频率,人为制造几千Hz的频差,观察误码率如何变化。这个测试能确认差分解调对频偏的容忍能力是否满足设计指标。我实测在归一化频偏0.05以内,误码率性能基本无可见下降,超过0.1后才明显恶化,与理论预期吻合。

4.4 性能瓶颈分析

整套系统联调完成后,再回头看整条链路的性能瓶颈往往不在AD9361本身。A/D量化噪声、滤波实现的定点误差、定时环路噪声都是常见限制因素。AD9361的12位ADC在正常增益设定下,量化噪声远低于信道热噪声,因此不会成为首要限制。

真正容易成为瓶颈的是定时同步的带宽选择。环路带宽太宽会把更多噪声带入符号采样点,太窄又跟不上频率漂移。另一个隐性瓶颈是基带滤波器系数量化后导致的带内纹波,会小幅抬高误码率。如果后续要提升性能,优先考虑三件事:提高滤波器有效位宽、加入频偏粗估功能、优化AGC在快衰减环境下的行为。

5. 常见问题与排查心得

5.1 AD9361上电与配置类问题

AD9361启动时序比较讲究。有一次我上来就直接拉高ENABLE引脚,结果ENSM状态机始终无法进入FDD模式,寄存器读取一切正常但RX完全没有输出。查了原厂文档才发现,ENSM唤醒需要等待内部状态机完成从休眠到待机再到激活的切换,直接跳步会导致状态冲突。正确做法是初始化完成后,先读取状态寄存器确认当前状态,再按顺序写入下一状态的触发命令。

校准失败也是高频问题。基带滤波器校准在参考时钟未稳定时会报错,SPI时钟过快也可能导致寄存器写入错误。遇到校准失败,先检查参考时钟的输出频率是否准确,把SPI时钟降到10MHz以下重试,成功率会高很多。

还有一类问题是RX无数据但寄存器配置看起来都正确。这时候优先检查数字接口电平标准是否匹配,CMOS模式和LVDS模式的配置位不能搞错;其次是检查I/Q数据格式是二进制补码还是偏移二进制,不一致时整条链路全乱。

5.2 信号质量异常排查表

冬瓜茶这里整理了一个快速对照表,适合联调时直接查阅。

异常现象可能原因排查动作
星座点整体旋转收发频偏过大检查晶振偏移量,配置相近频点,观察旋转速度
星座点成椭圆IQ增益不平衡执行IQ校准,检查MGC下I/Q幅度
星座点散开无规则定时未同步或噪声过大检查定时环锁定标志,降低衰减
频谱主瓣不对称RRC滤波器系数错误调回发送端并读取滤波器系数配置
频谱存在明显杂散本振泄漏或镜像信号重新执行校准,检查射频滤波配置
误码率平台抬高增益过大导致压缩或AGC瞬态改用手动增益,降低发射功率至线性区

5.3 基带算法和同步问题

差分解调最常见的误码率异常来自包头参考符号处理。如果每一帧的起始符号没有重置为固定值,帧之间的随机相位延续会导致首符号误判,且该误判会沿着差分结构向后传播。在FPGA里实现时,我会在帧同步检测到巴克码峰值后,插入一个延时等待逻辑,确保参考符号稳定后差分寄存器再开始工作。

定时同步不收敛时,先不要想着调环路参数。建议先用离线数据在Matlab里跑一遍Gardner算法,确定理论上的误差信号范围和正确极性,再回FPGA对比寄存器中间的误差值。很多“同步不收敛”其实只是误差信号极性反了或者归一化系数不对。

另外一个容易忽略的点是差分接收端的幅度归一化。如果AGC后信号幅度过大或过小,延迟相乘的结果可能出现定点溢出,造成判决错误增加。可以在延迟相乘前加一个移位或饱和处理,把I/Q数据统一缩放到合适范围。

5.4 快速定位的设备与方法

调试这类型系统,工具链里最有用的是信号源加频谱仪的组合。用信号源输出一个定标单音载波,射频接入AD9361的RX端,然后在FPGA内部读取解调前的I/Q幅度,可以快速确认从天线口到ADC的链路增益是否正常。如果幅度和信号源电平对不上,优先检查衰减器设置和MGC增益值。

另一个高效调试习惯是每次只改一个变量。AD9361的寄存器动辄几十个,同时改两三个参数时出了问题根本分不清是哪个引起的。我习惯把所有关键寄存器值记录下来,每次改动只动一个,然后立即观察星座图和误码率的变化。这个习惯让大部分问题都能在十分钟内定位到具体配置项。

自环验证通过后再上真实天线,这是必须坚持的原则。上天线后如果问题复现,优先排除环境干扰,用频谱仪扫描目标频段的背景噪声和干扰信号,再考虑链路参数调整。

最后再分享一点个人体会:DPSK这套方案在工程稳定性上确实帮了大忙,差分结构天然规避了相位模糊,AD9361的集成射频链路则把模拟调试时间压缩到了最低。但这款芯片的寄存器体系是一个“能做很多事”的复杂系统,上电时序和校准流程必须按规范来。我的经验是:第一步先用最简单的手动增益、固定参数把链路跑通,成功了再逐步加入AGC和自适应功能,否则一旦出错,排查范围会被动态特性搞得非常大。还有一个小建议,联调时把参考时钟、载波频率、符号速率这个“铁三角”参数打印在测试台旁边,几乎所有最终问题都能回溯到这三个值的不一致上。链路调完之后,这套架构后续扩展也非常顺手:加一个频率粗估补偿模块,就能把窄带低速场景下的频偏容忍能力再提一个量级;预留的基带接口切换QAM或扩频波形也不需要改动射频板卡。整个系统的价值不在于某一个环节的极致指标,而是每个环节都能在工程约束下踏实工作。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询