⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.m

📁 OFDM系列之一:OFDM_demodulation OFDM系统实现的C语言实现。绝对好程序
💻 M
字号:
% OFDM demodulation frame by frame

clear;

if 0
    fftSize=8;
    CpLength=2;
    %dataSymbolNumberPerFrame=13;
    dataSymbolNumberPerFrame=10;
    numberOfOccupiedSubcarrier=4;
    occupiedSubcarrierIndex=[6,7,1,2]+1;
    OFDMsymbolPerFrame=6;
    % pilotPatternAndValue=[0 0 0 0; 2.1+6.7j 0 -6.8+4.8j 0; 0 0.6 0 6.7j; 0 0 5+5j 0; 0 -0.3j 0 8.6; 1.1+2.2j 3.2-6j 4.9 9.1j];
    pilotPatternAndValue=[0 0 0 0; 2.1+6.7j 0 -6.8+4.8j 0; 0 0.6 0 6.7j; 1.1+2.2j 3.2-6j 4.9 9.1j; 0 -0.3j 0 8.6; 0 0 5+5j 0];
    % pilotPatternAndValue=[ 1.1+2.2j 3.2-6j 4.9 9.1j; 2.1+6.7j 0 -6.8+4.8j 0; 0 0.6 0 6.7j; 0 0 5+5j 0; 0 -0.3j 0 8.6;0 0 0 0];
    u_OFDMsymbolCP=[0:(fftSize+CpLength)*OFDMsymbolPerFrame-1]-2*j*[0:(fftSize+CpLength)*OFDMsymbolPerFrame-1];
    
    estimatedCFR=zeros(OFDMsymbolPerFrame, fftSize);
    for n=1:OFDMsymbolPerFrame
        estimatedCFR(n,:)=n+j*[1:fftSize];
    end
    He=estimatedCFR.';
    
    ycp=zeros(fftSize+CpLength,OFDMsymbolPerFrame);
    ycp(:)=u_OFDMsymbolCP;
    y=ycp(CpLength+1:end,:);
    Y=fft(y);
    
    Ye_s=[];
    for n=1:OFDMsymbolPerFrame
        dataSubcarrierIndex=find(~abs(pilotPatternAndValue(n,:)));
        dataSubcarrierIndex2=occupiedSubcarrierIndex(dataSubcarrierIndex);
        temp=Y(dataSubcarrierIndex2,n)./He(dataSubcarrierIndex2,n);
        Ye_s=[Ye_s;temp];
    end
    
    Ye_s=Ye_s(1:dataSymbolNumberPerFrame)
end

if 01
    isShortCP=0;
    fftSize=8;
    CpLength1=5;
    %dataSymbolNumberPerFrame=13;
    dataSymbolNumberPerFrame=12;
    numberOfOccupiedSubcarrier=4;
    occupiedSubcarrierIndex=[6,7,1,2]+1;
    if isShortCP    % short CP
        OFDMsymbolPerFrame=7;
        CpLength2=2;
        pilotPatternAndValue=[0 0 0 0; 2.1+6.7j 0 -6.8+4.8j 0; 0 0.6 0 6.7j; 0 0 5+5j 0; 0 -0.3j 0 8.6; 1.1+2.2j 3.2-6j 4.9 9.1j; -3.89+4.5j 0 0 -6.7j];
        len=6*(fftSize+CpLength1)+1*(fftSize+CpLength2);
    else            % long CP
        OFDMsymbolPerFrame=6;
        CpLength2=0;
        pilotPatternAndValue=[0 0 0 0; 2.1+6.7j 0 -6.8+4.8j 0; 0 0.6 0 6.7j; 0 0 5+5j 0; 0 -0.3j 0 8.6; 1.1+2.2j 3.2-6j 4.9 9.1j];
        len=6*(fftSize+CpLength1);
    end
    u_OFDMsymbolCP=[0:len-1]'-2*j*[0:len-1]';
    
    estimatedCFR=zeros(OFDMsymbolPerFrame, fftSize);
    for n=1:OFDMsymbolPerFrame
        estimatedCFR(n,:)=n+j*[1:fftSize];
    end
    He=estimatedCFR.';

    if isShortCP
        ycp=zeros(fftSize+CpLength1,OFDMsymbolPerFrame-1);
        ycp(:)=u_OFDMsymbolCP(1:end-(fftSize+CpLength2));
        y=ycp(CpLength1+1:end,:);
        Y=fft(y);
        Y=[Y fft(u_OFDMsymbolCP(end-fftSize+1:end))];
    else
        ycp=zeros(fftSize+CpLength1,OFDMsymbolPerFrame);
        ycp(:)=u_OFDMsymbolCP;
        y=ycp(CpLength1+1:end,:);
        Y=fft(y);
    end
    
    Ye_s=[];
    for n=1:OFDMsymbolPerFrame
        dataSubcarrierIndex=find(~abs(pilotPatternAndValue(n,:)));
        dataSubcarrierIndex2=occupiedSubcarrierIndex(dataSubcarrierIndex);
        temp=Y(dataSubcarrierIndex2,n)./He(dataSubcarrierIndex2,n);
        Ye_s=[Ye_s;temp];
    end
    
    Ye_s=Ye_s(1:dataSymbolNumberPerFrame);
    load u_equalizedDataSymbol_r.txt;
    load u_equalizedDataSymbol_i.txt;
    Ye1=u_equalizedDataSymbol_r+j*u_equalizedDataSymbol_i;
    Ye1(1)=[];
    max(abs(Ye1-Ye_s))
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -