Main Content

MATLAB을 사용하여 16-QAM 검토하기

이 예제에서는 기저대역 변조기, 채널, 복조기로 구성된 통신 링크를 사용하여 데이터 스트림을 처리하는 방법을 보여줍니다. 여기에서는 랜덤 데이터의 일부를 줄기 플롯에 표시하고, 송신된 신호와 수신된 신호를 성상도 다이어그램에 표시하고, 비트 오류율(BER)을 계산합니다. 통신 링크에 펄스 성형 필터를 추가하려면 Use Pulse Shaping on 16-QAM Signal 예제를 참조하십시오. 펄스 성형 필터링이 적용된 통신 링크에 순방향 오류 정정을 추가하려면 Use Forward Error Correction on 16-QAM Signal 예제를 참조하십시오.

랜덤 신호 변조하기

변조 방식은 기저대역 16-QAM을 사용하고, 신호는 가산성 백색 가우스 잡음(AWGN) 채널을 통과합니다. 기본 시뮬레이션 연산에서는 다음과 같은 Communications Toolbox™ 및 MATLAB® 함수를 사용합니다.

  • rng — 난수 생성 제어

  • randi — 랜덤 데이터 스트림 생성

  • bit2int — 이진 데이터를 정수 값 심볼로 변환

  • qammod — 16-QAM을 사용하여 변조

  • comm.AWGNChannel — AWGN을 사용하여 송신된 데이터에 손상 추가

  • scatterplot — 성상도 다이어그램 생성

  • qamdemod — 16-QAM을 사용하여 복조

  • int2bit — 정수 값 심볼을 이진 데이터로 변환

  • biterr — 시스템 BER 계산

랜덤 이진 데이터 스트림 생성하기

MATLAB에서 신호를 표현하는 일반적인 형식은 벡터 또는 행렬입니다. 데이터 스트림의 길이(즉, 열 벡터의 행 개수)는 임의로 30,000으로 설정되었습니다. 예제에서 반복 가능한 결과를 생성하도록 rng 함수를 디폴트 상태 또는 임의의 정적 시드값으로 설정합니다. 그런 다음 randi 함수를 사용하여 이진 데이터 스트림의 난수 값을 포함하는 열 벡터를 생성합니다.

파라미터를 정의합니다.

M = 16;      % Modulation order
k = log2(M); % Number of bits per symbol
n = 30000;   % Number of symbols per frame
sps = 1;     % Number of samples per symbol (oversampling factor)
rng default  % Use default random number generator

dataIn = randi([0 1],n*k,1); % Generate vector of binary data

줄기 플롯을 사용하여 랜덤 이진 데이터 스트림의 처음 40비트에 해당하는 이진 값을 표시합니다. stem 함수 호출 시 콜론(:) 연산자를 사용하여 이진 벡터의 일부를 선택합니다.

stem(dataIn(1:40),'filled');
title('Random Bits');
xlabel('Bit Index');
ylabel('Binary Value');

이진 데이터를 정수 값 심볼로 변환하기

qammod 함수의 디폴트 구성에서는 변조할 입력 심볼로 정수 값 데이터를 필요로 합니다. 이 예제에서는 qammod 함수를 사용하기 전에 이진 데이터 스트림이 정수 값으로 전처리되었습니다. 구체적으로 살펴보면, bit2int 함수가 각 4-튜플을 [0, (M–1)] 범위 내의 상응하는 정수로 변환합니다. 이 예제에서 변조 차수 M은 16입니다.

k=log2(M)에 의해 정의된 심볼당 비트 수를 지정하여 비트-심볼 매핑을 수행합니다. 그런 다음 bit2int 함수를 사용하여 각 4-튜플을 정수 값으로 변환합니다.

dataSymbolsIn = bit2int(dataIn,k);

처음 10개 심볼을 줄기 플롯에 플로팅합니다.

figure;                    % Create new figure window.
stem(dataSymbolsIn(1:10));
title('Random Symbols');
xlabel('Symbol Index');
ylabel('Integer Value');

16-QAM을 사용하여 변조하기

이진 인코딩 및 그레이 인코딩 비트-심볼 매핑을 위해 qammod 함수를 사용하여 위상 오프셋이 0인 16-QAM 변조를 dataSymbolsIn 열 벡터에 적용합니다.

dataMod = qammod(dataSymbolsIn,M,'bin'); % Binary-encoded
dataModG = qammod(dataSymbolsIn,M);      % Gray-encoded

변조 연산은 16-QAM 신호 성상도의 요소에 상응하는 값이 포함되어 있는 복소수 열 벡터를 출력합니다. 이 예제의 뒷부분에 나오는 성상도 다이어그램은 이진 및 그레이 심볼 매핑을 보여줍니다.

변조 함수에 대한 자세한 내용은 Digital Baseband Modulation 항목을 참조하십시오. 위상 편이 변조(PSK)에 그레이 코딩을 사용하는 예제는 Symbol Mapping Examples 항목을 참조하십시오.

백색 가우스 잡음 추가하기

변조된 신호는 신호 대 잡음비(SNR)가 지정된 awgn 함수를 사용하여 채널을 통과합니다. 비트당 에너지 대 잡음 파워 스펙트럼 밀도의 비(Eb/N0)를 awgn 함수에서 사용할 SNR 값으로 변환합니다. sps 변수는 이 예제에서 중요하지 않지만, 펄스 성형을 더 쉽게 사용하도록 예제를 확장해 줍니다. 자세한 내용은 Use Pulse Shaping on 16-QAM Signal 예제를 참조하십시오.

