FPGA實現OFDM(二)-整體系統框架

FPGA實現OFDM(二)-整體系統框架

本篇承接(一),首先介紹除了OFDM外,一個完整通信鏈路中所需的其他環節。然後會給出發射機鏈路和接收機鏈路的整體框圖,最後結合802.11a介紹相關技術指標。

FPGA實現OFDM(1)-OFDM原理

系統框圖調整

img

在上一篇中,框圖部分我們剛介紹了用IFFT/FFT來實現OFDM,通過加循環前綴(CP)來消除ISI和減少ICI。

在這一節中,我們要將整體的OFDM基帶實現模型給完整描繪出來,即:

image-20200528144927669

其中,圖上省略了在輸入的二進制數據之後,FEC編碼器之前的加擾的部分,作用是爲了避免出現長串的1或0,影響接收機的定時.

前向糾錯(英語:forward error correction,縮寫FEC)或信道編碼(英語:channel coding)是一種在單向通信系統中控制傳輸錯誤的技術,通過連同數據發送額外的信息進行錯誤恢復,以降低比特誤碼率。

擾碼器

在數字通信中,如果出現常‘1’或者常‘0’序列都會影響接收機鏈路中同步的建立和保持。所以往往可以在發射機鏈路中加入擾碼器(scrambler)來將數字信號變換爲具有近似白噪聲統計特性的數字序列.這樣同時能限制電路中存在不同程度的非線性特性對其他電路通信造成的串擾.

所謂加擾,即在不增加冗餘而攪亂信號,改變其統計特性.這項技術的實現方式即耳熟能詳的反饋移位寄存器序列(即僞隨機序列,m序列).

在硬件實現上,有兩種不同的實現方式,分別是輸入信號不經過寄存器:

Inked002DpWe4gy6PQfRJ2cZb5&690_LI

和輸入信號經過寄存器:

002DpWe4gy6PQjiCWKC42&690

其中,圖中的+號爲模2加法,即可以使用異或實現.而在這裏,802.11a中採用的是方式1,其中生成多項式爲:

S(x)=x7+x4+1S(x)=x^{7}+x^{4}+1

在這種方式下,解擾(descrambler)的過程與加擾電路完全一致.

信道編碼

在加擾後,爲了加強對信道的抗噪能力,我們需要引入額外的監督碼元來對接收信號進行檢錯糾錯即信道編碼過程.由於這一部分原理猶如天書,所以僅儘量寫得像是個人能讀懂的.

在802.11a中主要採用了:卷積編碼.在框圖中將稱之爲FEC(forward error correction,前向糾錯)編碼/譯碼器

卷積碼原理

卷積碼的由來,是因爲輸入的原始消息數據會和編碼器(encoder)的衝激響應(impulse response)做卷積運算。即:

yij=k=0hkjxiky_{i}^{j}=\sum_{k=0}^{\infty} h_{k}^{j} x_{i-k}

其中x爲輸入信號,y爲輸出信號,而h則爲輸出信號的衝激響應.

卷積碼具有以下特性:

  • 一段k字符的消息(k字符的二進制元字符串)會被編碼變換成n字符的符號,k/n即是編碼率(code rate,n ≥ k)

  • 監督碼元不僅和當前的比特信息段有關,而且還同前面m= (N – 1)個信息段有關,將N稱爲碼組的約束度.

  • 可將卷積碼記作(n, k, m),其碼率爲k/n.

編碼過程

一個(n,k,m)卷積編碼器由Nk個移位寄存器和n個模2加法器組成。編碼輸出的n比特不僅取決於正在移入的k比特,還與這之前輸入的m個k位有關。所以對一般框圖來說:

圖片1

有三個基本組件,1是移位寄存器,2是模2加法器,3是每輸入一組數據,對加法器的並串轉換.

自然地,由於其"記憶"的特性,我們可以將此過程看成一個有限狀態機,存在着2m2^m個狀態,而由於移位寄存器每次移入k位,所以每次狀態跳轉有2k2^k個分支.

話不多說,我們直接以802.11a中的卷積編碼模型爲例解釋:

802.11a協議中規定卷積編碼使用的生成多項式是g0=1338g_0=133_8g1=1718g_1=171_8,碼率爲1/2.

其中的生成多項式指8進制下的133和8進制下的171,我們可以改寫成:

S(x)=x6+x5+x3+x2+1g0S(x)=x6+x3+x2+x1+1g1\begin{array}{l} S(x)=x^{6}+x^{5}+x^{3}+x^{2}+1\quad g_0 \\ S(x)=x^{6}+x^{3}+x^{2}+x^{1}+1\quad g_1 \end{array}

