夏班長聊聊OFDM通信系統仿真

一, 廢話..

? 起因是這樣的。最近剛寫完專利,腦殼巨大無比,所以想寫點文章陶冶下情操。但是我這個大老粗爺們也寫不來言情小說,搞得我很是痛苦。我唯一會的也就只有 matlab了,, 所以寫一篇文章自我陶醉一下,哈哈哈。。

? 最近也是天氣晴朗,霧霾飄香。最痛苦的是下周OFDM的通信系統測試。想必同學們也是腦殼比我還大,也有很多同學問我這個 OFDM咋個做哦。我也簡單的說下在高斯信道下的 OFDM系統,其實也講了講瑞利,萊斯信道下的 OFDM。 但是不要求嘛 ,確實那個有點難。


二. OFDM與傅里葉曖昧關系

? 一.?物理層的小知識

他們我們通信就是裝點寬帶啊,電線啊,但是不然。我們要自奮強大,還是要懂點小常識

信源編碼:著重對信號容量壓縮,提高傳輸效率

信道編碼:針對多變的信道插入冗余信息,增加傳輸穩定性(設計的OFDM插入的CP(循環前綴),引頻信號就是冗余信息)。

信號調制:將比特流轉換成穩定的波形進行傳輸

? 二.信號的正交性

比如: sint ?和 ?sin2t ?為一對正交信號,因為 sint*sin2t 在區間[0,2 pi]上的積分為0.

?sint和 sin2t是用來承載信號的,我們稱為子載波

加入 sint 信號傳送信號a ,采用AM調制,它變為 asint

加入 sin2t信號傳送信號b,采用AM調制,它變為 bsin2t

那么我們的和信號就變成 xn = asint+ bsin2t

接收a信號時候:將xn * sint 再通過[0,2pi]積分,sin2t的分量信號就變為了0,只剩下帶有a的信號

接收b信號時候:將xn * sin2t 再通過[0,2pi]積分,sint的分量信號就變為了0,只剩下帶有b的信號

%還不曉得的話,動一動筆寫一下就明白了。?

擴展一下

我們將sint離散化 ?就變成了 sin(2*pi*Δf*K*T) ?其中K = 1,2,3.....?

Δf為子載波間間隔.?

我們的f(t) 則可以變成

f(t) = a1·sin(2π·Δf·t) +

a2·sin(2π·Δf·2t) +

a3·sin(2π·Δf·3t) .....

再擴展一下

因為sint 和 cost 是正交的。 對吧

f(t) =?b1·cos(2π·Δf·t) +

b2·cos(2π·Δf·2t) +

b3·cos(2π·Δf·3t) .....

那么f(t)就可以找到合適的系數ak,和bk,將


f(t) = a1·sin(2π·Δf·t) +

a2·sin(2π·Δf·2t) +

a3·sin(2π·Δf·3t) +

...

ak·sin(2π·Δf·kt) +

b1·cos(2π·Δf·t) +

b2·cos(2π·Δf·2t) +

b3·cos(2π·Δf·3t) +

...

bk·cos(2π·Δf·kt)?

綜上f(t)=∑ak·sin(2π·Δf·kt) + ∑bk·cos(2π·Δf·kt)

對f(t)進行復數化 :f(t) =∑Fk·e(j·2π·Δf·kt) ?

這個啥子!!!!這是這就是傅里葉級數,是不是很magical.

簡單的小實驗

設計一段曉得bit流,使其分別進行ifft后 與?f(t) =∑Fk·e(j·2π·Δf·kt)公式 兩種方法進行對比

現在假定待發送序列00011011,OFDM符號時長為1s,調制方式為QPSK


輸入信號 IQ信號 輸出信號相位

%00? ? ? ? ? 1/2,1/2? ? ? ? pi/4

%01? ? ? ? ? -1/2,1/2? ? ? ? 3pi/4

%10? ? ? ? ? -1/2,-1/2? ? ? 5pi/4

%11? ? ? ? ? 1/2,-1/2? ? ? ? 7pi/4

根據QPSK的映射關系,求出輸入函數:

d1 = 1/2+1i*1/2;

d2 = -1/2+1i*1/2;

d3 = 1/2+1i*(-1/2);

d4 = -1/2 + 1i*(-1/2);

對輸入序列進行IFFT

xk = [0,d1,d2,d3,d4,0,0,0]; %輸入序列xk

sn = ifft(xk); ? %IFFT后輸出的sn序列

?即可得到輸入序列后的IFFT曲線



