이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
qamdemod
직교 진폭 복조
설명
예제
8-QAM 신호 복조하기
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');
WLAN 심볼 매핑을 사용한 QAM 복조
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);
수신된 신호를 복조합니다.
z = qamdemod(y,16,wlanSymMap, ...
UnitAveragePower=true);
복조된 신호가 원래 데이터와 동일한지 확인합니다.
isequal(x,z)
ans = logical
1
QAM 고정소수점 신호 복조하기
고정소수점 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
경판정 및 연판정 비터비 디코딩의 BER 추정하기
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개의 오류가 발생하거나 비트가 송신될 때까지 데이터를 계속 처리합니다.
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')
예상대로 연판정 디코딩이 최상의 결과를 생성합니다.
연판정 OQPSK 변조-복조
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');
입력 인수
Y
— 입력 신호
스칼라 | 벡터 | 행렬 | 3차원 배열
QAM의 결과로 생성된 입력 신호로, 스칼라, 벡터, 행렬 또는 복소수 값으로 구성된 3차원 배열로 지정됩니다. 행렬과 3차원 배열의 각 열은 독립적인 채널로 간주됩니다.
데이터형: double
| single
| fi
복소수 지원 여부: 예
M
— 변조 차수
양의 정수
변조 차수로, 2의 양의 정수 거듭제곱으로 지정됩니다. 변조 차수는 신호 성상도의 점 개수를 지정합니다.
데이터형: double
| single
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
symOrder
— 심볼 순서
'gray'
(디폴트 값) | 'bin'
| 벡터
심볼 순서로, 다음 옵션 중 하나로 지정됩니다.
데이터형: 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')
UnitAveragePower
— 단위 평균 전력으로 성상도를 스케일링하는 옵션
false
또는 0
(디폴트 값) | true
또는 1
단위 평균 전력으로 성상도를 스케일링하는 옵션으로, 숫자형 또는 논리값 0
(false
) 또는 1
(true
)로 지정됩니다.
true
로 설정되면 함수는 성상도를 1옴을 기준으로 평균 전력 1와트로 스케일링합니다.false
로 설정되면 함수는 QAM 성상도 점이 최소 거리 2만큼 떨어져 있도록 성상도를 스케일링합니다.
OutputType
— 출력값의 유형
'integer'
(디폴트 값) | 'bit'
| 'llr'
| 'approxllr'
출력값의 유형으로, 'integer'
, 'bit'
, 'llr'
또는 'approxllr'
로 지정됩니다.
NoiseVariance
— 잡음 분산
1
(디폴트 값) | 양의 스칼라 | 양수 값으로 구성된 벡터
잡음 분산으로, 양의 스칼라 또는 양수 값으로 구성된 벡터로 지정됩니다. 이 인수를 각 값으로 설정할 경우 다음과 같습니다.
양의 스칼라 — 모든 입력 요소에 동일한 잡음 분산 값이 사용됩니다.
양수 값으로 구성된 벡터 — 벡터 길이는 입력 신호의 마지막 차원에 있는 요소 개수와 같아야 합니다. 벡터의 각 요소는 대응하는 마지막 차원을 따라 입력값의 모든 요소에 대한 잡음 분산을 지정합니다.
팁
엄밀한 LLR 알고리즘은 유한 정밀도 연산방식을 사용하여 지수를 계산합니다. 크기가 매우 큰 양수나 음수가 포함된 계산일 경우 엄밀한 LLR 알고리즘은 다음과 같은 결과를 생성합니다.
잡음 분산이 매우 큰 값인 경우
Inf
또는-Inf
잡음 분산과 신호 전력이 모두 매우 작은 값인 경우
NaN
근사 LLR 알고리즘은 지수를 계산하지 않습니다. 근사 LLR 알고리즘을 사용하면 Inf
, -Inf
, NaN
결과값이 생성되는 것을 피할 수 있습니다.
종속 관계
이 이름-값 쌍 인수를 사용하려면 OutputType
을 'llr'
또는 'approxllr'
로 설정하십시오.
PlotConstellation
— 성상도를 플로팅하는 옵션
false
또는 0
(디폴트 값) | true
또는 1
성상도를 플로팅하는 옵션으로, 숫자형 또는 논리값 0
(false
) 또는 1
(true
)으로 지정됩니다. QAM 성상도를 플로팅하려면 PlotConstellation=true
를 지정하십시오.
출력 인수
Z
— 변조 출력 신호
스칼라 | 벡터 | 행렬 | 3차원 배열
변조 출력 신호로, 스칼라, 벡터, 행렬 또는 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++ 코드를 생성할 수 있습니다.
GPU 배열
Parallel Computing Toolbox™를 사용해 GPU(그래픽스 처리 장치)에서 실행하여 코드 실행 속도를 높일 수 있습니다.
이 함수는 GPU 배열 입력을 지원합니다. 자세한 내용은 GPU에서 MATLAB 함수 실행하기 (Parallel Computing Toolbox) 항목을 참조하십시오.
버전 내역
R2006a 이전에 개발됨R2023b: GPU 배열 지원이 추가됨
qamdemod
함수가 GPU(그래픽스 처리 장치)에서 코드를 실행하기 위해 gpuArray
(Parallel Computing Toolbox) 객체를 처리하는 기능을 추가로 지원합니다.
R2018b: 초기 위상 입력이 제거됨
R2018b부터는 더 이상 qamdemod
함수를 사용하여 QAM 성상도의 초기 위상을 오프셋할 수 없습니다.
대신 genqamdemod
함수를 사용하여, 복조되는 QAM 신호의 초기 위상을 오프셋하십시오. 또는 다음 코드처럼 qamdemod
의 변조 입력값에 원하는 초기 위상을 곱할 수도 있습니다.
Z = qamdemod(Y.*exp(-1i*initPhase,M))
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)