www.gusucode.com > OFDMUWB系统基于训练序列的同步算法源码程序 > OFDMUWB系统基于训练序列的同步算法源码程序/code/OFDM_UWB_Freq.m
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 = 10; %% 发射机 %% 产生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 %% 去循环前缀和保护间隔 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); %% 统计误码率 [Num,BER] = biterr(double(RxBit),OFDMPN9Tx); BER plot(tmp1,tmp2,'.') % 画星座图 grid on axis square xlabel('I') ylabel('Q')