%////////////////////////////////////////////////////////////////////////////////////////////////////

采用公式法:f(t) =∑Fk·e(j·2π·Δf·kt)

我們QPSK調制,則一個OFDM符號里有2個bit

(一個OFDM符號與調制方式對應的bit數目:(QPSK:2),(16QAM:4),(64QAM:6) ? )

根據公式求出子載波

%子載波

e1 = exp(1i*2*pi*f*t);

e2 = exp(1i*2*pi*f*t*2);

e3 = exp(1i*2*pi*f*t*3);

e4 = exp(1i*2*pi*f*t*4);

OFDM基帶復信號表達式

st = d1*e1 + d2*e2 + d3*e3 + d4*e4; ? %將上述公式展開

畫出st的圖像


我們將上述的st與sn圖像進行對比


(上圖形為實部,下圖形為虛部)

可以驚訝的發現:IFFT后的圖形就是公式圖形的離散值!所以OFDM系統和傅里葉級數有種親密而不可分離的感情,如同牛郎和織女,楊貴妃和唐玄宗,葫蘆娃和爺爺。。。。。 好像有點奇怪

? 所以IFFT模塊的功能相當于說:別麻煩發送N個子載波信號了,我直接算出你們在空中會疊加成啥樣子吧FFT模塊的功能相當于說:別用老式的積分方法來去除其余的正交子載波了,我幫你一次把N個攜帶信號全算出來吧


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(圖片來自小白)

三.OFDM系統設計

終于要進行設計了,前面一大堆,我打字都打累了。原來寫文章那么辛苦,我覺得司馬遷好牛比。。

我們先從最簡單的高斯信道說起走嘛。

前面說了傅里葉變化在OFDM系統中的舉足輕重的作用,所以我們OFDM系統的仿真才使用IFFT和FFT算法

高斯信道

高斯信號就是在信號通過此信道中加入高斯白噪聲。

在maltab通信系統仿真中我們用awgn(TrData1,SNR,'measured'); 函數來給信號TrData1添加高斯白噪聲

瑞利信道


信號通過無線信道之后,其信號幅度是隨機的,即“衰落”,并且其包絡服從瑞利分布.

接受信號具有四種效應:1.陰影 2.遠近 3.多徑 4.多普勒頻移

萊斯信道

簡單的說萊斯信道比瑞利信道多了一條直流分量。

CP

就是我們所謂的循環前綴,為什么要加入CP循環前綴這個冗余信息呢。為了抵抗由于多徑效應帶來的ICI(載波間干擾),設計的時候也要注意下:一個CP占用了每個OFDM符號約的1/15的資源

引頻信號的意義

插入引頻信號通過訓練序列的信息,實時估計信道,從而再做信號的矯正,從而再解調的時候減少誤碼率之類。

高斯信道下的OFDM通信系統matlab仿真

發送端:

第一步:產生隨機數列 ??Signal=rand(1,para*Ns*2)>0.5

其中我們所設置的 para為并行傳輸的子載波個數

Ns為一個禎結構中OFDM信號的個數

第二步:進行串并轉化

串并轉化為十分重要的函數reshape函數

其用法為:SigPara = reshape(Signal,para,Ns*2); 將原始信號Signal 信號轉化為para 行 Ns*2列的信號

reshape(a,m,n);先把矩陣a按列拆分,然后拼接成一個大小為m*n的向量。


第三步:進行QPSK調制

(1)將數據分為兩個通道 即i通道和q通道

函數如下:

for j=1:Ns

ich(:,j)=SigPara(:,2*j-1);

qch(:,j)=SigPara(:,2*j);

end

(2)根據QPSK映射關系,求出輸入后的數據

kmod=1./sqrt(2);

ich1=ich.*kmod;

qch1=qch.*kmod;? %QPSK映射關系

第四步:插入保護間隔

ich3=[ich2(fl-gl+1:fl,:);ich2];

qch3=[qch2(fl-gl+1:fl,:);qch2];



加入前每列128個點


加入后 每列 160個點

我們選取gl = 32:將信號的最后32組數據進行復制,加入到原始信號中 -- 加強容錯性

第五步:并串變換

ich4=reshape(ich3,1,(fl+gl)*Ns);

qch4=reshape(qch3,1,(fl+gl)*Ns);

形成復發射數據:TrData1=ich4+qch4.*sqrt(-1);

第六步:發射數據加入高斯白噪聲

ReData=awgn(TrData1,SNR,'measured');

