【现代数字传输】OFDM的原理讲解和MATLAB实现

简介


 现代数字传输技术有许多种,例如MSK , GMSK , OFDM, 扩频技术,但是其中OFDM成功地应用于各种重要的通信系统,例如,DAB与DVB,3G/4G与LTE无线通信系统等。所以本篇文章将着重讲解OFDM流程和原理,以及对多径衰落信道下OFDM的MATLAB实现。

目录

简介

一、前置知识

1.1 正弦函数的正交性

1.2 DFT和IDFT

1.3 信号的频域形状

二、ODFM思想(Orthogonal Frequency Division Multiplexing)

2.1 利用正交的复载波传输信息(正交用在哪?)

2.2 OFDM的原理图

2.2.1 串并变换

2.2.3 将符号调制到正交的子载波

2.2.3 Multiplexing/复用(信号合成)

2.2.4 接收端进行Demultiplexing(信号分解)

2.2.5 接收端进行相干解调

2.2 利用IFFT和FFT进行调制和解调

2.3 循环前缀 (Cyclic Prefix)

2.3.1 ISI 从哪来

2.3.2 如何消除ISI

三、OFDM的MATLAB仿真

3.1 仿真的系统(理想信道估计)

3.2 代码


一、前置知识


OFDM是一个相比起基本数字调制来讲更为复杂的数字调制技术,我们学习它之前需要足够的前置知识。

1.1 正弦函数的正交性

这是OFDM技术能实现的非常关键的一个理论,推导如下:

 通过举例可以看到,正弦函数具有正交性,这样的好处将在接收端进行体现,因为你可以用积分手段去 过滤掉与某一频率的载波正交的其他载波(因为积分为0)。

1.2 DFT和IDFT

这里直接给出公式:

 记住DFT和IDFT的公式模样,这会是解答为什么OFDM采用IFFT调制信号的关键!

1.3 信号的频域形状

最开始的时候,我对于OFDM的频谱长成这样是非常疑惑的:

 为啥明明交叠了也是正交的呢?为什么是这么多拱门状的频域响应呢?我们不慌忙推导正交性,首先关注为什么信号的频率响应是拱门状。

其实是这样的,我们无论进行什么数字调制手段,我们调制后的符号都是 0 到 ts 的码元对吧。我们打个比方,BPSK调制,那么有下面的推导证明:

 

 从上推导我们得到以下很重要的性质:

1. 有限制码元周期为 Ts 且频率分量为 f_0 的调制符号,其频谱就是 拱门状的频率响应进行 f_0 的平移。

 2. 其主瓣的宽度就是 2 \times \frac{1}{T_s} , 集中在  [f_0-\frac{1}{T_s},f_0+\frac{1}{T_s}]

二、ODFM思想(Orthogonal Frequency Division Multiplexing)


这里将较为细致的讲解ODFM调制的原理,但是更多的细节会在做MATLAB的时候展现出来。

2.1 利用正交的复载波传输信息(正交用在哪?)

我们在前置知识中介绍了,复载波在满足一定频率间隔情况下是正交的,这种正交性带来了解调的方便。试想,我在比如说 f_1 的复载波上传输信号 s_1(t), 在频率为 f_2 的复载波上传输信号s_2(t)。在发送端中,我将两个调制后的复载波相加,一起发送,那么我在接收端,是不是只要分别乘以 f_1 的复载波和 f_2 的复载波再积分即可只保留相对应的信号了? 下面这幅图会很清晰的表现出来:

 那么试想,我用很多个这样的正交复载波去分别传送信息,在接收端都能通过这种手段解调,那不就很方便吗!(后面也将说明其很大程度地节约了频谱资源)

2.2 OFDM的原理图

先上图,然后一步一步解释在干啥

2.2.1 串并变换

在串并变换的过程中,系统将N个串行的符号 s_i(t)     i=1,2,3...N 变成并行的。其中有一点很重要!就是本来 s_i(t) 的码元周期只有 ts ,但是经过串并变换后 它们都被延长到了 N \times t_s ,N 表示N个子载波。

