1.软件版本
MATLAB2021a
2.核心代码
登录后复制
clc; clear;close all;%% 仿真参数 FFTLen = 128; % FFT块点数 GILen = 32;
% 保护间隔点数 CPLen = 5; % 循环前缀点数 TotalLen = FFTLen + GILen + CPLen;
OFDMSymbolNum = 3; % 每帧OFDM符号数 DataCarryPerSymbol = 100;
% 每符号有效数据数据数 BitPerDataCarry = 2;
% QPSK BitLenPerOFDMFrame = BitPerDataCarry*DataCarryPerSymbol*OFDMSymbolNum;
TotalLenPerOFDMFrame = BitPerDataCarry*FFTLen*OFDMSymbolNum; BeaconLen = 32; Fs = 8;
% 采样点数 Rolloff = 0.5; % 滚降系数 FreqOffSet = 0.2; % 频偏 DLenSymbol = 1;
% 延迟 freqest = 1; % 频偏补偿开关 SNR = 9; %% 发射机 %% 产生PN9序列
OFDMPN9 = [1 0 0 0 1 0 0 1 1]; OFDMPN9Reg=zeros(1,511); for ii = 1:511
OFDMPN9Reg(ii) = OFDMPN9(9); OFDMPN9 = [ xor(OFDMPN9(9),OFDMPN9(5)),OFDMPN9(1:8)];
end %% 生成发射序列 PN9RepNum = ceil(TotalLenPerOFDMFrame/511);
OFDMPN9Tx = repmat(OFDMPN9Reg,1,PN9RepNum); OFDMPN9Tx = OFDMPN9Tx(1:TotalLenPerOFDMFrame);
% 使用PN9序列% OFDMPN9Tx = randint(1:TotalLenPerOFDMFrame);
% 使用随机序列 %% QPSK 调制 table=exp(i*[-3/4*pi 3/4*pi 1/4*pi -1/4*pi])
% 生成QPSK符号 table=table([0 1 3 2]+1)
% Gray映射 inp=reshape(OFDMPN9Tx,2,TotalLenPerOFDMFrame/2); Data2iFFT=table([2 1]*inp+1);
%% IFFT Data2iFFT = reshape(Data2iFFT,FFTLen,OFDMSymbolNum); DataofiFFT= ifft(Data2iFFT,[],1);
DataofiFFTML = DataofiFFT; %% 加Preamble、循环前缀、保护间隔
OFDMSymbol = [DataofiFFT(FFTLen-CPLen+1:FFTLen,:);DataofiFFT(:,:);zeros(GILen,OFDMSymbolNum)];
Beacon = BeaconGen(BeaconLen); SigPow = mean(abs(OFDMSymbol(:)).^2);
Beacon = sqrt(2*SigPow)*Beacon; Preamble = [Beacon.'; Beacon.'];
ReOrder = [Preamble; OFDMSymbol(:)]; Data2OFDMTxFIRFilter = [ReOrder(:)];
%% 上采样及成形滤波 TxSignal = rcosflt(Data2OFDMTxFIRFilter,1,Fs,'sqrt',Rolloff,DLenSymbol);
Txjw = j*(2*FreqOffSet*pi/(FFTLen*Fs))*(0:length(TxSignal)-1); % 生成发送载波
TxSignal = TxSignal.'.*exp(Txjw); % 加频偏%% 信道
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
.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.
39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.
74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.96.
3.操作步骤与仿真结论
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删