%///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

接受端:

第一步:移去保護間隔

(1)進行數據的復式化

idata=real(ReData); %加入噪聲后的實部

qdata=imag(ReData);? ? %加入噪聲后的虛部


(2)對數據進行串并轉化

idata1 = reshape(idata,fl+gl,Ns);

qdata1 = reshape(qdata,fl+gl,Ns);

(3)移去保護間隔

idata2=idata1(gl+1:gl+fl,:);

qdata2=qdata1(gl+1:gl+fl,:);

取idata1的每一列的gl+1 到gl+fl的數據形成iadta2


第二步:FFT


第三步:QPSK解調:

(1)將fft轉化后的數據/komd?

? (2)并串轉化

? ?(3)重組信號

第四步:抽樣判決

ReSig = Res > 0.5; 將上述重組后的信號進行分析,大于0.5的信號賦值為1,小于0.5的賦值為0

第五步:計算錯誤的概率

err = 0;

for i = 1:para*Ns*2;

if (Signal(i)~=ReSig(i))

err = err + 1;? ? ? ? ? ? %得到誤碼的個數

end

end

Pe = err / (para*Ns*2);

取多組SNR值,加入高斯信道我們可以得到snr-Pe曲線


信噪比曲線

%///////////////////////////////////////////////////////////////////////////////////////

引深:如果信道為瑞利信道在有多徑效應和多普勒頻移的情況下

信道的信能將會受到嚴重的影響

圖為加入瑞利信道后的OFDM(沒有做信道估計)


可見當加入了多徑和多普勒頻移后的信道 誤碼率從3%上升到了30%左右,瑞利信道完全破壞了信號的傳輸

引頻信號的引入

我們在加入列引頻和行引頻

A=[A;r]插行 ? ? ? ? ? A=[A c]插列

列間加入引頻:

ich2= [zeros(fl,1) ich21(:,[1:Ns/2]) zeros(fl,1) ich21(:,[Ns/2+1:Ns]) zeros(fl,1)] ;

行間加入引頻:

ich2 = [zeros(1,(Ns+3)) ; ich2(1:fl/2,:) ; zeros(1,(Ns+3)) ; ich2((fl/2)+1:fl,:) ; zeros(1,(Ns+3))]; ?

加入的結果:


加入行列引頻信號


加入引頻信號后可以通過LS算法來 做信道估計

LS算法基本原理:Y = HX + N ?其中N為噪聲信號,H為信道的頻率響應,Y,X為輸出,輸入信號的響應

在理想信道下: H' = Y/X 輸入除以輸出(其中Y為通過瑞利信道后的信號) ,可以得到頻率響應H的估計H'

我們用所得到的H'再反過來推算出X的估計:X' = Y/H' ?得到新的輸入。對X’再進行去引頻的后續處理

for j = 1:(Ns+3)

for i = 1:(para+3)

Hls(i,j) = idata21(i,j)./ich2(i,j);

ixg(i,j) = idata21(i,j) ./ Hls(i,j);

hls(i,j) = qdata21(i,j)./qch2(i,j);

qxg(i,j) = qdata21(i,j)./ hls(i,j);

end

end

加入信道估計后誤碼率的圖示:


結論

OFDM系統中 :OFDM系統在只有高斯白噪聲的情況下影響較小,OFDM設計在高斯信道下的優勢很小

但是在瑞利信道中,OFDM引頻信號,CP,信道估計對傳輸的信號起到了保護的作用。使其在收到多徑,多普勒頻移的條件下,能夠有效的恢復出原信號。

在沒有信道估計得OFDM--瑞利系統,多徑,遠近,陰影,多普勒頻偏對信號造成了嚴重的干擾。使其不能夠正常傳輸,有著嚴重的誤碼率。


。。。。。。。打字都打累了,可能里面會有些錯誤,請各位指正。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 深入理解傅里葉變換Mar 12, 2017 這原本是我在知乎上對傅立葉變換、拉普拉斯變換、Z變換的聯系?為什么要進...
    價值趨勢技術派閱讀 5,824評論 2 2
  • 往事如煙也如屁,吹吹就沒了。如果懶得連吹的力氣都不想用,也不打緊,一會兒它也能自己散了。 這幾日一直...
    裂墻閱讀 609評論 0 1
  • 畫畫讓我更快樂!
    二_豐閱讀 142評論 2 1
  • 《問道》經典手游再會30年 ———————————————————————————————————————— 高清...
    七景鳴閱讀 217評論 0 0