본문 바로가기
Audio Processing

신호처리와 숫자 표현(2)-숫자의 비트 표현

by gigasound 2021. 8. 17.

숫자의 비트 표현 

신호처리는 최종적으로 정수(integer)와 실수 형식을 사용하고 실수는 고정 소수점 방식과 부동 소수점 방식을 사용합니다. 그런데 숫자를 DSP의 신호처리 연산을 위해서는 비트(bit) 형식으로 표시할 필요가 있습니다. 이 글에서는 정수와 소수의 비트 표현을 알아보겠습니다. 여기서 숫자 뒤의 강호는 숫자의 진법을 의미합니다.


정수의 비트 표현

10진수의 정수 표현은 잘 알려진 것과 같이 정수를 2로 나누면서 나머지를 모으면 쉽게 구해집니다. 

 


소수의 비트 표현 

실수에서 정수 부분이 위의 정수 비트 표현을 사용하면 됩니다. 실수의 소수 부분은 아래와 같이 2를 계속 곱하고 정수 부분을 모아서 표현합니다. 다음은 0.33의 소수 표현입니다.

그런데 0.33은 2진법으로 표현하면 무한히 소수 부분이 진행됩니다. 이상하죠 0.33은 무한 소수가 아니지만 2진법으로 표현하면 무한 소수처럼 돼버립니다. 이로 인해 유한한 메모리로 소수를 표현해야 하는 DSP에서 오류를 발생하는 원인이 됩니다.  


음수의 표현

우리가 사용하는 숫자는 앞에 '-' 표시를 하여 숫자가 음수임을 알립니다. 그런데 신호처리용 숫자의 표현에는 다음과 같이 2의 보수를 사용합니다. 이를 위해서는 숫자를 먼저 비트로 표시해야 합니다. 그러면 최 상위 비트는 무조건 1로 표시됩니다. 


고정 소수점의 표현

실수를 고정 소수점으로 표시하는 방법에 대해 알아보겠습니다. 고정 소수점은 &8\cdot 4=32bit(4byte)&만으로 정수부 분과 실수 부분으로 모두 포함해서 표시해야 합니다. 그래서 고정 소수점 방식의 정수 부분과 소수 부분으로 표시 가능한 숫자가 제한됩니다. 

고정 소수점 방식은 실수를 정수부와 소수부를 분리하고 이를 IEEE754의 Qm.n형식으로 표현합니다. 여기서 m은 정수 부분의 비트 길이, n은 소수 부분의 비트 길이입니다. 일반적으로 Q8.23이 사용되고 1bit는 부호 전용으로 사용합니다. IEEE 754에 의해 64bit 형식을 사용할 수도 있지만, 오디오의 실수 표현은 32bit 정수 표현은 16bit를 사용합니다.

고정 소수점으로 0.0를 표현

그냥 0x0000 0000은 0.0으로 표시됩니다.

고정 소수점으로 1.0 표현

정수부는 1b, 소수분 0.0b가 됩니다. 이를 Q8.23 형태로 비트로 구현하면 다음과 같습니다. 아래 내용은 32bit에서 앞의 16bit 부분만 표시한 것입니다. 1.0f = 0x0080 0000이 됩니다. 이는 메모리에서 보이는 값입니다. 

위치 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
bit 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
byte 0x00 0x80

2.33f의 고정 소수점 표현

정수 부분은 2f=10b, 소수 부분은 0.33f=0.01010 1011...b가 됩니다. 이를 Q8.23의 비트로 표시하면 다음과 같습니다. 그러므로 2.33f = 0x012A 3D70으로 메모리에 기록됩니다. 

위치 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
bit 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0
byte 0x01 0x2A

-2.33f의 부동 소수점 표시는 2.33f를 비트 반전하고 1을 더하면 됩니다. 그러면 0x012A 3D70의 비트 반전 0xFED5 C28F에 1을 더한 0XFED5 C290이 됩니다. 


부동 소수점의 표현

부동 소수점의 Q8.23은 숫자를 지수부(exponent)와 가수부(mantissa)로 표시하여 구합니다. 이를 실수를 정규화한다고 합니다. 즉 맨 앞을 1b가 되도록 숫자를 무조건 조정합니다. 그리고 여기에 바이어스 127을 더해서 비트로 표시합니다. 

$$\pm 1b.(mantissa)b\cdot 2^{exponent}$$

0.0f의 부동 소수점 표현

위의 정규화를 통해 표현이 불가능합니다. 그러니 0x0000 0000 = 0.0f으로 사용합니다.

1.0f의 부동 소수점 표현

1.0f의 정규식은 다음과 같이 표시됩니다. 즉 지수부는 0, 가수부는 0b가 됩니다.  

$$1=1.0b\cdot2 ^{0}$$

지수부 + 127 = 0111 1111b, 가수부는 0b입니다. 이를 비트로 표시하면 다음과 같습니다. 그러면 0x3F80 000이 메모리에 기록됩니다. 

위치 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
bit 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0
byte 0x3F 0x80

-1.0f의 부동 소수점 표현

-1.0f의 정규식은 다음과 같습니다.

$$-1.0=-1.0b\cdot 2^{0}$$

지수부에 바이어스 127을 추가하고, 음수 비트를 추가하면 다음과 같습니다. 그러므로 0xBF80 0000이 메모리에 기록됩니다. 

위치 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
bit 1 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0
byte 0xBF 0x80

 

다른 글에서 좀더 다뤄보겠습니다. 


광고좀 꾹 눌러주시면 고맙겠습니다. 


위의 내용을 참조용으로만 사용해주세요, 무단 도용이나 무단 복제는 불허합니다.

기타 문의 사항은 gigasound@naver.com에 남겨 주시면 고맙겠습니다.