这里的s_i(t) 是已经经过基本数字基带调制的信号,但只是星座映射后的信号,没有乘以载波,所以仍然是矩形波状态,比如说是BPSK的话,星座映射后的信号应该只有1和-1两种电平状态,而如果是QAM的话,就应该有1+1j,1-1j,-1-1j,-1+1j 四种状态。我们将它的数学表达写成:

s_n(t)=a_n+b_nj

而其中 a_n 就是实部值,b_n 就是虚部的值。

2.2.3 将符号调制到正交的子载波

经过串并变换后,我们分别将 N 个 s_i(t) 进行子带调制,分别放在N 个正交的子载波,这里有以下重要的设计要求:

说明:初始载波的频率是 f_0,而每个子载波之间的间隔为 \Delta f, 经过串并变换后,码元周期从 ts 延长到 T_s=N\times t_s,有如下关系

1.   \Delta f=\frac{1}{T_s}

2.    f_0 \gg\Delta f

所以第n个正交载波的频率分量是 f_n=f_0+n\Delta f

 所以你会发现,OFDM的频谱长这样:

笔者仍未明白f_0 \gg\Delta f 的原理,书上说是为了保持正交性。

此时每一调制后的子载波的数学表达式就是:

x_n(t)=s_n(t)cos(2\pi f_nt)

2.2.3 Multiplexing/复用(信号合成)

在Multiplexer这一步,我们将信号合成,也即全部加在一起,则:

x(t)=\sum _{n=0}^{N-1}x_n(t)=\sum _{n=0}^{N-1}s_n(t)cos(2\pi (n\Delta f+f_0)t)

2.2.4 接收端进行Demultiplexing(信号分解)

在Demultiplexer这一步,我们将接收到的信号分别通过 N 个线路。

2.2.5 接收端进行相干解调

在每一路乘以对应频率分量的正弦波,然后积分,消去其他频率分量的信号,然后再并串变换得到符号。后续比如数字解调(Digital Demodulation)就依据不同的星座映射进行不同的解调了。

2.2 利用IFFT和FFT进行调制和解调

根据OFDM原理,可以看到OFDM信号数学表达式为:

x(t)=\sum _{n=0}^{N-1}x_n(t)=\sum _{n=0}^{N-1}s_n(t)cos(2\pi (n\Delta f+f_0)t)

我们可以进行一定的数学推导: 

 所以我们可以用非常便捷的IFFT进行ODFM调制,而在接收端,我们进行FFT即可复原信号。注意了,这里的IFFT和FFT的计算都由DSP处理器计算

2.3 循环前缀 (Cyclic Prefix)

循环前缀的主要目的是为了消除多径信道带来的 ISI(Inter-symbol Interference),要理解它必须得先知道 ISI 从哪来,又怎么消除。

2.3.1 ISI 从哪来

我们先看下面的图(摘自李晓峰 通信原理),其中 f_1 和 f_2 是正交的两个频率:

 只关注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系统(非理想信道估计)

以后补上

  • 62
    点赞
  • 325
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
OFDM(Orthogonal Frequency Division Multiplexing,正交频分复用)是一种多载波调制技术。在OFDM中,信号被分为多个子载波进行调制,这些子载波之间正交不重叠。OFDM实现原理可以通过以下步骤来描述: 1.生成扩频码:使用3阶的m序列,初始寄存器值为1,1,1生成扩频码。这个扩频码用于将调制后的数据进行扩频,以提高数据的可靠性。 2.对接收到的信号进行FFT变换:将接收到的信号进行FFT(快速傅里叶变换)变换,以将时域信号转换为频域信号。这个步骤可以通过matlab中的FFT函数来实现。 3.将扩频后的数据和导频进行组合:将经过扩频的数据与导频进行合并,以形成完整的OFDM符号。这个步骤可以在matlab中通过对每个OFDM符号的载波进行操作来完成。 4.将组合后的OFDM符号进行传输:将经过处理的OFDM符号通过信道进行传输。 通过以上步骤,OFDM信号的原始数据可以被分成多个子载波进行调制,并通过正交的方式进行复用,从而提高了信号的传输效率和抗干扰能力。这是OFDM的基本原理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [OFDM matlab实现](https://blog.csdn.net/qwebaby2/article/details/108076464)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值