Main Content

qamdemod

직교 진폭 복조

설명

예제

Z = qamdemod(Y,M)은 변조 차수 M의 직교 진폭 변조(QAM) 신호 Y가 주어진 경우 복조된 신호 Z를 반환합니다.

예제

Z = qamdemod(Y,M,symOrder)는 복조된 신호 Z를 반환하고, 복조를 위한 심볼 순서를 지정합니다.

예제

Z = qamdemod(___,Name=Value)는 하나 이상의 이름-값 인수를 사용하여 옵션을 지정합니다. 예를 들어 OutputType=bit는 출력 신호의 유형을 비트로 설정합니다.

예제

모두 축소

8-QAM 신호를 복조하고 심볼 0과 3에 대응되는 점을 플로팅합니다.

랜덤 8진 데이터 심볼을 생성합니다.

data = randi([0 7],1000,1);

8-QAM을 적용하여 data를 변조합니다.

txSig = qammod(data,8);

변조된 신호를 AWGN 채널에 통과시킵니다.

rxSig = awgn(txSig,18,'measured');

초기 위상 π/8을 사용하여 수신 신호를 복조합니다.

rxData = qamdemod(rxSig.*exp(-1i*pi/8),8);

기준 성상도 점을 생성합니다.

refpts = qammod((0:7)',8) .* exp(1i*pi/8);

심볼 0과 3에 대응되는 수신된 신호 점을 플로팅하고, 기준 성상도를 겹쳐 놓습니다. 그러한 심볼에 대응되는 수신된 데이터가 표시됩니다.

plot(rxSig(rxData==0),'g.');
hold on
plot(rxSig(rxData==3),'c.');
plot(refpts,'r*')
text(real(refpts)+0.1,imag(refpts),num2str((0:7)'))
xlabel('In-Phase')
ylabel('Quadrature')
legend('Points corresponding to 0','Points corresponding to 3', ...
    'Reference constellation','location','nw');

Figure contains an axes object. The axes object with xlabel In-Phase, ylabel Quadrature contains 11 objects of type line, text. One or more of the lines displays its values using only markers These objects represent Points corresponding to 0, Points corresponding to 3, Reference constellation.

WLAN 심볼 매핑의 16-QAM을 사용하여 랜덤 데이터를 변조하고 복조합니다. 입력 데이터 심볼이 복조된 심볼과 일치하는지 확인합니다.

랜덤 심볼로 구성된 3차원 배열을 생성합니다.

x = randi([0,15],20,4,2);

WLAN 표준에 기반한 16-QAM 성상도의 사용자 지정 심볼 매핑을 만듭니다.

wlanSymMap = [2 3 1 0 6 7 5 4 14 15 13 12 10 11 9 8];

데이터를 변조하고 단위 평균 신호 전력을 갖도록 성상도를 설정합니다. 성상도를 플로팅합니다.

y = qammod(x,16,wlanSymMap, ...
    UnitAveragePower=true, ...
    PlotConstellation=true);

Figure contains an axes object. The axes object with title 16-QAM, Custom Mapping, UnitAveragePower=true, xlabel In-phase Amplitude, ylabel Quadrature Amplitude contains 19 objects of type line, text. One or more of the lines displays its values using only markers

수신된 신호를 복조합니다.

z = qamdemod(y,16,wlanSymMap, ...
    UnitAveragePower=true);

복조된 신호가 원래 데이터와 동일한지 확인합니다.

isequal(x,z)
ans = logical
   1

고정소수점 QAM 신호를 복조하고 데이터가 올바르게 복구되는지 확인합니다.

변조 차수를 64로 설정하고 심볼당 비트 수를 결정합니다.

M = 64;
bitsPerSym = log2(M);

난수 비트를 생성합니다. 비트 모드에서 작업할 때 입력 데이터의 길이는 심볼당 비트 수의 정수 배수여야 합니다.

x = randi([0 1],10*bitsPerSym,1);

이진 심볼 매핑을 사용하여 입력 데이터를 변조합니다. 고정소수점 데이터를 출력하도록 변조기를 설정합니다. 숫자 데이터형은 16비트 워드 길이와 10비트 소수부 길이를 갖는 부호 있는 숫자입니다.

y = qammod(x,M,'bin', ...
    InputType='bit', ...
    OutputDataType=numerictype(1,16,10));

64-QAM 신호를 복조합니다. 복조된 데이터가 입력 데이터와 일치하는지 확인합니다.

z = qamdemod(y,M,'bin',OutputType='bit');
s = isequal(x,double(z))
s = logical
   1

AWGN에서 경판정 및 연판정 비터비 디코더의 비트 오류율(BER) 성능을 추정합니다. 이 성능을 코딩되지 않은 64-QAM 링크의 성능과 비교합니다.

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

rng default
M = 64;                % Modulation order
k = log2(M);           % Bits per symbol
EbNoVec = (4:10)';     % Eb/No values (dB)
numSymPerFrame = 1000; % Number of QAM symbols per frame

BER 결과 벡터를 초기화합니다.

berEstSoft = zeros(size(EbNoVec)); 
berEstHard = zeros(size(EbNoVec));

비율 1/2, 제약 길이(constraint length) 7, 컨벌루션 코드로 트렐리스 구조체와 역추적 깊이를 설정합니다.

trellis = poly2trellis(7,[171 133]);
tbl = 32;
rate = 1/2;

주 처리 루프에서는 다음 단계를 수행합니다.

  • 이진 데이터를 생성합니다.

  • 데이터에 컨벌루션 인코딩을 수행합니다.

  • 데이터 심볼에 QAM 변조를 적용합니다. 송신된 신호의 단위 평균 전력을 지정합니다.

  • 변조된 신호를 AWGN 채널에 통과시킵니다.

  • 경판정과 근사 LLR 방법을 사용하여 수신된 신호를 복조합니다. 수신된 신호의 단위 평균 전력을 지정합니다.

  • 경판정과 비양자화 방법을 사용하여 신호에 비터비 디코딩을 수행합니다.

  • 비트 오류 개수를 계산합니다.

while 루프는 100개의 오류가 발생하거나 107비트가 송신될 때까지 데이터를 계속 처리합니다.

for n = 1:length(EbNoVec)
    % Convert Eb/No to SNR
    snrdB = EbNoVec(n) + 10*log10(k*rate);
    % Noise variance calculation for unity average signal power
    noiseVar = 10.^(-snrdB/10);
    % Reset the error and bit counters
    [numErrsSoft,numErrsHard,numBits] = deal(0);
    
    while numErrsSoft < 100 && numBits < 1e7
        % Generate binary data and convert to symbols
        dataIn = randi([0 1],numSymPerFrame*k,1);
        
        % Convolutionally encode the data
        dataEnc = convenc(dataIn,trellis);
        
        % QAM modulate
        txSig = qammod(dataEnc,M, ...
            InputType='bit', ...
            UnitAveragePower=true);
        
        % Pass through AWGN channel
        rxSig = awgn(txSig,snrdB,'measured');
        
        % Demodulate the noisy signal using hard decision (bit) and
        % soft decision (approximate LLR) approaches.
        rxDataHard = qamdemod(rxSig,M, ...
            OutputType='bit', ...
            UnitAveragePower=true);
        rxDataSoft = qamdemod(rxSig,M, ...
            OutputType='approxllr', ...
            UnitAveragePower=true, ...
            NoiseVariance=noiseVar);
        
        % Viterbi decode the demodulated data
        dataHard = vitdec(rxDataHard,trellis,tbl,'cont','hard');
        dataSoft = vitdec(rxDataSoft,trellis,tbl,'cont','unquant');
        
        % Calculate the number of bit errors in the frame. 
        % Adjust for the decoding delay, which is equal to 
        % the traceback depth.
        numErrsInFrameHard = ...
            biterr(dataIn(1:end-tbl),dataHard(tbl+1:end));
        numErrsInFrameSoft = ...
            biterr(dataIn(1:end-tbl),dataSoft(tbl+1:end));
        
        % Increment the error and bit counters
        numErrsHard = numErrsHard + numErrsInFrameHard;
        numErrsSoft = numErrsSoft + numErrsInFrameSoft;
        numBits = numBits + numSymPerFrame*k;

    end
    
    % Estimate the BER for both methods
    berEstSoft(n) = numErrsSoft/numBits;
    berEstHard(n) = numErrsHard/numBits;
end

추정된 하드 및 소프트 BER 데이터를 플로팅합니다. 코딩되지 않은 64-QAM 채널의 이론적 성능을 플로팅합니다.

semilogy(EbNoVec,[berEstSoft berEstHard],'-*')
hold on
semilogy(EbNoVec,berawgn(EbNoVec,'qam',M))
legend('Soft','Hard','Uncoded','location','best')
grid
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')

Figure contains an axes object. The axes object with xlabel Eb/No (dB), ylabel Bit Error Rate contains 3 objects of type line. These objects represent Soft, Hard, Uncoded.

예상대로 연판정 디코딩이 최상의 결과를 생성합니다.

qamdemod 함수를 사용하여 OQPSK 변조 신호에 대한 연판정 출력값을 시뮬레이션합니다.

OQPSK 변조 신호를 생성합니다.

sps = 4;
msg = randi([0 1],1000,1);
oqpskMod = comm.OQPSKModulator( ...
    SamplesPerSymbol=sps, ...
    BitInput=true);
oqpskSig = oqpskMod(msg);

생성된 신호에 잡음을 추가합니다.

impairedSig = awgn(oqpskSig,15);

연판정 복조 수행하기

QPSK 등가 신호를 생성하여 동위상과 직교위상을 정렬합니다.

impairedQPSK = complex( ...
    real(impairedSig(1+sps/2:end-sps/2)), ...
    imag(impairedSig(sps+1:end)));

수신된 OQPSK 신호에 정합 필터링을 적용합니다.

halfSinePulse = sin(0:pi/sps:(sps)*pi/sps);
matchedFilter = dsp.FIRDecimator(sps,halfSinePulse, ...
    DecimationOffset=sps/2);
filteredQPSK = matchedFilter(impairedQPSK);

필터링된 OQPSK 신호에 소프트 복조를 수행하기 위해 qamdemod 함수를 사용합니다. qamdemod의 심볼 매핑을 comm.OQPSKModulator에서 사용한 심볼 매핑과 정렬한 다음 신호를 복조합니다.

oqpskModSymbolMapping = [1 3 0 2];
demodulated = qamdemod(filteredQPSK,4,oqpskModSymbolMapping, ...
    OutputType='llr');

입력 인수

모두 축소

QAM의 결과로 생성된 입력 신호로, 스칼라, 벡터, 행렬 또는 복소수 값으로 구성된 3차원 배열로 지정됩니다. 행렬과 3차원 배열의 각 열은 독립적인 채널로 간주됩니다.

데이터형: double | single | fi
복소수 지원 여부:

변조 차수로, 2의 양의 정수 거듭제곱으로 지정됩니다. 변조 차수는 신호 성상도의 점 개수를 지정합니다.

데이터형: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

심볼 순서로, 다음 옵션 중 하나로 지정됩니다.

  • 'gray' — 그레이 코드 순서를 사용합니다. 자세한 내용은 그레이 코드 항목을 참조하십시오.

  • 'bin' — 이진 코드 순서를 사용합니다.

  • 벡터 — 사용자 지정 심볼 순서를 사용합니다. 벡터는 길이가 M이어야 합니다. 벡터는 [0, (M – 1)] 범위의 고유한 요소 값을 사용해야 합니다. 첫 번째 요소는 성상도의 왼쪽 위 점에 대응되며, 그 다음 요소들은 왼쪽에서 오른쪽으로 열을 따라 내려갑니다.

데이터형: string | char | double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

이름-값 인수

선택적 인수 쌍을 Name1=Value1,...,NameN=ValueN으로 지정합니다. 여기서 Name은 인수 이름이고 Value는 대응값입니다. 이름-값 인수는 다른 인수 뒤에 와야 하지만, 인수 쌍의 순서는 상관없습니다.

R2021a 이전 릴리스에서는 쉼표를 사용하여 각 이름과 값을 구분하고 Name을 따옴표로 묶으십시오.

예: Z = qamdemod(Y,M,symOrder,'OutputType','bit')

단위 평균 전력으로 성상도를 스케일링하는 옵션으로, 숫자형 또는 논리값 0(false) 또는 1(true)로 지정됩니다.

  • true로 설정되면 함수는 성상도를 1옴을 기준으로 평균 전력 1와트로 스케일링합니다.

  • false로 설정되면 함수는 QAM 성상도 점이 최소 거리 2만큼 떨어져 있도록 성상도를 스케일링합니다.

출력값의 유형으로, 'integer', 'bit', 'llr' 또는 'approxllr'로 지정됩니다.

잡음 분산으로, 양의 스칼라 또는 양수 값으로 구성된 벡터로 지정됩니다. 이 인수를 각 값으로 설정할 경우 다음과 같습니다.

  • 양의 스칼라 — 모든 입력 요소에 동일한 잡음 분산 값이 사용됩니다.

  • 양수 값으로 구성된 벡터 — 벡터 길이는 입력 신호의 마지막 차원에 있는 요소 개수와 같아야 합니다. 벡터의 각 요소는 대응하는 마지막 차원을 따라 입력값의 모든 요소에 대한 잡음 분산을 지정합니다.

엄밀한 LLR 알고리즘은 유한 정밀도 연산방식을 사용하여 지수를 계산합니다. 크기가 매우 큰 양수나 음수가 포함된 계산일 경우 엄밀한 LLR 알고리즘은 다음과 같은 결과를 생성합니다.

  • 잡음 분산이 매우 큰 값인 경우 Inf 또는 -Inf

  • 잡음 분산과 신호 전력이 모두 매우 작은 값인 경우 NaN

근사 LLR 알고리즘은 지수를 계산하지 않습니다. 근사 LLR 알고리즘을 사용하면 Inf, -Inf, NaN 결과값이 생성되는 것을 피할 수 있습니다.

종속 관계

이 이름-값 쌍 인수를 사용하려면 OutputType'llr' 또는 'approxllr'로 설정하십시오.

성상도를 플로팅하는 옵션으로, 숫자형 또는 논리값 0(false) 또는 1(true)으로 지정됩니다. QAM 성상도를 플로팅하려면 PlotConstellation=true를 지정하십시오.

출력 인수

모두 축소

변조 출력 신호로, 스칼라, 벡터, 행렬 또는 3차원 배열로 반환됩니다. 데이터형은 입력 신호 Y와 동일합니다. 이 출력값의 값과 차원은 다음 표에 지정된 OutputType 값에 따라 다릅니다.

'OutputType'qamdemod의 반환 값출력값의 차원
'integer'[0, (M – 1)] 범위의 복조된 정수 값Z는 입력값 Y와 동일한 차원을 갖습니다.
'bit'복조된 비트Z의 행 개수는 Y의 행 개수의 log2(M)배입니다. 각 복조 심볼이 log2(M)비트의 그룹에 매핑됩니다. 여기서 첫 번째 비트는 최상위 비트(MSB)를 나타내고 마지막 비트는 최하위 비트(LSB)를 나타냅니다.
'llr'정확한 로그 가능도 알고리즘을 사용하여 계산된, 각 비트의 로그 가능도비 값. 자세한 내용은 Exact LLR Algorithm 항목을 참조하십시오.
'approxllr'각 비트의 근사 로그 가능도비 값. 값은 근사 로그 가능도 알고리즘을 사용하여 계산됩니다. 자세한 내용은 Approximate LLR Algorithm 항목을 참조하십시오.

세부 정보

모두 축소

그레이 코드

그레이 코드는 반사 이진 코드라고도 하며, 인접한 성상도 점의 비트 패턴이 1비트만 다른 시스템입니다.

확장 기능

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

버전 내역

R2006a 이전에 개발됨

모두 확장