ICIS 학부 연구생/통신시스템 설계
[ 통신시스템설계 ] 05-(3) 컨벌루션 코드 인코딩/디코딩하기
hanol02
2023. 8. 8. 19:45
05 ECC(Convolution Code).zip
0.00MB
my_function.zip
0.00MB
1. 코드
%% 컨벌루션 코드를 사용하여 이진 data 인코딩 & 디코딩하기
% 1. 입력 데이터가 convEncoder를 사용해 인코딩된다
% 2. 비터비 디코딩 알고리즘을 사용하여 디코딩된다
% 매개변수
constraintLength = 3; % 컨벌루션 코드의 제약길이 (시프트 레지스터의 길이)
codeRate = 1/2; % 부호율 (입력비트 당 출력비트의 비율)
msg = randi([0 1], 1, 10); % 이진 입력 데이터
% 컨벌루션 인코더 객체 생성
trellis = poly2trellis(constraintLength, [7 5]); % poly2trellis를 사용해 트렐리스 구조를 생성
convEncoder = comm.ConvolutionalEncoder('TrellisStructure', trellis);
% 입력 데이터 인코딩하기 .. 함수처럼 사용!!!
encodedData = convEncoder(msg');
% 비터비 디코더 객체 생성
vitDecoder = comm.ViterbiDecoder('TrellisStructure', trellis, ...
'InputFormat', 'Hard', 'TerminationMethod', 'Truncated', 'TracebackDepth', 2*constraintLength);
% 디코딩 (비터비 디코더를 사용)
decodedData = step(vitDecoder, encodedData);
% 결과 출력
disp('Original Message:');
disp(msg);
disp('Encoded Message:');
disp(encodedData');
disp('Decoded Message:');
disp(decodedData');
2. 결과
3. 분석
① trellis = poly2trellis(ConstraintLength, CodeGenerator, ReedbackConection)
: 컨벌루션 코드 다항식을 트렐리스 형식으로 변환한다.
- 설명: 속도가 k/n인 인코더에 대한 변환에 해당하는 트렐리스 구조 형식을 반환한다.
k는 입력 비트 스트림 수, n은 출력 연결 수
입력 인수 |
ConstraintLength | 제약 조건 길이(구속장) : 인코더에 대한 k개의 입력 각각에 대한 지연을 정의하는 1 x k 벡터로 지정됨 |
CodeGenerator | 코드 생성 다항식 : 8진수로 구성된 k x n 행렬. k개의 입력 각각에 대한 출력 연결을 지정하는 생성다항식을 지정 |
|
FeedbackConnection | 피드백 연결다항식 : k개의 입력 각각에 대한 피드백 연결을 정의하는 8진수 1 x k 행벡터 |
|
출력 인수 | trellis | 트렐리스 형식. 다음 필드가 있는 구조체로 반환된다. : numInputSymbols(입력 기호 수), numOutputSymbols(출력 기호 수), numStates(상태 수), nextStates(다음 상태), outputs(출력) |
** 코드에서 사용된 부분 ** trellis = poly2trellis(constraintLength, [7 5]); → constraintLength = 3 이므로 구속장 길이가 3이고 생성다항식이 7(=111), 5(=101)이라는 뜻이다. |
② comm.ConvolutionalEncoder
: 이진 데이터를 컨볼루션 방식으로 인코딩한다.
- 설명: 일련의 이진 입력 벡터를 인코딩하여 일련의 이진 출력 벡터를 생성한다.
- 속성
TrellisStructure | : 컨벌루션 코드의 트렐리스 설명 기본값은 poly2trellis(7, [171 133])이고 이런 식의 구조를 가짐. |
TerminatedMethod | : 인코딩된 프레임의 종료 방법 - continuous(기본값): 다음 입력 벡터와 함께 사용될 수 있도록 각 입력 벡터 끝에서 인코더 상태를 유지 - Truncated: 각 입력 벡터를 독립적으로 처리. 인코더 상태는 각 입력벡터의 시작 부분에서 재설정됨 - Terminated: 각 입력 벡터를 독립적으로 처리. 각 입력 벡터에 대해 객체는 추가 비트를 사용하여 인코더 상태를 벡터의 끝에서 모두 0 상태로 설정 |
** 코드에서 사용된 부분 ** convEncoder = comm.ConvolutionalEncoder('TrellisStructure', trellis); → 컨벌루션 코드의 트렐리스 구조가 trellis임을 의미함. → 전 코드를 보면 trellis = poly2trellis(constraintLength, [7 5]) 이므로 컨벌루션 코드의 트렐리스 구조가 구속장=3, 생성다항식 7,5임을 의미. encodedData = convEncoder(msg'); → comm.ConvolutionalEncoder를 사용할 땐 아래의 알고리즘을 따른다 1. 객체를 만들고 해당 속성을 설정한다. 2. 마치 함수인 것처럼 인수를 사용하여 객체를 호출한다. |
③ comm.ViterbiDecoder
: 비터비 알고리즘을 이용하여 컨볼루션 인코딩된 데이터를 디코딩한다.
- 설명: 컨볼루션 인코딩된 입력 기호를 디코딩한다.
트렐리스 구조에 의해 지정된 컨볼루션 인코딩 방식인 비터비 알고리즘을 사용하여 이진 출력 심볼을 생성한다?
TrellisStructure | : 컨벌루션 코드의 트렐리스 설명 기본값은 poly2trellis(7, [171 133])이고 이런 식의 구조를 가짐. |
InputFormat | : 디코더에 대한 입력 형식 - Unquantized(기본값): 입력 데이터가 실수 - Hard: 이진 입력 - Soft: 0,2 사이 정수? |
TermicatedMethod | : 인코딩된 프레임의 종료 방법 - continuous(기본값): 다음 입력 벡터와 함께 사용될 수 있도록 각 입력 벡터 끝에서 인코더 상태를 유지 - Truncated: 각 입력 벡터를 독립적으로 처리. 인코더 상태는 각 입력벡터의 시작 부분에서 재설정됨 - Terminated: 각 입력 벡터를 독립적으로 처리. 각 입력 벡터에 대해 객체는 추가 비트를 사용하여 인코더 상태를 벡터의 끝에서 모두 0 상태로 설정 |
TracebackDepth | : 역추적 깊이. 기본값=34 |
** 코드에서 사용된 부분 ** vitDecoder = comm.ViterbiDecoder('TrellisStructure', trellis, ...
'InputFormat', 'Hard', 'TerminationMethod', 'Truncated', 'TracebackDepth', 2*constraintLength);
→ 컨벌루션 코드의 트렐리스 구조가 trellis임을 의미. → trellis를 읽어오면 구속장=3, 생성다항식 7,5임을 알 수 있음 → 입력 형식 = Hard = 이진 입력을 의미
→ 종료 방법 = Trucated = 뒤에 나오는 0은 무시함
→ 추적 깊이 = 2*constraintLength로 제한됨
decodedData = step(vitDecoder, encodedData); |