TraditionaI Comm笔记【2】:正交频分多路复用技术/OFDM
1. Overview
'OFDM stands for Orthogonal Frequency Divisition Multiplexing.'
"OFDM"
指的是正交频分多路复用技术。简单来说,"OFDM"
是将一个宽频带分成许多小频率(称之为"子载波/subcarriers"
),并将数据传送到每个子载波上的技术,如下图所示("OFDM"
是一种多载波调制技术,主要是将指定信道分成若干子信道,在每个子信道上使用一个子载波进行调制,并且各子载波是并行传输,可以有效提高信道的频谱利用率):
![](https://i-blog.csdnimg.cn/blog_migrate/44535abce1dddf8e38feeca0fd043cba.png)
(1). Frequency Division and Multiplexing
也就是说,我们把一个宽频带分成多个小/窄频率。这就是“频率分割/频分/Frequency Division”
的意思。由于每个子载波上的所有数据都是同时传输的,我们可以说这是一种“多路传输/多路复用/Multiplexing”
。
(2). 子载波间隔
对于每个子载波(子载波,分频),应该小到什么程度呢?假设有 1 1 1 M h z Mhz Mhz带宽作为一个全频带,若把它分成 1000 1000 1000个子载波,则间隔 1 1 1 K h z Khz Khz,如果在每个子载波上携带 1 1 1 b i t bit bit,就可以同时传输 1000 1000 1000 b i t s bits bits;若把它分成 100 100 100个子载波,则间隔 10 10 10 K h z Khz Khz,如果在每个子载波上携带 1 1 1 b i t bit bit,就可以同时传输 100 100 100 b i t s bits bits。
如果可能的话,我们希望间隔越小越好,这样我们就可以得到更多的子载波,从而可以同时传输更多的数据,也就是说数据速率达到较高的值。但问题在于,子载波之间的间隔不可能足够小。这是因为当子载波之间的间隔太小时,相邻子载波之间的干扰可能性就会很大。同时,子载波之间的间隔也不能太大,虽然子载波间隔增大有助于降低子载波之间的干扰,但是数据速率会降低。
(3). Orthogonal
如下图所示,"OFDM"
将频带分成多个子载波。在频域的每个采样点上,只有一个载波具有非零值,其它所有子载波在该采样点上均为零。这意味着,即使多个子载波共存,它们都是相互独立的,互不影响,这种特性称为“正交/Orthogonal”
。
![](https://i-blog.csdnimg.cn/blog_migrate/4a801ddaac042b8925df9a14fcda13c8.png)
(4). 缺点
"OFDM"
是一种很好地合理利用给定频率的方法,但也存在缺点。为了使该方法有效地工作,子载波之间的间隔必须精确地保持在满足正交条件的指定位置。
如果子载波之间的间隔没有保持准确,那么它们会四处漂移,如下图所示。当每一个子载波分别绘制(上图)时,不会看到很大的差异,但当所有这些子载波加在一起时,产生的波形与真实波形之间的确存在巨大的差异,即"Ideal value does not exactly match to the real value"
:
![](https://i-blog.csdnimg.cn/blog_migrate/ad923ee3cbabd3ed0c30c013793f2441.png)
但是,实际中不存在没有频率漂移的环境。所以在设计"OFDM"
系统时,首先要确定系统能承受子载波频率漂移引起的信号失真的频率空间。(引起子载波频率漂移最常见的来源是“衰落/Fading(电磁波在传播过程中,由于传播媒介及传播途径随时间的变化而引起的接收信号强弱变化的现象叫作衰落。)”
和"多普勒效应/Doppler effect(物体辐射的波长因为波源和观测者的相对运动而产生变化。在运动的波源前面,波被压缩,波长变得较短,频率变得较高【蓝移blue shift】;在运动的波源后面时,会产生相反的效应,波长变得较长,频率变得较低【红移red shift】。波源的速度越高,所产生的效应越大。根据波红/蓝移的程度,可以计算出波源循着观测方向运动的速度。)"
。
2. Cyclic Prefix/循环前缀
下图所示是理想情况下两个"OFDM符号序列(two symbols in sequence)"
的图示:
![](https://i-blog.csdnimg.cn/blog_migrate/ac1435d5ace38fddc43cb5d86e2c3311.png)
(1). 码间串扰/ISI
当第一个"符号/symbol"
被延迟了一段时间,则第一个符号的结束部分将溢出到下一个符号所在的时间,并干扰下一个符号,如下图所示。这种不同符号之间的干扰称为“符号间/码间串扰(Intersymbol interference, ISI)”
。
![](https://i-blog.csdnimg.cn/blog_migrate/aba1bdca0968d3f119adc8af11b25372.png)
(2). 解决ISI—Gap and Cyclic prefix
那么怎样解决ISI/码间串扰呢?
- 阻止信号被延迟。但这是不可能的,因为我们无法控制无线电频道本身/物理介质本身。
- 所以唯一的办法就是设计系统来处理这种情况。一个简单的解决方案是在符号之间留出一些时间间隔,这样一个符号即使被延迟也不会溢出到下一个符号,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/b82701bfa2c9cbc1ea00de268e1650f8.png)
有了"interSymbol Gap"
,系统可以在一定程度上容忍延迟和码间串扰问题。但是现在面临的问题是“在这个Gap中加入什么? or 什么都不放(比如屏蔽/关闭传输)?
如果在
G
a
p
Gap
Gap 阶段完全关闭传输,这将导致放大器问题。为了解决该问题,我们从末端复制一部分信号并将其粘贴到这个
G
a
p
Gap
Gap 中。这个复制的在开头的前缀被称为“Cyclic prefix/循环前缀”
。
![](https://i-blog.csdnimg.cn/blog_migrate/643d45e1c0de168122e2552afac39d1f.png)
"Main purpose of cyclic prefix is to reduce ISI, but we can enjoy an extra advatage from generating the cyclic prefix by copying the ending part of the original symbol. It helps find the symbol boundary (the start and end of a symbol). It goes like this. Take a sequence of samples (window) with the length of cyclic prefix. Take out another sequence with the same length which is (symbol length - CP length) apart from the first sequence. And then calculate the correlation of the two sequence. If the two sequence is exactly aligned with the start and end of the symbol, the correlation would be very high because the contents within the two sequence would be almost the same."
“循环前缀/Cyclic prefix”
的主要目的是减少"ISI"
。通过复制"原始符号/original symbol"
的结束部分来生成循环前缀的方法有助于找到符号/symbol的边界(符号的开始和结束)。取出与循环前缀长度(称为"symbol length/符号长度—CP length"
)相同的样本序列,称之为"窗口/window"
,再取出第一个序列之外的另一个"长度为CP length的序列"
。然后计算两个序列的相关性,若两个序列与符号的开始和结束完全对齐,相关性将非常高,因为两个序列中的内容将几乎相同。
![](https://i-blog.csdnimg.cn/blog_migrate/24c4179f54c629ac9265d11169b980b3.png)
若两个序列(两个窗口)与符号边界不对齐,则相关性不会很高:
![](https://i-blog.csdnimg.cn/blog_migrate/560e16373ea4c2df825c3a35a7f0f1b7.png)
若上下滑动这两个窗口,找到相关性最高的位置,那就是槽边界。
3. Example
***note:该例子的总体思想基于 I E E E IEEE IEEE 802.11 802.11 802.11( W L A N WLAN WLAN规范)。
"In OFDM implemetation, the frequence at exact center does not carry any subcarrier and there are a certain number of sub carriers at both ends of the spectrum which does not have any frequency band. This regions are called as Guard band and this is mainly to reduce the interference with neighbouring band."
在"OFDM"
实现过程中,精确中心处的频率不携带任何子载波,并且在频谱的两端有一定数量的频带不具有任何子载波。 该区域称为"保护频带/Guard band(频带与频带之间的间隔,不具有传输功能)"
,主要是为了减少对相邻频带之间的干扰。
![](https://i-blog.csdnimg.cn/blog_migrate/b69647ce88f8f00f1efb4dd274dfaff2.png)
接下来按照步骤实现"OFDM"
。假设使用的是"BPSK"
调制,每个星座点携带一个比特。根据给定的规范,在为该频带分配的
64
64
64个子载波中,只有
52
52
52个子载波是能够携带如下所示数据位的子载波。
![](https://i-blog.csdnimg.cn/blog_migrate/104db7f68fde1921938e4df885b5c1e6.png)
***note:上图的右侧的 − 23 -23 −23, − 24 -24 −24, − 25 -25 −25, − 26 -26 −26 . . . ... ...应该是正数: 23 23 23, 24 24 24, 25 25 25, 26... 26... 26...
对于这一步,首先我们必须生成一个"位序列(bit sequence)"
,它将被一个"OFDM"
符号携带。可以按照下面的方法生成一个随机的位序列(在实际通信中,没有人会使用随机数据进行传输。在真实的通信中,这些数据将是一个文件、音乐或电影等,但在模拟情况下,我们通常使用随机数据)。
![](https://i-blog.csdnimg.cn/blog_migrate/218320c513b86ebc0811c643ae30ea48.png)
下一步是将用户数据映射到分配用于携带数据的每个子载波上。可以在"MATLAB"
中使用
f
o
r
for
for循环来实现:
![](https://i-blog.csdnimg.cn/blog_migrate/f100a701d84d61983bd998c816f4c939.png)
利用上述方法,我们在频域将比特流分配给子载波。但所有的通信(数据传输和接收)都是在时域进行的。因此,我们必须将频域数据转换为时域序列"(IFFT【快速反傅里叶变换】是将频域数据转换为时域数据的工具)"
,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/f20533679e3573508d28692bd382d56d.png)
下一步是将循环前缀添加到上一步得到的时域数据中。循环前缀生成非常简单,它直接从末尾复制部分数据,并将其放在数据序列的开头:
![](https://i-blog.csdnimg.cn/blog_migrate/827f28863bf2fe97b34ab1d1aea04959.png)
下面是实现上述所有步骤的 M a t l a b Matlab 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)]);
![](https://i-blog.csdnimg.cn/blog_migrate/47c4ce7cde131fbe17c7e46b4d849f57.png)
![](https://i-blog.csdnimg.cn/blog_migrate/410d1c7d23eab62cf815a6b19e081990.png)
4. Reference
[1] sharetechnote.com.
[2] 百度百科.