需要注意的是,這裏的視角是以輸入從左到右看的,所以133和171的二進制應該反過來看.可見,我們只要6個移位寄存器即可實現卷積編碼

至此,我們可以得到1/2卷積編碼器的原理圖:

image-20200526041314392

在此情況下,每輸入1比特就是輸出A和B兩個兩個比特,實現1/2碼率.

刪餘

爲了提高傳輸效率,在卷積編碼後一邊會進行刪餘(puncture),即週期性刪除一些相對不重要的數據比特.進行刪餘後的卷積編碼一般也稱作刪餘卷積碼.而在譯碼前會對刪掉的比特位置進行填充.

具體操作如下:

草稿-24

在ofdm系統中,針對不同的數據速率需要不同的編碼率,所以我們可以用1/2通過刪餘得到2/3和3/4等編碼率.

image-20200526045921985

所以在很容易可以得到多碼率卷積碼的硬件結構:

image-20200526050118912

熱心的網友的問題:

那這個時候,就會有熱心的網友想問:

  1. 爲什麼不針對2/3,3/4單獨開一套卷積編碼,非得用1/2去改?在接收端填充不會影響結果的嗎?
  2. 你上面寫的那個有限狀態機是什麼東西,有什麼用?

那這個時候就要引入解調部分的原理了.

Viterbi算法

其基本原理爲:將接收到的序列和所有可能的發送序列作比較,選擇其中漢明距離最小的序列當作是現在的發送序列.這是一種利用最大似然估計進行譯碼的算法.

由於這個算法原理講清楚很難,看圖看懂很簡單,硬件實現又很難,所以到後面實現這個模塊的時候會進一步細說,這裏僅引入幾篇圖解算法.

如何通俗地講解 viterbi 算法?-知乎

圖解Viterbi維特比算法-知乎

維特比算法-wiki

裏面有從最短路徑,動態規劃,概率估計等角度去解讀Viterbi算法的,大家都可以先去看看,而他們有一個共同的好處,就是圖多,也方便大家理解.

需要注意的是,這裏利用Viterbi算法進行卷積碼譯碼的前提和轉換思路是將編碼的實現即有限狀態的狀態機,看成是一個**隱性馬爾可夫模型(HMM)**這樣子才能實現利用最大似然等概率的方式來反推電路的設計.

看完了上面的幾個連接,就可以理解到狀態編碼將直接影響到整個算法的複雜度,所以在譯碼過程中先將數據進行增餘,再進行譯碼,即將刪餘後的2/3或3/4碼率通過增餘再變成1/2的話,Viterbi算法的實現複雜度將會大大降低.

交織/解交織

在信道編碼後的信息具有一定的檢糾錯能力,但是面對信道的突發錯誤使得誤碼區塊長度超過信道編碼的糾錯能力的上限時,信道編碼就顯得有點"失效"了.這個時候需要引入交織,將信道的突發錯誤平均到各個字段上,讓他變成隨機錯誤,再憑藉信道編碼,就可以大大提高其糾錯能力了.

原理及作用

在上一節的信道編碼中,我們知道信道編碼可以對一段字符中的某幾個字符進行檢錯和糾錯,但如果接收端是這樣的:

2

直接有一個字段就全錯了,這個時候信道編碼是救不回來的,接下來看看交織是怎麼做的(以分組交織爲例,簡單):3

通過將信息進行重新整合,若信道出現突發錯誤,這樣在解交織時就會平攤到各個字段上,這樣子就可以通過信道編碼進行糾錯了.

交織有兩種基本形式:分組交織和卷積交織.

還有利用兩個卷積編碼器進行級聯,實現一串由僞隨機性質的編碼,即並行級聯卷積碼,又稱爲Turbo碼.

其中,分組交織的原理在前面已經講了,假設輸入爲N,輸出爲M,則稱交織深度爲N*M.可見交織深度必將給系統帶來較大延時,故必然會受到約束.

然後就是卷積交織器,這是一個非常適用用於連續比特流通信系統的交織方式,其交織深度僅爲分組交織的一般.圖解如下:

image-20200528181452396

由於在OFDM中採用的是多載波調製,所以分組交織的延時也沒有這麼嚴重,而在802.11中採用的是分組交織,故不過多討論卷積交織和Turbo碼,有興趣的同學可以看一下參考文獻.

解交織

此時可以換一個角度考慮問題:將分組交織看成是一種矩陣的轉置

那麼顯然解交織也只需要對這個矩陣再進行一次轉置就可以了,所以跟加擾的解擾一樣,這裏只要同樣做一個轉置的交織過程就可以了.

