LTE學習筆記:OFDM

 

OFDM

1 OFDM介紹

OFDM代表正交頻分複用(Orthogonal Frequency Divisition Multiplexing)。

 

OFDM將一個寬頻帶分成許多小頻率(我們稱之爲子載波),並將數據承載到每個子載波上,如下圖所示。換句話說,就是把一個寬頻帶分成多個窄的頻率,這就是“頻分”的意思,由於每個子載波上的所有數據都是同時傳輸的,可以說這是一種“多路複用”。

現在就有一個問題,每個子載波需要分多少?例如,一個1兆赫的全頻段帶寬,應該分成多少子載波?如果把它分成1000個子載波,間隔1千赫,每個子載波上帶一個比特,就可以同時發送1000比特。如果分成100個子載波,間隔10千赫,每個子載波上帶一個比特,可以一次傳輸100比特。 

子載波之間間隔太小是不可能分割的,如果把它分成太多的子載波,子載波之間的間隔太小,那麼相鄰子載波之間就有很大的干擾可能性。但是,如果將每個子載波分的太寬,子載波數目較少,那麼子載波之間的干擾就會小得多,但在這種情況下,數據速率會降低。

作爲一種最優解,OFDM以如下所示的方式將頻帶分割成多個子載波。在下圖中,在頻域中的每個採樣點上,只有一個載波具有非零值,而所有其他子載波在採樣點上都具有零值。這意味着即使多個子載波共存,它們都是獨立的,不影響其他子載波,這種特性稱爲“正交”。(如果任意兩個函數或向量是正交的,這意味着它們是先行獨立。簡單地說,“正交”是指“獨立”,“獨立”是指“無相互作用/干擾”,因此“正交”是指“無干擾”)。

OFDM是一種很好的合理利用給定頻率的方法,但它存在着缺點。爲了使這種方法有效地工作,子載波之間的空間應精確地保持在滿足正交性條件的指定位置。

如果子載波之間的空間沒有準確地保持,並且它們四處漂移,那該怎麼辦?下面是這個例子,當單獨繪製每個子載波時(上圖),不會看到太多差異,但是當所有這些子載波如下圖所示彙總在一起時,會注意到差異明顯。 

實際上,在現實中,沒有這樣一個沒有頻率漂移的環境。因此,在設計OFDM時,首先必須確定系統能夠承受子載波頻率漂移引起的信號失真的頻率空間。(導致子載波頻率漂移的最常見來源是“衰落”和“多普勒效應”)。

 2 循環前綴

現在看看時域中的信號,以下是按順序顯示兩個OFDM符號的示意圖。

在理想情況下,這個信號沒有問題,但是如果第一個符號被延遲一點會發生什麼。在這種情況下,第一個符號的結束部分將溢出到下一個符號時間,並干擾下一個符號,如下所示。這種不同符號之間的干擾稱爲“符號間干擾(ISI,Inter Symbol Interference )”。 

解決這個問題的方法是什麼?防止信號延遲是不可能的,因爲無法控制無線信道(物理媒介本身)。所以唯一的方法就是設計機制來處理這種情況。一個簡單的解決方案是在符號之間放置一些時間間隔,這樣即使一個符號被延遲,它也不會溢出到下一個符號中。 

有了這個間隙,系統在一定程度上可以容忍延遲和碼間干擾問題,但存在着一個實際問題就是“如何填補這個空白?”.什麼都不放(比如關閉傳輸)好嗎?如果在間隙期間完全關閉信號,將導致放大器出現問題。爲了減少這個問題,從末尾複製一部分信號並粘貼到這個間隙中,這個複製的部分在開頭預先加上稱爲“循環前綴”。 

如前文所述,循環前綴的主要目的是減少符號間干擾,但是還是可以通過複製原始符號的結束部分來從生成循環前綴中獲得額外的幫助,它有助於找到符號邊界(符號的起點和終點)。如圖,取一個具有循環前綴長度的樣本序列(窗口),從第一個序列中取出另一個長度相同的序列(符號長度-cp長度),然後計算兩個序列的相關性,如果兩個序列與符號的開始和結束完全對齊,則相關性將非常高,因爲兩個序列中的內容幾乎相同。 

如果兩個序列(兩個窗口)不與符號邊界(符號的開始和結束)對齊,則相關性不會很高,如下所示。

 持續這兩個窗口,並找到產生最大相關的位置,就是時隙邊界。

