目录
一、理论基础
OFDM(Orthogonal Frequency Division Multiplexing)即正交频分复用技术,实际上OFDM是MCM(Multi Carrier Modulation),多载波调制的一种。通过频分复用实现高速串行数据的并行传输, 它具有较好的抗多径衰落的能力,能够支持多用户接入。OFDM技术由MCM(Multi-Carrier Modulation,多载波调制)发展而来。OFDM技术是多载波传输方案的实现方式之一,它的调制和解调是分别基于IFFT和FFT来实现的,是实现复杂度最低、应用最广的一种多载波传输方案。
OFDM主要思想是:将信道分成若干正交子信道,将高速数据信号转换成并行的低速子数据流,调制到在每个子信道上进行传输。正交信号可以通过在接收端采用相关技术来分开,这样可以减少子信道之间的相互干扰(ISI) 。每个子信道上的信号带宽小于信道的相关带宽,因此每个子信道上可以看成平坦性衰落,从而可以消除码间串扰,而且由于每个子信道的带宽仅仅是原信道带宽的一小部分,信道均衡变得相对容易。
OFDM是一种特殊的多载波传输方案。OFDM应用DFT和其逆变换IDFT方法解决了产生多个互相正交的子载波和从子载波中恢复原信号的问题。这就解决了多载波传输系统发送和传送的难题。应用快速傅里叶变换更使多载波传输系统的复杂度大大降低。从此OFDM技术开始走向实用。但是应用OFDM系统仍然需要大量繁杂的数字信号处理过程,而当时还缺乏数字处理功能强大的元器件,因此OFDM技术迟迟没有得到迅速发展。
基于IFFT/FFT 实现的OFDM 系统:
OFDM采用BPSK、QPSK、16QAM、64QAM4种调制方式。按照星座图,将每个子信道上的数据,映射到星座图点的复数表示,转换为同相Ich和正交分量Qch。
其实这是一种查表的方法,以16QAM星座为例,bits_per_symbol=4,则每个OFDM符号的每个子信道上有4个二进制数{d1,d2,d3,d4},共有16种取值,对应星座图上16个点,每个点的实部记为Qch。为了所有的映射点有相同高的平均功率,输出要进行归一化,所以对应BPSK,PQSK,16QAM,64QAM,分别乘以归一化系数系数1,, , .输出的复数序列即为映射后的调制结果。
对上一步得到的相同分量和正交分量按照(Ich+Qch*i)进行IFFT运算。并将得到的复数的实部作为新的Ich,虚部作为新的Qch。
同步技术对各种数字传输技术来说十分关键,对于OFDM 系统更是如此。因为OFDM对同步误差十分敏感,同步性能的好坏直接影响到接收的性能,一旦同步性能不好,OFDM 的整体性能将会严重下降。
通常情况下,同步包括同步捕获和同步跟踪两个阶段。在同步捕获阶段,OFDM系统同步的主要任务是符号定时捕获和载波频偏(CFO)的捕获。关于符号定时和载波频偏估计算法,很多文献对此进行了探讨。提出了基于伪随机序列的定时捕获算法,但定时捕获通常是在频偏捕获之前完成的,因此当频偏较大时根本就看不到期望出现的峰值。作者基于一个由两个差分的OFDM训练符号组成的同步头,提出了一种联合的符号定时和载波频偏估计算法(简称为S&C算法)。该算法利用一个训练符号中两个相等的部分进行自相关来实现符号定时估计,因此频偏对它的影响很小,但是采用该算法进行估计时受循环前缀的影响将出现一种峰值平顶现象,这种现象使得估计出现较大的误差,因此严格地说采用这种算法只能起帧检测的作用,并不能完成真正的符号定时估计。
在OFDM系统的复基带等效模型中,发送端的OFDM复基带已调信号可表示为:
该信号经过信道传输后,接收端的符号定时偏移通常表示为接收信号的时延,载波的频率偏移通常表示为时域上的相位失真,因而具有符号定时偏移和载波频偏的OFDM系统的接收信号可表示为:
同步的主要任务是估计符号定时偏差τ和载波频偏ε,并通过补偿来消除或减弱同步误差对系统性能的影响。
二、核心程序
..............................
%% 信道
RxSignal = awgn(TxSignal,SNR,'measured');
%% 接收机
%% 匹配滤波及下采样
RXSigMatched = rcosflt(RxSignal,1,Fs,'sqrt/Fs',Rolloff,DLenSymbol);
Rx_Sig_down = RXSigMatched(1:Fs:end);
Rx_Sig = Rx_Sig_down((2*DLenSymbol+1):(end-2*DLenSymbol));
%% 帧头捕获、同步模块
autoresult = AutoR(Rx_Sig.',BeaconLen); % 滑动自相关窗
length(Rx_Sig)
automodule = abs(autoresult).^2; % 自相关模值
[a,time_est] = max(automodule); % 帧头位置
time_est_err = time_est - (BeaconLen+1); % 帧头位置误差
freq_est = atan(imag(autoresult(time_est))/real(autoresult(time_est)))*(FFTLen/BeaconLen)/(2*pi); % 频偏估计
freq_est_err = abs(freq_est+FreqOffSet)
figure
plot(automodule) % 画自相关结果
xlabel('n')
ylabel('自相关模值')
grid on
Rxjw = j*(2*freq_est*pi/(FFTLen))*(0:length(Rx_Sig)-1); % 频偏补偿
if freqest
Rx_Sig = Rx_Sig.*exp(Rxjw).';
end
%% 去循环前缀和保护间隔
Rx_Rem_CP_Sig = reshape(Rx_Sig(2*BeaconLen+1:end),TotalLen,OFDMSymbolNum);
Data2FFT = Rx_Rem_CP_Sig(1+CPLen:1+CPLen+FFTLen-1,:);
%% FFT
DataofFFT= fft(Data2FFT,[],1);
DataofFFT = reshape(DataofFFT,1,FFTLen*OFDMSymbolNum);
%% QPSK 解调
tmp1=real(DataofFFT);
tmp2=imag(DataofFFT);
figure
demod_symbols=[tmp1;tmp2];
demod_symbols=demod_symbols(:);
demod_symbols=demod_symbols.';
RxBit = (demod_symbols>0);
up155
三、仿真结论
无频偏估计
有频偏估计并补偿