路:數(shù)字接收機(jī)位同步的核心技術(shù)解析)
設(shè)備剛上電示波器里基帶信號的星座圖糊成一團(tuán)積分清零判決出來的誤碼率高得沒法看。當(dāng)時第一反應(yīng)是載波沒鎖住結(jié)果查了一圈頻偏是零AGC也正常。最后定位到問題出在采樣時刻——本地采樣鐘和信號符號節(jié)拍根本對不上。這就是位同步的活兒在接收端把“一個符號從什么時候開始”這個問題解決掉。而所有定時同步算法里Gardner環(huán)路是我個人用得最多、也最推薦入門的一種。它結(jié)構(gòu)簡單、每符號只需要兩個采樣點(diǎn)、不依賴載波同步是數(shù)字接收機(jī)里繞不開的核心模塊。這篇文章先把位同步的基本問題和Gardner環(huán)路的原理講透工程實(shí)現(xiàn)和調(diào)試的部分留在后面接著寫。1. 位同步到底在解決什么問題1.1 接收機(jī)為什么需要“知道符號的節(jié)拍”很多朋友剛開始做基帶接收機(jī)時容易忽略一個問題發(fā)射端是按符號速率把數(shù)據(jù)調(diào)制到波形上的但接收端本地采樣時鐘是另一套系統(tǒng)。實(shí)際系統(tǒng)中收發(fā)兩端的晶振標(biāo)稱頻率一樣實(shí)際頻率卻總有偏差——晶振誤差百萬分之一量級已經(jīng)算不錯了再加上多普勒、收發(fā)信機(jī)模擬前端的群延遲接收機(jī)收到的信號里符號的邊界落在哪個采樣時刻完全是未知的。這個“符號邊界落在哪”的問題就是符號定時問題也叫位同步。它本質(zhì)上是一個時鐘恢復(fù)過程接收端從接收波形中估計(jì)出符號的最佳判決時刻然后在這個時刻上抽樣才能把誤碼率壓到最低。舉個例子好理解。QPSK信號在理想情況下每個符號對應(yīng)星座圖上四個點(diǎn)之一。接收端如果采樣時刻正好落在符號周期內(nèi)眼圖睜開最大的位置四個聚類點(diǎn)就是清晰的四個點(diǎn)。一旦采樣時刻偏移采樣值就不再是星座點(diǎn)對應(yīng)的理想值聚類點(diǎn)會展寬、旋轉(zhuǎn)最終判決時誤碼率上升。位同步處理的對象是符號周期的相位和頻率。相位偏差是一個固定的時間偏移比如采樣鐘和符號邊界之間差了個固定的小數(shù)周期頻率偏差則是符號速率和本地符號時鐘之間的頻差它會隨時間積累表現(xiàn)為定時偏差不斷漂移。工程上這兩種偏差往往同時存在所以位同步環(huán)路通常要設(shè)計(jì)成二階環(huán)既能校正固定相位也能跟蹤固定頻差。1.2 采樣點(diǎn)偏了性能損失有多大定時偏差對系統(tǒng)的影響可以用“歐氏距離縮短”來直觀理解。判決是在星座圖上找離接收點(diǎn)最近的理想星座點(diǎn)定時偏離后接收點(diǎn)不再是理想點(diǎn)上它和真實(shí)發(fā)送點(diǎn)的距離變大。距離大了幾類判決出錯的概率就上去了。量化來看在加性高斯白噪聲信道下BPSK在最佳采樣時刻的誤碼率是 Q(sqrt(2Eb/N0))。當(dāng)定時偏差為 τ 時有效信噪比大約會下降一個與 (sin(πτ/T)/(πτ/T))^2 相關(guān)的因子τ/T 是歸一化定時誤差。誤差到 10% 符號周期時信噪比損失也就零點(diǎn)幾個 dB到 30% 時損失已經(jīng)相當(dāng)可觀到 50% 即半個符號周期時BPSK 的 I/Q 兩路基本就反相了誤碼率直接崩掉。這也是為什么定時恢復(fù)電路在幾乎所有相干解調(diào)接收機(jī)里都是標(biāo)配。它不像均衡那樣“修正信道帶來的碼間干擾”而是保證后續(xù)每一個模塊——匹配濾波、均衡、載波恢復(fù)、判決——拿到的采樣點(diǎn)是最可靠的那一個。2. Gardner定時誤差檢測器的核心思路2.1 為什么偏偏是Gardner早期定時恢復(fù)有幾種經(jīng)典思路。早遲門Early-Late Gate方案比較直觀在最佳采樣點(diǎn)的前后各取一個樣本比較兩者幅值是否相等如果前面的樣本幅值大說明采早了反之采晚了。這個方案實(shí)現(xiàn)簡單但要求每符號至少三個采樣點(diǎn)才能工作并且對噪聲比較敏感。平方率定時恢復(fù)是另一個方向?qū)邮招盘柸∑椒狡椒胶蠓査俾侍帟霈F(xiàn)離散譜線用PLL鎖定這個譜線就能恢復(fù)符號時鐘。這個方案不自帶載波相位信息但平方運(yùn)算在低信噪比下?lián)p失大而且需要額外提取譜線實(shí)現(xiàn)復(fù)雜度并不低。Gardner算法1986年提出它把“非數(shù)據(jù)輔助”“每符號雙采樣”“對載波相位不敏感”三個優(yōu)點(diǎn)集中在了一起。非數(shù)據(jù)輔助意味著不需要知道發(fā)送的是什么符號也不需要訓(xùn)練序列直接對接收波形運(yùn)算這在突發(fā)通信和連續(xù)通信里都很方便。每符號只需要兩個采樣點(diǎn)降低了對ADC速率的要求也減少了后續(xù)處理的數(shù)據(jù)量。對載波相位不敏感這一點(diǎn)最實(shí)用意味著定時同步環(huán)路可以放在載波同步之前先鎖定時鐘再處理載波系統(tǒng)設(shè)計(jì)更靈活。2.2 定時誤差公式到底在算什么Gardner定時誤差檢測器的核心公式離散化后可寫成e(k) Re{ [x(kT T/2) - x(kT - T/2)] · x*(kT) }這里 T 是符號周期x(kT) 是第 k 個符號的判決點(diǎn)采樣值x(kT T/2) 和 x(kT - T/2) 是它前后兩個中間采樣點(diǎn)。x*(kT) 是判決點(diǎn)采樣值的共軛。這個式子的物理含義值得拆開講。判決點(diǎn)采樣值 x(kT) 是定時環(huán)最關(guān)心的信息——如果采樣點(diǎn)正好落在符號最大張開處這個值最接近理想星座點(diǎn)。前后兩個中間點(diǎn)分別在相鄰兩個符號的正中間和負(fù)中間它們近似對應(yīng)相鄰符號跳變區(qū)域的值。如果定時完全準(zhǔn)確這兩個中間點(diǎn)的差值應(yīng)該接近零如果定時有偏移差值就會出現(xiàn)系統(tǒng)性不為零的分量。把中間點(diǎn)差值和判決點(diǎn)共軛相乘再取實(shí)部就得到了一個帶符號的誤差信號定時偏早輸出正定時偏晚輸出負(fù)定時準(zhǔn)確時在零附近抖動。這個輸出經(jīng)過環(huán)路濾波后去調(diào)整本地定時相位就能把采樣點(diǎn)一步步推回最佳位置。在符號速率的歸一化數(shù)值仿真里我習(xí)慣用 x(n-1/2) 表示中間點(diǎn)x(n-1) 表示上一個判決點(diǎn)x(n) 表示當(dāng)前判決點(diǎn)那么誤差表達(dá)為e(n) Re{ [x(n-1/2) - x(n-3/2)] · x*(n-1) }實(shí)現(xiàn)時就是把這幾個點(diǎn)從采樣流里取出來做復(fù)乘和加減運(yùn)算非常規(guī)律。2.3 為什么它對載波相位不敏感要理解Gardner對載波相位不敏感關(guān)鍵看信號模型。接收信號經(jīng)過下變頻和匹配濾波后基帶信號可寫為 r(t) Σ a_k g(t - kT - τ) e^{jθ} n(t)其中 a_k 是發(fā)送符號g(t) 是脈沖成型波形τ 是定時誤差θ 是殘余載波相位。誤差檢測器的結(jié)構(gòu)是“中間點(diǎn)差分 × 判決點(diǎn)共軛”。對相鄰符號的中間點(diǎn)做差其實(shí)是在做一階差分它會把相鄰符號的貢獻(xiàn)相減再乘判決點(diǎn)共軛相當(dāng)于做了相關(guān)運(yùn)算。信號中的公共相位 e^{jθ} 在“乘共軛”這一操作下會被抵消掉所以最終輸出的誤差信號里不包含載波相位項(xiàng)。這個性質(zhì)帶來的工程價值非常大。載波恢復(fù)環(huán)路和定時恢復(fù)環(huán)路的耦合在實(shí)際系統(tǒng)里很常見——定時沒鎖好載波環(huán)就很難收斂載波相位沒對齊定時誤差檢測也容易出問題。有了Gardner這種載波相位不敏感的特性就可以把兩個環(huán)錯開先做定時同步再做載波同步或者用獨(dú)立的兩個環(huán)路并行工作調(diào)試時可以把變量隔離開定位問題更容易。3. 把Gardner環(huán)路搭起來五個模塊各司其職3.1 定時誤差檢測器TED的實(shí)現(xiàn)視角定時誤差檢測器本身做的不復(fù)雜但實(shí)現(xiàn)時有幾個細(xì)節(jié)需要想清楚。輸入的基帶采樣流通常是2倍符號速率或者更高。2倍符號速率是Gardner工作所需要的下限一個符號周期里正好有兩個樣本一個是判決點(diǎn)一個是符號邊界附近的中間點(diǎn)。如果前端采樣率是4倍符號速率可以先做抽取把每符號四點(diǎn)到兩點(diǎn)。抽取的時候要注意抽取后的兩個點(diǎn)在符號周期內(nèi)的相對位置要穩(wěn)定否則等于人為引入定時抖動。判定哪個樣本是“判決點(diǎn)”是用環(huán)路自己維護(hù)的定時相位完成的。環(huán)路里有一個NCO數(shù)控振蕩器它輸出的溢出脈沖指當(dāng)前符號的判決位置定時誤差檢測器根據(jù)這個位置從采樣流里挑選判決點(diǎn)和中間點(diǎn)。實(shí)際FPGA工程里用一塊雙口RAM先把匹配濾波輸出緩存起來NCO的相位計(jì)算出讀地址再按地址取數(shù)這樣實(shí)現(xiàn)起來比較干凈。誤差計(jì)算本身對應(yīng)復(fù)數(shù)運(yùn)算對中間點(diǎn)差分結(jié)果與判決點(diǎn)共軛做復(fù)乘并取實(shí)部。BPSK場景下可以簡化成純實(shí)數(shù)運(yùn)算QPSK/更高階調(diào)制就需要保留復(fù)數(shù)形式。運(yùn)算量不大主要開銷在前面說的緩存和地址控制邏輯上。3.2 環(huán)路濾波器與NCO把誤差變成修正量定時誤差檢測器的輸出不能直接去調(diào)采樣時鐘中間需要環(huán)路濾波器整形。這和其他鎖相環(huán)的設(shè)計(jì)邏輯一致。定時偏差主要包含兩項(xiàng)靜態(tài)相位差和符號速率頻差。只做相位校正的話一階環(huán)就夠了要同時跟蹤頻差需要二階環(huán)。二階環(huán)路濾波器典型結(jié)構(gòu)是比例加積分輸出有兩路一路直接比例放大誤差一路對誤差積分。兩者相加作為NCO的頻偏控制字。NCO在環(huán)路里扮演的角色是產(chǎn)生符號時鐘的相位參考。它的核心是一個累加器每個采樣時鐘周期累加一次頻率控制字累加溢出時產(chǎn)生一個“符號節(jié)拍”脈沖。頻率控制字大溢出間隔短符號速率就高誤差信號為正說明采樣偏早需要把符號時鐘調(diào)慢一點(diǎn)這時就把頻率控制字減小誤差為負(fù)則相反。環(huán)路濾波器輸出的就是對這個頻率控制字的小幅修正量。二階環(huán)的Loop Filter系數(shù)設(shè)計(jì)有成熟公式。設(shè)環(huán)路自然角頻率為 ωn阻尼系數(shù)為 ζ比例系數(shù) Kp 和積分系數(shù) Ki 近似取Kp ≈ 2ζωnKi ≈ ωn2ζ 一般取 0.707這是臨界阻尼附近的值環(huán)路收斂速度和超調(diào)量折中比較好。ωn 的選取則要根據(jù)符號速率和期望的收斂時間平衡——環(huán)路帶寬越窄濾噪越好但收斂越慢。工程上歸一化噪聲帶寬 BL·T 常取 0.001~0.01對應(yīng)符號速率歸一化的收斂時間大約在幾千到幾萬個符號周期。突發(fā)通信要求快速捕獲可以放寬到 0.01 甚至更高連續(xù)流傳輸要求低抖動可以壓到 0.001 附近。3.3 插值器重采樣才是真正意義上的“同步”光有NCO的相位信息還不夠因?yàn)楸镜夭蓸隅娛枪潭ǖ牟蓸訒r刻不能真正“移動”。這時就需要插值器用一個數(shù)字濾波器根據(jù)NCO給出的分?jǐn)?shù)間隔在已有的采樣點(diǎn)之間重建任意時刻的信號值。插值器是Gardner環(huán)路里直接影響性能的模塊。最簡單的線性插值實(shí)現(xiàn)簡單但頻譜特性差會引入鏡像和衰減工程上最常用的是Farrow結(jié)構(gòu)的立方插值器系數(shù)固定分?jǐn)?shù)延遲用 μ 實(shí)時控制結(jié)構(gòu)非常適合FPGA和ASIC實(shí)現(xiàn)。Farrow結(jié)構(gòu)的核心思想是把連續(xù)時間脈沖響應(yīng)用分段多項(xiàng)式逼近。以經(jīng)典的3階Farrow為例每組相鄰四個采樣點(diǎn)擬合一條三次曲線給定分?jǐn)?shù)延遲 μ就能算出曲線上任意位置的值。μ 取值范圍通常是 [0,1)代表期望插值點(diǎn)落后于最近整數(shù)采樣點(diǎn)的比例。NCO輸出的相位小數(shù)部分正好可以作為 μ。硬件上Farrow結(jié)構(gòu)用幾級乘累加樹實(shí)現(xiàn)延遲固定吞吐率高是當(dāng)前數(shù)字接收機(jī)里最主流的插值方案。3.4 模塊級聯(lián)順序與參數(shù)關(guān)系完整的定時同步環(huán)路模塊級聯(lián)順序大致是ADC輸出 → 數(shù)字下變頻 → 匹配濾波 → 定時同步插值器 TED 環(huán)路濾波器 NCO→ 后續(xù)處理均衡/載波恢復(fù)/判決。匹配濾波必須放在定時同步之前因?yàn)槠ヅ錇V波本身是匹配發(fā)送脈沖成型的它能把相鄰符號間的碼間干擾壓低。做完匹配濾波后信號的脈沖形狀才接近升余弦此時定時誤差檢測的S曲線特性最好。如果順序反了定時誤差檢測器工作在一個還沒成型濾波的信號上誤差曲線會有亂碼間干擾環(huán)路性能明顯下降。AGC要放在定時同步之前這也關(guān)鍵。Gardner誤差檢測器輸出的幅度與輸入信號功率成正比AGC的職責(zé)是把信號功率穩(wěn)定在一個已知水平這樣環(huán)路濾波器的系數(shù)才能按固定增益設(shè)計(jì)。沒有AGC的環(huán)路輸入信號幅度變化環(huán)路帶寬也跟著變嚴(yán)重時會出現(xiàn)信號弱時鎖不住、信號強(qiáng)時抖動大的情況。4. 工程實(shí)現(xiàn)中容易踩的坑4.1 滾降系數(shù)太小環(huán)路就不愛收斂我調(diào)試一個符號速率100 Msps、滾降系數(shù)α0.1的鏈路時發(fā)現(xiàn)Gardner環(huán)路怎么調(diào)都不收斂誤差信號一直在小范圍抖動星座圖遲遲張不開。原因在升余弦脈沖的特性。滾降系數(shù) α 越小眼圖張開區(qū)域越窄定時誤差檢測器S曲線在零點(diǎn)附近的斜率也越小。斜率小意味著同樣的定時偏差產(chǎn)生的誤差信號幅度小環(huán)路增益不足收斂自然慢。處理方法是把環(huán)路帶寬調(diào)寬或者人為對誤差輸出做增益補(bǔ)償。我當(dāng)時把 BL·T 從 0.003 調(diào)到 0.008收斂速度立刻改善。但代價是穩(wěn)態(tài)抖動變大了星座點(diǎn)EVM有所惡化。后來換了個思路用拋物線插值更高增益的TED前置放大配合窄環(huán)路既保證了收斂速度也保住了穩(wěn)態(tài)精度。另外一個工程慣例是低滾降系數(shù)場景下可以先做匹配濾波再定時同步讓TED看到的脈沖波形更“胖”S曲線斜率更大。這個順序問題前面提過這里強(qiáng)調(diào)一下它對低滾降系數(shù)的系統(tǒng)尤其敏感。4.2 高階QAM下Gardner不再“無腦好用”Gardner算法最初是針對BPSK/QPSK這類恒?;蚪隳U{(diào)制設(shè)計(jì)的。QPSK信號在理想判決點(diǎn)附近幅值是常數(shù)中間點(diǎn)差分和判決點(diǎn)共軛的乘積很容易歸零。但16QAM、64QAM這種高階調(diào)制星座點(diǎn)分布在多個幅值圓上信號本身包含幅度調(diào)制分量誤差檢測器的輸出里就會混入與符號能量相關(guān)的偏置。實(shí)測16QAM時把定時誤差檢測器的輸出拉出來看S曲線不再是零附近對稱而是整體平移了一段。這個平移會造成定時偏差估計(jì)的偏置環(huán)路最終鎖定的采樣點(diǎn)系統(tǒng)性偏離最佳位置。工程上常見的兩種處理辦法。一是加能量偏置補(bǔ)償估計(jì)星座平均能量在誤差輸出端減去一個和符號能量相關(guān)的修正項(xiàng)曲線對稱性就恢復(fù)了。二是改用判決輔助型GardnerDD-Gardner把x*(kT)換成判決后的符號共軛誤差檢測精度更高但需要先有可靠的判決這引入了對均衡和載波同步收斂的依賴。我實(shí)際項(xiàng)目里用的是折中方案先用普通Gardner把定時同步粗拉到可判決水平切換判決輔助模式做精同步鎖定后星座EVM比純Gardner好了不少。4.3 定點(diǎn)實(shí)現(xiàn)里的小數(shù)位寬問題FPGA定點(diǎn)實(shí)現(xiàn)時環(huán)路濾波器的系數(shù)很小比例系數(shù)可能只有0.001積分系數(shù)更小。定點(diǎn)量化后這些系數(shù)很容易被截?cái)嘣肼曋鲗?dǎo)輕則收斂速度變慢重則根本無法收斂。我吃過這個虧。Vivado里做18位定點(diǎn)仿真定時恢復(fù)一直鎖不住最后定位到問題是環(huán)路濾波器積分支路的截?cái)嗾`差太大。積分器本質(zhì)上是一個累加器截?cái)嗾`差會不斷累積最終成為頻率控制字上的一個固定偏置。解決辦法是給積分支路保留足夠的額外位寬——我當(dāng)時是把積分器內(nèi)部位寬加到36位輸出時再截?cái)嗷?8位效果立竿見影。做定點(diǎn)化的人經(jīng)驗(yàn)法則先做全浮點(diǎn)仿真鏈把各級信號的動態(tài)范圍記錄下來按最大值加20%余量去定標(biāo)。環(huán)路濾波器內(nèi)部計(jì)算鏈路的位寬按“輸入位寬 系數(shù)位寬 額外6位”去估算寧多勿少定標(biāo)完成后用定點(diǎn)仿真和浮點(diǎn)仿真對比誤差信號確認(rèn)性能損失在1dB以內(nèi)再固化參數(shù)。4.4 從“收不開眼”到“穩(wěn)穩(wěn)鎖定”的調(diào)試步驟定位定時同步問題我有一套習(xí)慣性的排查順序這里寫出來給大家參考。第一步把環(huán)路斷開固定NCO頻率控制字為標(biāo)稱符號速率手動掃描定時相位值對每個相位計(jì)算TED的平均輸出畫出一條S曲線。這條曲線能直觀看出定時偏移的方向和檢測器的增益。如果S曲線形狀不對先排查插值器和點(diǎn)選邏輯。第二步閉合環(huán)路但環(huán)路帶寬先拉到很寬比如 BL·T 0.02看環(huán)路能否收斂。寬帶寬收斂快便于確認(rèn)基本功能正確。收斂后逐步收窄帶寬每收窄一次觀察EVM和誤差信號抖動找到一個EVM不再明顯改善的帶寬點(diǎn)再留一些余量。第三步觀察誤差信號的均值。環(huán)路鎖定后TED輸出應(yīng)該在零附近隨機(jī)抖動。如果均值明顯不為零說明存在定時偏差偏置或數(shù)據(jù)圖案相關(guān)性就需要檢查是不是信號里有直流分量或者前面的抽取時點(diǎn)位置不穩(wěn)定。這三步走完絕大多數(shù)定時同步不收斂的問題都能定位到具體模塊。5. 實(shí)測場景里的幾個判斷方法5.1 時域和頻域怎么快速判斷位同步是否鎖定鎖定判斷在日常調(diào)試?yán)镆觳荒苁率露忌闲亲鶊D和EVM分析。我在實(shí)踐中主要看三個信號。一個是TED輸出用示波器或邏輯分析儀抓誤差序列。鎖定狀態(tài)下誤差序列是零均值隨機(jī)抖動未鎖定時誤差序列有明顯的周期性或直流偏置周期通常等于符號周期的倒數(shù)。這個信號最直接也能順帶觀察收斂過程。一個是NCO頻率控制字。鎖定后控制字應(yīng)該在標(biāo)稱值附近小范圍波動。如果控制字一直在單向爬升說明頻差還沒被完全拉掉如果控制字抖動幅度大說明環(huán)路帶寬過寬或輸入信號噪聲太大。一個是插值器輸出的波形在下變頻到基帶后看眼圖。定時鎖定的眼圖是清晰張開的“眼睛”邊界線和張開區(qū)之間的垂直間距大未鎖定或鎖定不好的眼圖眼睛張開區(qū)域會收窄、變模糊。眼圖判斷雖然老土但在示波器上永遠(yuǎn)是最快的。5.2 不同調(diào)制方式下Gardner環(huán)路的兼容性同一套Gardner環(huán)路在不同調(diào)制方式下的表現(xiàn)我實(shí)測下來的經(jīng)驗(yàn)是這樣的BPSK最簡單實(shí)數(shù)運(yùn)算就夠誤差檢測器SNR高收斂快穩(wěn)定后抖動小適合作為第一個驗(yàn)證對象。QPSK/OQPSK是Gardner的“主場”性能優(yōu)秀。OQPSK有一點(diǎn)要注意它的I/Q兩路符號偏移了半個符號周期中間點(diǎn)的定義要按各路分別處理不能直接拿復(fù)信號做復(fù)數(shù)乘法再取實(shí)部。早期我們在這個坑里卡了好幾天星座圖始終是兩團(tuán)霧。16QAM用原始Gardner可以用但EVM比QPSK明顯差偏置校正或判決輔助是更穩(wěn)的選擇。64QAM基本不建議直接用原始Gardner必須上DD-Gardner或改用其他定時恢復(fù)算法。如果項(xiàng)目里要為多種調(diào)制方式共用一套定時同步硬件我建議把偏置補(bǔ)償和判決輔助切換都做成可配置項(xiàng)FPGA里多花一點(diǎn)點(diǎn)邏輯換來的是多協(xié)議適配能力很劃算。最后再分享一個小技巧。調(diào)制方式切換后定時常數(shù)不能一成不變。固定帶寬下QPSK和16QAM的最佳收斂時間不一樣因?yàn)椴煌{(diào)制方式的S曲線斜率不同。我會在協(xié)議配置里把環(huán)路帶寬做成寄存器可配置按當(dāng)前調(diào)制方式自動切一套系數(shù)這樣每一檔調(diào)制都能在相同時間內(nèi)完成捕獲。這個做法在項(xiàng)目聯(lián)調(diào)時省了不少事推薦有同樣多模需求的同學(xué)試試。