3 例子

在OFDM實施中,中心頻率不攜帶任何子載波,並且在頻譜的兩端都有一定數量的子載波,而這些子載波沒有任何數據,這一區域被稱爲保護帶,主要是爲了減少對相鄰帶的干擾。

現在,讓我們按照這些步驟來實現要發送數據的OFDM信號。爲了簡單起見,我們使用的調製是bpsk,它每個星座點攜帶一個比特。根據給定的規範,在分配給頻帶的64個子載波中,只有52個子載波是可以承載數據位的子載波,如下所示。 

對於這個步驟,首先我們必須生成一個由一個OFDM符號攜帶位序列。可以按照以下方式生成隨機位序列(在實際通信中,沒有人會使用隨機數據進行傳輸。如果是實際通信,這些數據將是文檔文件、音樂或電影等,但在模擬的情況下,通常使用隨機數據)。 

下一步是將用戶數據映射到分配給數據傳輸的每個子載波,這可以實現如下:

 根據上述步驟,我們在頻域中將比特流分配給子載波,但是所有的通信(數據傳輸和接收)都是在時域中進行的,所以必須將頻域數據轉換成一個時間域序列,如下所示(IFFT(逆快速傅立葉變換)是將頻域數據轉換爲時域數據的工具)。 

下一步是將循環前綴添加到在前一步中得到的時間域數據中。循環前綴的生成非常簡單,它是從數據的末尾直接複製部分數據,並將副本放在數據序列的開頭。 

下面是實現上述所有步驟的Matlab代碼:

TotalNumberOfSubCarrier = 64;

% for each symbol bits a1 to a52 are assigned to subcarrier

% index [-26 to -1 1 to 26]

subcarrierIndex_Data = [-26:-1 1:26];

BitsPerSymbol = 52;

 

close all;

figure;

 

% BPSK modulation

ModSequence = 2*randi([0 1],1,BitsPerSymbol)-1;

subplot(6,1,1); stem(abs(ModSequence));xlim([1 length(ModSequence)]);

 

TimeDomainSequence = []; % empty vector

 

ModSequenceForSubCarriers = zeros(1,TotalNumberOfSubCarrier);

 

% assigning bits a1 to a52 to subcarriers [-26 to -1, 1 to 26]

ModSequenceForSubCarriers(subcarrierIndex_Data+TotalNumberOfSubCarrier/2+1) = ModSequence(1,:);

subplot(6,1,2); stem(abs(ModSequenceForSubCarriers));xlim([1 length(ModSequenceForSubCarriers)]);

 

%  shift subcarriers at indices [-26 to -1] to fft input indices [38 to 63]

ModSequenceForSubCarriers = fftshift(ModSequenceForSubCarriers);

subplot(6,1,3); stem(abs(ModSequenceForSubCarriers));xlim([1 length(ModSequenceForSubCarriers)]);

 

ModSequenceInTimeDomain = ifft(ModSequenceForSubCarriers,TotalNumberOfSubCarrier);

subplot(6,1,4); stem(abs(ModSequenceInTimeDomain));xlim([1 length(ModSequenceInTimeDomain)]);

 

% adding cyclic prefix of 16 samples

ModSequenceInTimeDomain_with_CP = [ModSequenceInTimeDomain(49:64) ModSequenceInTimeDomain];

subplot(6,1,5); stem(abs(ModSequenceInTimeDomain_with_CP));

                     xlim([1 length(ModSequenceInTimeDomain_with_CP)]);

 

TimeDomainSequence = [TimeDomainSequence ModSequenceInTimeDomain_with_CP];

subplot(6,1,6); stem(abs(TimeDomainSequence));xlim([1 length(TimeDomainSequence)]);

 

 

figure;

SamplingRate = 20;

[PowerSpectrum,W] = pwelch(TimeDomainSequence,[],[],4096,20);    

subplot(1,3,1);plot([-2048:2047]*SamplingRate/4096,10*log10(fftshift(PowerSpectrum)));

                    xlabel('frequency, MHz')

                    ylabel('power spectral density')

subplot(1,3,2);plot(10*log10(fftshift(abs(fft(ModSequenceInTimeDomain)))));

                    xlim([1 length(ModSequenceInTimeDomain)]);

subplot(1,3,3);plot(10*log10(fftshift(abs(fft(TimeDomainSequence)))));

                    xlim([1 length(TimeDomainSequence)]);

 

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