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