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)]);

 

  • 1
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值