熱心網友的問題

那麼這個時候就會有熱心的網友問:你說的這個加擾器,他不就是將基帶信號變成具有僞隨機信號性質的東西了嗎,這個時候還整交織幹嘛嘛?

那顯然這個網友是沒有好好看交織的原理的,他的目的是爲了讓信道中出現的突發錯誤轉換成隨機錯誤,讓大夥們來"平攤"這個誤碼,而加擾的話主要目的是爲了區別用戶(上行加擾)或者區分小區和信道(下行加擾)。

加擾是發送端用小區專用的加擾序列(僞隨機碼,根據小區ID生成)進行加擾,接收端在進行解擾,只有本小區內的UE才能根據小區的ID進行解擾,從而區分小區,這麼做的好處就是可以減少相鄰小區的干擾。 - J.mac 知乎

調製與解調

這部分爲通信原理究極基礎部分,不詳述.

需要注意的是,由於在OFDM中爲多載波調製,各子載波可以選擇不同的調製方式,而協議中對不同信息域的信息也會採用不同的調製方式,所以這個在後面具體實現時會再說.

同時,由於OFDM僅規定了子載波的頻率與帶寬,所以我們可以進行

  • 相位的調製如:BPSK,QPSK
  • 相位幅度聯合調製:16QAM,64QAM

那這個時候就會引入星座圖,然後根據星座圖畫接收域,就可以實現解調了.

而!,在前一節中介紹到OFDM系統具有峯均功率比(Peak-to-Average Power Ratio,OAPR)的問題,所以僅實現幅值上的調製是不是就有點虧啊.所以類似在第一節中的ASK-OFDM就不會太常見.

導頻插入與信道均衡

在802.11a或是其他協議中,在通信開始前都有訓練序列以進行信道均衡,但是在OFDM中對頻偏是很敏感的,因爲他會破壞載波間的正交性,所以我們需要浪費一些子載波插入導頻,降低隨時間增長的對頻率估計的偏差.

多普勒頻移

除了多徑等對頻率的影響,還有一個重要的比較重要的影響因素就是多普勒頻移.他指的就是發送機位置的移動將對接收機的頻率估計進行影響.圖解如下:

img

img

在維基上由對其他狀態的討論,可見於參考文獻.

熱心網友的證明

僅針對 接收機不動,發送機移動的情況:

已知:

​ 在一個波內,光源的速度變化乘以波的週期等於波長變化

Δvc=ΔλλΔvλc=Δλ\begin{array}{l} \frac{\Delta v}{c}=\frac{\Delta \lambda}{\lambda} \\ \Delta v \cdot \frac{\lambda}{c}=\Delta \lambda \\ \end{array}

可得:

Δvc=λλ0λ0\frac{\Delta v}{c}=\frac{\lambda-\lambda_{0}}{\lambda_{0}}

這裏要感謝@Vinena同學給出的證明和解釋.

高鐵上要怎麼辦呢?

剛聽完鄭同學的講解啊,我想的就是 高鐵要咋辦呢?這麼高速的情況下,應該頻偏會很嚴重吧.

然後去查了一下,現在主要的方式就是結合MIMO配合Moose,S&C,CP等算法進行進行頻率的補償,這裏不細說了,大家有興趣的話可以看一下參考文獻

高鐵場景下OFDM_MIMO系統多普勒頻偏估計算法研究

網友的疑問

那你這個 導頻插入和信道均衡 在哪啊?

實際上這個導頻插入大家可以短淺理解爲DDS,導頻產生就不說了:

基於FPGA的兩路信號發生器-CSDN

至於信道均衡的話,在這裏具體包括四個方面的內容:

  • 長訓練符號提取(LTS Picking)
  • 能量計算(Energy Compute)
  • 信道估算(Channel Estimating)
  • 信道補償(Channel Compensating)

跟Viterbi算法一樣,理論很多,實現很難,還是等到具體實現的時候再慢慢談吧

IQ調製

在完成數字調製,即星座圖映射之後,現在必然存在實數I和複數Q域,在最後發送前,我們需要將這兩路信號合併,他的實現思路其實很簡單,就是要維持他們的正交性:

img

然後具體不講多了,一是累了,二是我看見知乎有大佬寫得巨好,真的巨好:

數字調製系列:IQ基本理論

數字調製系列:IQ 調製及解調簡述

數字調製系列:IQ調製器特性

數字調製系列:IQ 調製器特性(續)

本人以爲這應該是全文寫得最好的IQ調製的理論介紹了,故不敢妄加挑戰.

802.11a下的標準

這裏主要就是 圖多.

