www.gusucode.com > OFDMUWB系统基于训练序列的同步算法源码程序 > OFDMUWB系统基于训练序列的同步算法源码程序/code/OFDM_UWB.m

    clc; clear; 

%% 仿真参数

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;

Fs = 4;         % 采样点数
Rolloff = 0.5;  % 滚降系数
FreqOffSet = 0; % 频偏
DLenSymbol = 1; % 延迟

%% 发射机

    %% 产生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;

    %% 加循环前缀和保护间隔
    ReOrder = [DataofiFFT(FFTLen-CPLen+1:FFTLen,:);DataofiFFT(:,:);zeros(GILen,OFDMSymbolNum)];
    % Data2OFDMTxFIRFilter = [BeaconRom.'; BeaconRom.';SignalField(:); ReOrder(:)];
    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);                               % 加频偏

%% 信道

    SNR = +inf;
    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));
    
    %% 去循环前缀和保护间隔
    Rx_Rem_CP_Sig = reshape(Rx_Sig,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')