ICIS 학부 연구생/통신시스템 설계

[ 통신시스템설계 ] 05-(2) Convolutional Code MATLAB

hanol02 2023. 8. 4. 21:19

목차

1. Convolutional Code란?

2. Convolutional Code 기능

3. Convolutional Code 의 다항식

4. 컨벌루션 코드 MATLAB 사용법


 

1. Convolutional Code란?

  • 출력 계열이 현재 뿐만 아니라 과거의 입력 계열에 의한 영향도 받아서 결정되는 장치
  • 즉 기억이 있는 장치
  • 오류 정정 능력이 아주 우수하다.

 

 

2. Convolutional Code 기능

  • 블록 코드와 달리 컨벌루션 코더는 기억장치이다.
  • 현재 입력 기호 집합뿐만 아니라 일부 이전 입력 기호(과거의 입력)에 따라 달라진다.

 

 

3. Convolutional Code 의 다항식

①  제약조건길이(구속장) 란?

: 출력에 영향을 주는 길이 

 

②  생성 다항식

  • 인코더 다이어그램에 k개의 입력과 n개의 출력이 있는 경우(위 그림과 같은 상황) 코드 생성기 행렬은 k x n 행렬이다.
  • i번째 행과 j번째 열의 요소는 i번째 입력이 j번째 출력에 기여하는 방식을 나타낸다.

ex. 제약조건길이가 5이고 생성 다항식이 35와 31인 인코더의 트렐리스를 계산하기

trellis = poly2trellis( 5, [ 35  31 ] );

 

③  생성 다항식 행렬 ( i , j ) 구하기

1. 이진수의 맨 왼쪽 지점은 현재 입력을, 맨 오른쪽 지점은 시프트 레지스터에 남아있는 가장 오래된 입력을 나타냄

2. 가장 오른쪽 비트부터 시작해서 연속 3개의 항    8진수로 표현

   ex. 위 그림에선 상위 가산기의 이진수 표현은 110/ 하위 가산기의 이진수 표현은 111

         110(2진수) 6(8진수) / 111(2진수) 7(8진수)

       즉, 생성 다항식 행렬은 [6 7]

       (세개씩 끊어서 읽되 필요에 따라 왼쪽 끝에 0 붙여도 됨)

str2num(dec2base(bin2dec('110'),8))
% 2진수 110을 8진수로 변환하기

 

채널코딩 수업 때 배운 그림(참고용)

 

 

 

④  피드백 연결 다항식

% 사ㅏㅏㅏㅏ실 잘 몰겠음

- 피드백 인코더를 나타내는 경우 피드백 연결 다항식의 벡터가 필요하다. (벡터의 길이 = 인코더 다이어그램의 입력 수)

- 피드백 연결 다항식의 벡터는 8진수 형식을 사용하여 각 입력에 대한 피드백 연결을 나타낸다.

- 방식: 2진수 표현으로 작성한 뒤 8진수 표현으로 변환한다

- 인코더에 피드백 구성이 있고, 체계적이면 체계적 비트에 해당하는 코드 생성기 = 피드백 연결 매개변수

 

 

 

 

 

⑤  피드백 컨벌루션 인코더에 트렐리스 구조 사용

* 피드백 = 출력이 다시 입력이 되는 거

** 위 그림과 같은 피드백을 가진 체계적 컨벌루션 인코더를 나타내는 트렐리스 구조 만들기

- 제약길이 = 5 / 생성기다항식 행렬 = [ 37 33 ] / 피드백 연결다항식 = 37

  첫번째 생성다항식 37(8진수)은 첫번째 출력이 체계적 비트이므로 피드백 연결다항식과 일치한다 (?)

 

- poly2trellis 함수를 이용하여 다항식을 트렐리스 구조로 변환해보자.

- 피드백 다항식과 함께 사용하면 입력에 피드백을 연결해준다.

trellis = poly2trellis( 5, [ 37  33 ], 37 );

% trellis = 구조체

              numInputSymbols: 2

              numOutputSymbols: 4

              numStates: 16

              nextState: [ 16x2 double ]

              Output: [ 16x2 double ]

 

 

 

data = randi( [ 0 1 ], 70, 1) ;
codedData = convenc(data, trellis);
tbdepth = 34;
decodedData = vitdec(codedData, trellis, tbdepth, 'trunc', 'hard');

% 임의의 이진 데이터 생성 후 지정된 트렐리스 구조를 사용하여 데이터를 컨벌루션 방식으로 인코딩한다

% 지정된 트렐리스 구조와 함께 비터비 알고리즘을 사용하여 코딩된 데이터를 디코딩한다

% tbdepth = 34는 추적 깊이, 잘린 작동 모드 및 어려운 결정에 사용된다 (?)

 

biterr( data, decodedData )

 

 

 

 

 

 

 

4. 컨벌루션 코드 MATLAB 사용법

< 컨벌루션 코드의 트렐리스 설명 >

 

 

# MATLAB으로 트렐리스 만들기

①  속도가 k/n인 컨벌루션 코드에 대한 트렐리스 구조의 필드

필드 의미 치수
nulInputSymbols 인코더에 대한 입력 심볼 수: 2k 스칼라
numOutputSymbols 인코더의 출력 심볼 수: 2n 스칼라
numStates 인코더의 상태 수 스칼라
nextStates 현재 상태와 현재 입력의 모든 조합에 대한 다음 상태 numState x 2^(k)
outputs 현재 상태와 현재 입력의 모든 조합에 대한 출력(8진수) numState x 2^(k)

 

② 트렐리스 구조 만드는 방법

: 각 필드에 넣을 정보를 알고나면 다음 방법으로 트렐리스 구조를 만들 수 있다.

- struct 명령으로 모든 필드 이름과 해당 값을 수집

% 위 그림에 대한 트렐리스 구조 생성 코드
s=struct('numInputSymbols', 2, ... % 입력심볼 = 0 or 1 = 2개
'numOutputSymbols', 4, ... % 출력심볼 = 0 1 2 3 = 4개
'numStates', 4, ... % 상태 수 = 00 01 10 11 = 4개
'nextState', [0 2; 0 2; 1 3; 1 3], ... % 다음 상태 = 00 -> 00,10 01 -> 00 10 ...
'output', [0 3; 1 2; 3 0; 2 1]); % 출력 = 화살표 위의 수

 

 

 

 


# 컨벌루션 코드 생성 및 디코딩

: convenc() 함수 / vitdec() 함수

① 컨벌루션 코드 Encoding