PromleeBlog
sitemap
aboutMe
Menu
Welcome to
✨ Promlee Blog ✨
View 📈
Total: -
Today: -
추천 포스트
개인학습
기타
소스 및 채널 코딩
소스 코딩
소스 코딩
Source Coding
📅
개요
데이터 압축을 위한 소스 코딩 체계
접두사 코딩
* 허프먼 코딩
허프먼 코딩 알고리즘
허프먼 코드의 특징
허프먼 트리 구성 예시
개요 (Introduction)
🔗
소스 심볼은
이진수
로 인코딩 되어야 한다.
평균 코드 길이는 최소화되어야 한다.
중복 제거
→
\rightarrow
→
비트율 감소
알파벳에 기반한 이산 무기억 소스 고려 :
S
=
{
s
0
,
s
1
,
…
,
s
k
}
S = \{s_0, s_1, \ldots, s_k\}
S
=
{
s
0
,
s
1
,
…
,
s
k
}
s
i
s_i
s
i
의 확률:
p
i
p_{i}
p
i
s
i
s_i
s
i
의 코드 길이:
l
i
l_i
l
i
평균 코드 길이(심볼 당 평균 비트 수):
L
=
∑
k
=
0
K
−
1
p
k
⋅
l
k
L = \sum_{k=0}^{K-1} p_k \cdot l_k
L
=
∑
k
=
0
K
−
1
p
k
⋅
l
k
L
L
L
의 최소한 가능한 값:
L
m
i
n
L_{min}
L
min
소스의 코딩 효율성:
η
=
L
m
i
n
L
\eta=\frac{L_{min}}{L}
η
=
L
L
min
데이터 압축
전송 전에 중복 정보 제거
손실 없는 데이터 압축
이산 무기억 소스(discrete memoryless source)의 출력을 나타내는 소스코드는 유일하게 복호화 가능
데이터 압축을 위한 소스 코딩 체계(Source Coding Schemes for Data Compression)
🔗
접두사 코딩(Prefix Coding)
🔗
다른 코드의 접두어가 아닌
가변 길이 소스 코드
접두사 코드의 특성
접두사 코드는 유일하게 복호화 가능
접두사 코드의 역은 항상 참이 아님 → 모든 유일하게 복호화할 수 있는 코드가 접두사 코드인 것은 아님
예시 (접두사 코드)
🔗
심볼
발생 확률
코드 I
코드 II
코드 III
s0
0.5
0
0
0
s1
0.25
1
10
01
s2
0.125
00
110
011
s3
0.125
11
111
0111
Code1: 접두사 코드 X
Code2: 접두사 코드 O
Code3: 유일하게 복호화 가능 but 접두사 코드 X - 다음 코드의 시작을 구분하기 힘들다
ex) Code2
0101110111 -> 0/10/111/0/111 -> unically decodable(유일하게 복호화 가능)
결정 트리
임의의 심볼
s
k
s_k
s
k
는 확률
p
k
=
2
−
l
k
p_k=2^{-l_k}
p
k
=
2
−
l
k
로 발생
확률들의 총합:
1
=
∑
k
=
0
K
−
1
p
k
=
∑
k
=
0
K
−
1
2
−
l
k
1 = \sum_{k=0}^{K-1} p_k = \sum_{k=0}^{K-1} 2^{-l_k}
1
=
∑
k
=
0
K
−
1
p
k
=
∑
k
=
0
K
−
1
2
−
l
k
평균 코드 길이:
L
=
∑
k
=
0
K
−
1
p
k
⋅
l
k
=
∑
k
=
0
K
−
1
2
−
l
k
⋅
l
k
L = \sum_{k=0}^{K-1} p_k \cdot l_k = \sum_{k=0}^{K-1} 2^{-l_k} \cdot l_k
L
=
∑
k
=
0
K
−
1
p
k
⋅
l
k
=
∑
k
=
0
K
−
1
2
−
l
k
⋅
l
k
* 허프먼 코딩 (Huffman Coding)
🔗
⭐
중요
⭐
허프먼 코딩 알고리즘
🔗
데이터 압축에 자주 사용되는 방법으로, 자주 등장하는 기호에는 짧은 부호를 할당하고 드물게 등장하는 기호에는 긴 부호를 할당하여
데이터를 압축
한다.
기호 확률을 감소하는 순서로 배열 후 트리의 리프 노드로 간주
노드가 하나 이상 남을 때 까지 다음을 반복
가장 낮은 확률을 가진 두 노드를 선택 후 가장 낮은 노드에는 0, 높은 노드에는 1을 할당(반대도 가능, but 일관적이어야 함)
두 노드를 병합하여 하나의 노드 생성, 그 확률은 두 노드의 확률의 합이 됨
1단계로 돌아가기
각 기호에 대해, 리프 노드에서 트리의 루트까지의 경로를 따라 이진 코드 생성
리프 노드의 비트는 부호어(codeword)의 마지막 비트가 된다.
허프먼 코드의 특징
🔗
접두사 코드
각 기호의 부호어 길이는 전달하는 정보의 양과 대략 같다
확률 분포가 알려지고 정확할 경우, 허프먼 코드는 매우 효과적임
분산은 부호어 길이의 변동성을 측정하는 것
σ
2
=
∑
k
=
0
K
−
1
p
k
(
l
k
−
L
‾
)
2
\sigma^2 = \sum_{k=0}^{K-1} p_k (l_k - \overline{L})^2
σ
2
=
∑
k
=
0
K
−
1
p
k
(
l
k
−
L
)
2
오류를 피하고자
분산이 큰
허프먼 트리를 선택
→ 분산이 높은 트리는 부호의 길이가 더 다양하므로 오류를 더 잘 처리할 수 있다.
허프먼 트리 구성 예시 (Example of Huffman Tree Construction)
🔗
두 트리 모두 같은 평균 길이를 가지지만
분산
은 다르다.
분산이 높은 트리는 오류를 더 잘 처리할 수 있다.