convertSNR 함수를 사용하여 채널의 Eb/N0이 10dB일 때의 SNR을 계산합니다.

EbNo = 10;
snr = convertSNR(EbNo,'ebno', ...
    samplespersymbol=sps, ...
    bitspersymbol=k);

이진 코드 심볼 매핑과 그레이 코드 심볼 매핑을 위해 신호를 AWGN 채널에 통과시킵니다.

receivedSignal = awgn(dataMod,snr,'measured');
receivedSignalG = awgn(dataModG,snr,'measured');

성상도 다이어그램 만들기

scatterplot 함수를 사용하여, 변조된 신호 dataMod와 채널을 통과한 후 수신된 잡음 있는 신호의 동위상 성분과 직교 위상 성분을 표시합니다. AWGN의 효과가 성상도 다이어그램에 나타납니다.

sPlotFig = scatterplot(receivedSignal,1,0,'g.');
hold on
scatterplot(dataMod,1,0,'k*',sPlotFig)

16-QAM 복조하기

qamdemod 함수를 사용하여, 수신된 데이터를 복조하고 정수 값 데이터 심볼을 출력합니다.

dataSymbolsOut = qamdemod(receivedSignal,M,'bin'); % Binary-encoded data symbols
dataSymbolsOutG = qamdemod(receivedSignalG,M);     % Gray-coded data symbols

정수 값 심볼을 이진 데이터로 변환하기

int2bit 함수를 사용하여 QAM 복조기의 이진 인코딩 데이터 심볼을 길이가 (Nsym×Nbits/sym)인 이진 벡터로 변환합니다. Nsym은 QAM 심볼의 총 개수이고 Nbits/sym은 심볼당 비트 수입니다. 16-QAM의 경우 Nbits/sym = 4입니다. 그레이 인코딩 심볼에 대해 이 과정을 반복합니다.

이 예제의 앞부분에서 수행한 비트-심볼 매핑을 반대로 수행합니다.

dataOut = int2bit(dataSymbolsOut,k);
dataOutG = int2bit(dataSymbolsOutG,k);

시스템 BER 계산하기

biterr 함수는 원래 이진 데이터 스트림 dataIn과 수신된 데이터 스트림 dataOutdataOutG로부터 비트 오류 통계량을 계산합니다. 그레이 코딩은 BER을 크게 줄여줍니다.

오류율 함수를 사용하여 오류 통계량을 계산합니다. fprintf 함수를 사용하여 결과를 표시합니다.

[numErrors,ber] = biterr(dataIn,dataOut);
fprintf('\nThe binary coding bit error rate is %5.2e, based on %d errors.\n', ...
    ber,numErrors)
The binary coding bit error rate is 2.13e-03, based on 255 errors.
[numErrorsG,berG] = biterr(dataIn,dataOutG);
fprintf('\nThe Gray coding bit error rate is %5.2e, based on %d errors.\n', ...
    berG,numErrorsG)
The Gray coding bit error rate is 1.67e-03, based on 200 errors.

신호 성상도 플로팅하기

이전에 표시된 성상도 다이어그램은 QAM 성상도의 점들을 플로팅했지만, 심볼 값과 성상도 점 간의 매핑은 표시하지 않았습니다. 이 섹션에서, 성상도 다이어그램은 데이터의 이진 인코딩 및 그레이 인코딩과 성상도 점 간의 매핑을 표시합니다.

16-QAM 성상도의 자연 코드 및 그레이 코드 이진 심볼 매핑 표시하기

이진 코드 심볼 매핑과 그레이 코드 심볼 매핑을 사용하여 전체 성상도 점 세트에 16-QAM 변조를 적용합니다.

M = 16;                       % Modulation order
x = (0:15);                   % Integer input
symbin = qammod(x,M,'bin');   % 16-QAM output (binary-coded)
symgray = qammod(x,M,'gray'); % 16-QAM output (Gray-coded)

scatterplot 함수를 사용하여 성상도 다이어그램을 플로팅하고, 성상도 점을 이진(빨간색) 및 그레이(녹색) 표현으로 표시합니다.

scatterplot(symgray,1,0,'b*');
for k = 1:M
    text(real(symgray(k)) - 0.0,imag(symgray(k)) + 0.3, ...
        dec2base(x(k),2,4),'Color',[0 1 0]);
     text(real(symgray(k)) - 0.5,imag(symgray(k)) + 0.3, ...
         num2str(x(k)),'Color',[0 1 0]);
    
    text(real(symbin(k)) - 0.0,imag(symbin(k)) - 0.3, ...
        dec2base(x(k),2,4),'Color',[1 0 0]);
    text(real(symbin(k)) - 0.5,imag(symbin(k)) - 0.3, ...
        num2str(x(k)),'Color',[1 0 0]);
end
title('16-QAM Symbol Mapping')
axis([-4 4 -4 4])

플롯 검토하기

그레이 코드 심볼 매핑을 사용하면 그레이 코드로 코딩된 신호의 성상도 점들이 인접한 점과 하나의 비트만 다르므로 BER 성능이 향상됩니다. 반면, 이진 코드 심볼 매핑에서는 일부 인접한 성상도 점들이 두 비트가 다릅니다. 예를 들어, 1(0 0 0 1)과 2(0 0 1 0)의 이진 코드 값은 두 비트(세 번째 비트와 네 번째 비트)가 다릅니다.

참고 항목

함수

관련 항목