主要參數設定

image-20200528224117083

在802.11a中,可以根據應用得情景不同選擇不同的調製方式實現不同的數據速率和不同的編碼效率,其中編碼效率的變換在上文的卷積碼中已經提到了.

可見一個OFDM符號中有52個子載波,但其中4個爲導頻信號,即只有48個子載波進行數據傳輸.而一個OFDM符號位4us,而保護間隔位0.8us.即用於數據傳輸的時間爲3.2us.機子載波間隔爲:

13.2μs=312.5kHz\frac{1}{3.2} \mu \mathrm{s}=312.5 \mathrm{kHz}

不同的調製方式對應的數據速率和編碼方式對應關係如下:

image-20200528225233083

物理層協議單元(PPDU)幀結構

在802.11a中,相關的幀結構如下:

image-20200528230510247

訓練序列

其中,PLCP(Physical Layer Convergence Procedure),可見PLCP Preamble爲前導碼,具體每位定義如下:

image-20200528231450865

在前導碼中分爲兩種訓練序列:

  • 短訓練符號(Short Training Symbol,STS)在t1-t10上週期重複.但不是所有子載波都需要這個,只要其中的{-24,-20,-16,-12,-8,-4,4,8,12,16,20,24}
  • 長訓練符號(Long Training Symbol,LTS)在T1-T2上週期重複,其中圖上G12爲兩週期保護間隔,T1和T2爲完整ofdm信號週期,應爲3.2us,即圖示有錯.

具體符號內容後續實現的時候再講,這裏我們可以得到在發送時的訓練序列爲:

image-20200528233102534

其中,按4個子載波隔開的是短訓練序列,各個子載波都需要的是長訓練序列,那4個長條的是導頻.

Signal域

接下來就到了Signal域,也就是PLCP Header部分.這一部分需要使用BPSK調製,而且碼率爲1/2,即此時數據數據爲6Mb/s,下面是signal域的結構

image-20200528233651240

其中,前四位爲速率位,決定後續數據域的傳輸方式,對應如下:

image-20200528233920711

第五位爲保留位,緊接這的是Length域,主要是MAC所需要發送的物理層服務數據單元(PSDU)的個數.第17位爲0-16位的偶校驗位.

18-23位全部置0,作用有2:

  • 初始化卷積編碼器
  • 終止Viterbi譯碼器的碼網絡(讓其走回開始狀態)

需要注意: SIGNAL字段的內容不加擾。

Data域

接着就到了數據域,其中包括服務域,PSDU,尾比特域和填充比特:

image-20200528235117867

其中,Service的前7個比特設爲了0,這裏主要是爲了初始化接收機的解擾碼器.其餘的字段主要用於計算data域長度和維持時間,pad段爲了填充數據幀爲ofdm數據符號數整數倍.

其他細節可參看參考文獻,這裏主要介紹重要的協議標準,其他細化的會在實現中說明.

與MAC交互過程

最後可以看看物理層與MAC層的交互,以發送過程爲例:

image-20200528230410631

結語

我看了一下這字數,算上上一篇,這又是一篇畢業論文的字數要求了…

講真,這篇博客真的是這麼久以來寫得我最辛苦的一篇了,很多東西:

  • 看書-> 以爲自己懂了 -> 一寫 -> 哎有點奇怪 -> 查一下資料
  • 哇,好難 -> 臥槽,知乎/CSDN/某課程ppt 講得真好
  • 以爲自己又懂了 -> 回到第一步

然後這兩天要畢業答辯了,就 暫時性不更了.

然後有朋友反映找不到打賞通道,所以這次首發安排上了:

打賞通道

打賞通道

打賞通道

打賞通道

打賞通道

打賞通道

打賞通道

打賞通道

參考文獻

《XILINX FPGA的OFDM通信系統基帶設計》

關於擾碼器(scrambler)的一些想法

卷積碼-wiki

卷積碼(Convolutional Code)-知乎

通信原理- 樊昌信, 曹麗娜

如何通俗地講解 viterbi 算法?

圖解Viterbi維特比算法

FPGA的OFDM系統交織器設計

中科大周武暘教授的現代通信原理和編碼原理

交織和加擾的區別-知乎

Doppler_effect

高鐵場景下OFDM_MIMO系統多普勒頻偏估計算法研究

基於FPGA的兩路信號發生器-CSDN

數字調製系列:IQ基本理論

數字調製系列:IQ 調製及解調簡述

數字調製系列:IQ調製器特性

數字調製系列:IQ 調製器特性(續)

WLAN - Frame Structure

無線網標準IEEE802.11

802.11a White Paper

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章