Main Content

MATLAB에서 QPSK와 OFDM 사용하기

이 예제에서는 QPSK(직교 위상 편이 변조)를 사용하여 신호를 변조한 다음 여기에 OFDM(직교 주파수 분할 다중화)을 적용하는 기본적인 통신 시스템을 시뮬레이션하는 방법을 보여줍니다. 이 시스템은 그런 다음 신호를 가산성 백색 가우스 잡음(AWGN) 채널에 통과시킨 후 역다중화하고 복조합니다. 마지막으로, 시스템은 비트 오류 개수를 계산합니다. 이 예제는 시스템 모델링에 MATLAB® System object™를 사용한 방법을 보여줍니다.

시뮬레이션 파라미터를 설정합니다.

M = 4;                 % Modulation alphabet
k = log2(M);           % Bits/symbol
numSC = 128;           % Number of OFDM subcarriers
cpLen = 32;            % OFDM cyclic prefix length
maxBitErrors = 100;    % Maximum number of bit errors
maxNumBits = 1e7;      % Maximum number of bits transmitted

시뮬레이션을 위해 OFDM 변조기, OFDM 복조기, 오류율 계산기에 대한 System object를 생성합니다. 이름-값 인수를 사용하여 객체 속성을 설정합니다.

시뮬레이션 파라미터에 따라 OFDM 변조기와 복조기의 쌍을 설정합니다. 하나의 심볼에 이 기법을 적용하려면 이전 심볼의 샘플에 대한 정보가 필요하기 때문에 OFDM 윈도우 적용을 위해 System object를 사용해야 합니다. System object는 이 정보를 내부 상태로 저장합니다. 자세한 내용은 OFDM Raised Cosine Windowing 항목을 참조하십시오.

ofdmMod = comm.OFDMModulator( ...
    FFTLength=numSC, ...
    CyclicPrefixLength=cpLen, ...
    Windowing=true, ...
    WindowLength=16);
ofdmDemod = comm.OFDMDemodulator( ...
    FFTLength=numSC, ...
    CyclicPrefixLength=cpLen);

오류율 계산기를 만듭니다. 시뮬레이션 중에 재설정할 수 있도록 ResetInputPort 속성을 true로 설정합니다.

errorRate = comm.ErrorRate(ResetInputPort=true);

OFDM 변조기의 입력 및 출력 차원을 확인하려면 ofdmMod 객체의 info 함수를 사용합니다.

ofdmDims = info(ofdmMod)
ofdmDims = struct with fields:
    DataInputSize: [117 1]
       OutputSize: [160 1]

ofdmDims 구조체 변수에서 데이터 부반송파의 개수를 확인합니다.

numDC = ofdmDims.DataInputSize(1)
numDC = 117

데이터 부반송파 개수와 심볼당 비트 수에서 OFDM 프레임 크기(단위: 비트)를 확인합니다.

frameSize = [k*numDC 1];

원하는 Eb/No 범위, 심볼당 비트 수, 총 부반송파 개수에 대한 데이터 부반송파 개수의 비를 기반으로 SNR 벡터를 설정합니다.

EbNoVec = (0:10)';
snrVec = EbNoVec + 10*log10(k) + 10*log10(numDC/numSC);

BER 및 오류 통계량 배열을 초기화합니다.

berVec = zeros(length(EbNoVec),3);
errorStats = zeros(1,3);

Eb/No 값 범위에 대해 통신 링크를 시뮬레이션합니다. 각 Eb/No 값에 대해, 시뮬레이션은 시스템이 maxBitErrors를 기록하거나 송신된 총 비트 수가 maxNumBits를 초과할 때까지 실행됩니다.

for m = 1:length(EbNoVec)
    snr = snrVec(m);
    
   while errorStats(2) <= maxBitErrors && errorStats(3) <= maxNumBits
       dataIn = randi([0,1],frameSize);                
       qpskTx = pskmod(dataIn,M,InputType="bit");      
       txSig = ofdmMod(qpskTx);                        
       powerDB = 10*log10(var(txSig));                 
       noiseVar = 10.^(0.1*(powerDB-snr));
       noise = sqrt(noiseVar/2)*complex(randn(size(txSig)), ...
           randn(size(txSig)));
       rxSig = txSig + noise;
       qpskRx = ofdmDemod(rxSig);                      
       dataOut = pskdemod(qpskRx,M,OutputType="bit");  
       errorStats = errorRate(dataIn,dataOut,0);       
   end
    
    berVec(m,:) = errorStats;                          
    errorStats = errorRate(dataIn,dataOut,1);          
end

QPSK 시스템의 이론적 BER을 확인하기 위해 berawgn 함수를 사용합니다.

berTheory = berawgn(EbNoVec,'psk',M,'nondiff');

결과를 비교하기 위해 이론적 데이터와 시뮬레이션된 데이터를 동일한 그래프에 플로팅합니다.

figure
semilogy(EbNoVec,berVec(:,1),'*')
hold on
semilogy(EbNoVec,berTheory)
legend('Simulation','Theory','Location','Best')
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')
grid on
hold off