【现代数字传输】OFDM的原理讲解和MATLAB实现
简介
现代数字传输技术有许多种,例如MSK , GMSK , OFDM, 扩频技术,但是其中OFDM成功地应用于各种重要的通信系统,例如,DAB与DVB,3G/4G与LTE无线通信系统等。所以本篇文章将着重讲解OFDM流程和原理,以及对多径衰落信道下OFDM的MATLAB实现。
目录
二、ODFM思想(Orthogonal Frequency Division Multiplexing)
2.2.4 接收端进行Demultiplexing(信号分解)
一、前置知识
OFDM是一个相比起基本数字调制来讲更为复杂的数字调制技术,我们学习它之前需要足够的前置知识。
1.1 正弦函数的正交性
这是OFDM技术能实现的非常关键的一个理论,推导如下:
通过举例可以看到,正弦函数具有正交性,这样的好处将在接收端进行体现,因为你可以用积分手段去 过滤掉与某一频率的载波正交的其他载波(因为积分为0)。
1.2 DFT和IDFT
这里直接给出公式:
记住DFT和IDFT的公式模样,这会是解答为什么OFDM采用IFFT调制信号的关键!
1.3 信号的频域形状
最开始的时候,我对于OFDM的频谱长成这样是非常疑惑的:
为啥明明交叠了也是正交的呢?为什么是这么多拱门状的频域响应呢?我们不慌忙推导正交性,首先关注为什么信号的频率响应是拱门状。
其实是这样的,我们无论进行什么数字调制手段,我们调制后的符号都是 0 到 ts 的码元对吧。我们打个比方,BPSK调制,那么有下面的推导证明:
从上推导我们得到以下很重要的性质:
1. 有限制码元周期为 Ts 且频率分量为
的调制符号,其频谱就是 拱门状的频率响应进行
的平移。
2. 其主瓣的宽度就是
, 集中在
二、ODFM思想(Orthogonal Frequency Division Multiplexing)
这里将较为细致的讲解ODFM调制的原理,但是更多的细节会在做MATLAB的时候展现出来。
2.1 利用正交的复载波传输信息(正交用在哪?)
我们在前置知识中介绍了,复载波在满足一定频率间隔情况下是正交的,这种正交性带来了解调的方便。试想,我在比如说 的复载波上传输信号
, 在频率为
的复载波上传输信号
。在发送端中,我将两个调制后的复载波相加,一起发送,那么我在接收端,是不是只要分别乘以
的复载波和
的复载波再积分即可只保留相对应的信号了? 下面这幅图会很清晰的表现出来:
那么试想,我用很多个这样的正交复载波去分别传送信息,在接收端都能通过这种手段解调,那不就很方便吗!(后面也将说明其很大程度地节约了频谱资源)
2.2 OFDM的原理图
先上图,然后一步一步解释在干啥
2.2.1 串并变换
在串并变换的过程中,系统将N个串行的符号
变成并行的。其中有一点很重要!就是本来
的码元周期只有 ts ,但是经过串并变换后 它们都被延长到了
,N 表示N个子载波。
这里的 是已经经过基本数字基带调制的信号,但只是星座映射后的信号,没有乘以载波,所以仍然是矩形波状态,比如说是BPSK的话,星座映射后的信号应该只有1和-1两种电平状态,而如果是QAM的话,就应该有1+1j,1-1j,-1-1j,-1+1j 四种状态。我们将它的数学表达写成:
而其中 就是实部值,
就是虚部的值。
2.2.3 将符号调制到正交的子载波
经过串并变换后,我们分别将 N 个 进行子带调制,分别放在N 个正交的子载波,这里有以下重要的设计要求:
说明:初始载波的频率是
,而每个子载波之间的间隔为
, 经过串并变换后,码元周期从 ts 延长到
,有如下关系
1.
2.
所以第n个正交载波的频率分量是
所以你会发现,OFDM的频谱长这样:
笔者仍未明白 的原理,书上说是为了保持正交性。
此时每一调制后的子载波的数学表达式就是:
2.2.3 Multiplexing/复用(信号合成)
在Multiplexer这一步,我们将信号合成,也即全部加在一起,则:
2.2.4 接收端进行Demultiplexing(信号分解)
在Demultiplexer这一步,我们将接收到的信号分别通过 N 个线路。
2.2.5 接收端进行相干解调
在每一路乘以对应频率分量的正弦波,然后积分,消去其他频率分量的信号,然后再并串变换得到符号。后续比如数字解调(Digital Demodulation)就依据不同的星座映射进行不同的解调了。
2.2 利用IFFT和FFT进行调制和解调
根据OFDM原理,可以看到OFDM信号数学表达式为:
我们可以进行一定的数学推导:
所以我们可以用非常便捷的IFFT进行ODFM调制,而在接收端,我们进行FFT即可复原信号。注意了,这里的IFFT和FFT的计算都由DSP处理器计算。
2.3 循环前缀 (Cyclic Prefix)
循环前缀的主要目的是为了消除多径信道带来的 ISI(Inter-symbol Interference),要理解它必须得先知道 ISI 从哪来,又怎么消除。
2.3.1 ISI 从哪来
我们先看下面的图(摘自李晓峰 通信原理),其中 和
是正交的两个频率:
只关注T(积分区间),可以看到两个频率的无时延路径(第一行和第三行),在积分区间内彼此正交。但是看两个频率的有时延路径(第二行和第四行),由于时延,两个频率不再正交。两个频率不再正交就意味着这两个子载波在接收端无法用相干解调,造成符号之间的干扰,这就是ISI 来的原因。
2.3.2 如何消除ISI
一种有效的做法就是加入循环前缀(Cyclic Prefix),如图:
可以看到,加入循环前缀后,在T(积分区域),两频率仍然正交。
注意:循环前缀的长度(或者说持续时间)必须大于信道的时延,看图的话应该很容易发现。
三、OFDM的MATLAB仿真
3.1 仿真的系统(理想信道估计)
注意,这里的信道信息是用 理想信道估计 获得的,理想信道估计无他,就是指你在接收端已经完全知道信道信息,就叫做理想信道估计。通常我们其实是不知道信道信息的,所以需要在IFFT之前,设计导频结构,有块状导频,梳状导频和格状导频。但在这里我不仿真了,以后有时间加上。
3.2 代码
这是一个函数,已经做好了备注。参数:nos是number of symbol,就是你要仿真几个OFDM符号,SNR_dB就是接收端的信噪比,H就是信道信息。
function output = OFDM(nos,SNR_dB,H)
%OFDM: This is a function of generation of OFDM symbol and demodulate it
% BER = OFDM(nos,noise_power_dB,H); where nos is number of symbol; H is
% dataset of channel
%%
%Generation of OFDM symbols signal
K=1024; % K number of sub-carriers
nop=23; % Number of paths in channel
tau=1;
tau_max=nop*tau; % The time delay of each path
cp=tau_max+2; % Length of cyclic prefix
OFDM_symbol_overall=[]; % All OFDM Symbol with CP
mes=[]; % Original bit stream - message
for i=1:1:nos
bits=randi([0 1],K,1); % One OFDM symbol
symbol_bpsk=2*bits-1; % Modulate bits with BPSK
OFDM_symbol=ifft(symbol_bpsk,K).*sqrt(1024); % Generation of OFDM symbol and normalization
CP=OFDM_symbol(K-cp+1:K); % Cyclic prefix
OFDM_symbol_cp=[CP;OFDM_symbol]; % Combine CP with OFDM symbol
OFDM_symbol_overall=[OFDM_symbol_overall;OFDM_symbol_cp]; % Combine every OFDM Symbol
mes=[mes;bits];
end
%%
%OFDM signal passed through Multi-paths channel
OFDM_symbols_mp=zeros(nos*(K+cp)+(nop-1)*tau,nop); % OFDM symbols passing through multi-paths channel
for i=1:23
H_part=H( ((i-1)*tau+1) :(nos*(K+cp)+tau*(i-1)),i); % truncate partial of H corresponding to the time delay
OFDM_symbols_mp( ((i-1)*tau+1) :(nos*(K+cp)+(i-1)*tau),i)=OFDM_symbol_overall.*H_part;
end
%%
%AWGN Channel in Receiver
N0 = 1/10^(SNR_dB/10); % Noise power
noise = sqrt(N0/2)*(randn(1,nos*(K+cp))+1i*randn(1,nos*(K+cp))); % AWGN Noise
%%
% Receive & Normalization & Removing Cyclic prefix
OFDM_signal_rec=sum(OFDM_symbols_mp,2); % Multi-paths Combination
OFDM_signal_rec=OFDM_signal_rec(1:nos*(K+cp),1); % Truncation since the receiver only demodulates specific length of signal
OFDM_signal_rec=OFDM_signal_rec+noise';
rec_n=OFDM_signal_rec./sqrt(1024); %Normalization of received signal
rec_nr=zeros(K*nos,1); % Remove the cyclic prefix
for i=1:1:nos
rec_nr( (i-1)*K+1 : i*K )=rec_n(( (i-1) * (K+cp)+cp+1 ): (i*(K+cp)) ,1);
end
%%
%Ideal Channel Estimation - Indicates that we've already known the channal
%Equalizatin
rec_sig_e=zeros(nos*K,1);
for j=1:1:nos
ICE=zeros(K,1);
for i=1:1:nop
H_cor=H( (((j-1)*(K+cp)+cp+1)+(i-1)*tau) : (j*(K+cp)+(i-1)*tau) ,i);
ICE(i)=mean(H_cor);
end
ICE_F=fft(ICE,K); % The frequence domain of estimated channel
rec_sig_e( ((j-1)*K+1):j*K ,1 )=fft(rec_nr( ((j-1)*K+1):j*K ,1 ),K)./ICE_F;
end
%%
%Detection
x_e=real(rec_sig_e)>0;
%%
%BER
BER=sum(abs(x_e-mes))/(nos*K);
output=BER;
%{
disp(['Information: ']);
disp(['1.The number of OFDM symbols is ',num2str(nos)]);
disp(['2.The S/N in dB is ',num2str(SNR_dB)]);
disp(['3.The bit error rate is ',num2str(BER)]);
%}
end
3.3 OFDM系统(非理想信道估计)
以后补上