仿真中遇到的小问题,记录一下,个人理解,多谢批评指正!
在OFDM系统中解调时,若定时提前,但仍在CP范围内时,仍可正确解调,代码验证如下:
%% OFDM系统简易版
clear;
clc;
err = 0;
SNR=30;
%% 参数设置
simParameters.NFFT = 64;%子载波个数
simParameters.cp = 16;
simParameters.Nsym = 4;%符号数
simParameters.Pilot_sym = 1;%符号数
simParameters.Modulate = 2; %调制方式为QPSK
simParameters.NInputBits =368;
simParameters.CRCLen = 16;
%% 生成源数据
Infobit=randi([0,1],1,368);
%% 每块 +16bitCRC
crcbit = crc_for_5g(Infobit,'16');
msgbit = ([Infobit,crcbit]).';
%% 调制
tx_modulate = tx_pskmod(msgbit, simParameters);
tx_modulate = reshape(tx_modulate,64,3);
tx_map = zeros(64 ,4 );
tx_map(:,1) = ones(64,1) ;%导频
tx_map(:,2:4) = tx_modulate ;
%% fft
tx_fft = fft(tx_map);
tx_cp = [tx_fft(end-15:end,:);tx_fft];
%% 过信道
%SignalsAWGN = awgn(tx_modulate,SNR, 'measured');
SignalsAWGN = tx_cp;
%% 解调
rx = SignalsAWGN(10:73,:);%定时提前
rx_ifft = ifft(rx);
H = rx_ifft(:,1)./ones(64,1);
r_equ = rx_ifft./H;
r_equ = r_equ(:);
rx_signal_demode = rx_pskdemod(r_equ(65:end), simParameters);
rx_signal = sign (rx_signal_demode);
rx_signal = (1-rx_signal)/2;
%% 检查CRC
crcbit_rx= crc_for_5g(rx_signal.','16');
验证可知,即使定时提前,但只要仍处于CP范围内,也可以获得完整的OFDM信息。也可通过OFDM公式推:
当定时提前时,所有时域信号未丢失,只是顺序混乱,因此对于每一个FFT之后的频点,相当于乘以e(-j2pi/Nkl),其中k是FFT之后数据索引,l是定时偏差。例如上例程序中,定时提前7个数据点,因此相当于FFT之后的数据乘以e(-j2pi/Nk(-7)),从导频处的信道估计值可验证,H=e(-j2pi/Nk(-7))。因此OFDM符号可正确解调。