WAVE FILE의 구조
WAVE 파일은 사운드 파일중에 한 형식으로 윈도우에서 가장 흔하게 쓰이는 파일중에 하나이다. 이번에 이 유령넘이 강좌?랍시고 주절 거리는 내용은 이넘의 WAVE 파일을 한번 재생해 보자..는 것이다. WAVE 파일을재생하는데는, 쉽게는 SoundPlay() 함수였던가? .. 한줄이면 족하다...
물론, 지금 이 강좌는 그렇게 한줄이면 끝나는 정도가 아닌, WAVE 파일의 밑바닥부터 꼭대기까지 샅샅히 훑어 내려가며, 그 내부를 마구 파헤쳐 WAVE 파일을 맘대로 주무를 수 있도록 하는 경지?에까지 도달하도록하는것이 목표다.
일단, WAVE 파일이고 머고 간에, 기본적인 공식?부터 알아보고 넘어가도록 하자.사운드라는 것에 대해 깊이 있는 지식을 가지고 있는 사람은
볼 필요가 없겠지만, 어디까지나 처음 시작하는 사람들이 볼 것 이라고가정하고 설명하도록 한다.
WAVE 파일을 재생하면서 가끔 등록정보를 보신 분들은 알겠지만, 대게WAVE 파일의 등록정보라고 하면, 16 Bit , Stereo , 44.1 kHz... 등등
의 정보가 보일것이다. 이게 뭐가 중요하냐고? 중요하다.. 정말 중요하다. 이것으로 WAVE 파일이 시작되는 것이기 때문이다.예를 들어서 다음
과 같은 WAVE 파일이 하나 있다고 보자.
------------------------------------------------------------------
[어떤 WAVE 파일의 등록정보]
- 곡명 : 유령이라 불러라!
- 16 Bit
- Stereo
- 44.1 khz
------------------------------------------------------------------
이 세가지 정보면 WAVE 파일의 모든 것?을 알 수 있다. 일단 이 3가지기본적인 정보만으로 이 WAVE 파일의 초당전송량(Bit/Second)이나,전체
재생시간등을 계산해 보자. (이거 배워두면 정말 좋다..-_-;;..그냥..)
일단 계산하는 방식은 모두 곱한다. 16 Bit 이므로 16 을 곱하고,스테레오 방식이기 때문에 (스테레오는 채널이 2개 이기때문에, 2를 곱한다
당연히 모노는 1채널이기 때문에 1을 곱하면 된다.... 1은 안곱해도 되는구나 --;) 그리고 44.1 kHz 라는 것은 1초에 44100 번 발광을 한다는
소리니까 44100을 곱하면 된다.
16 * 2 * 44100 = 1411200 Bit 다.. 다시 바이트로 고쳐주려면, 나누기 8을 하면 된다. (왜 나누기 8을 하냐고 묻는다면.. 아시다시피.. 8 Bit
는 1 Byte 이기 때문이다..) 나누기 8을 한 결과 176400 이라는 숫자가나왔다.
즉, 이 WAVE 파일은 초당 176400 Byte 의 용량을 전송한다는 얘기다..숫자가 너무 크다고?.. 다시 KByte로 환산해 보자.. 172.265625가 나오
는데,귀찮으니까 소수점 아랫것들은 잘라버리고 정수부분만 읽어보자면172 KB 라고 나올 것이다. 그렇다. 이 WAVE 파일은 1초에 172 KB 나 차
지한다. (더럽게 크구만..) 전체 재생시간을 구하는 것 역시 간단하다.단순히 나누기만 하면 되기 때문이다. 전체 파일 크기를 알고 있다면,
" 전체 파일 크기 / 초당 용량 = 전체 재생 시간 (초 단위) "
라는 공식이 성립되는 것이다.자,이제 자신의 컴퓨터에 들어있는 WAVE들을 모조리 불러다가 그 넘들의 재생시간을 구해보고 실제로 플레이
해본다음 비슷하게 맞는지 비교해 보라.
------------------------------------------------------------------
여기서, 숙제.. 다음의 WAVE 파일들의 전체 크기는 얼마나 될까??????
[1] 8 Bit , Mono , 22 kHz
[2] 16 Bit , Mono , 11 kHz
[3] 16 Bit , Stereo , 22 KHz
각각의 WAVE 파일들의 재생시간은 총 1분 30초씩 이다. 그렇다면 각각의 WAVE 파일들의 전체 파일크기는 얼마나 될까?? ( 대한민국 초등교육
과정을 이수한 사람이라면 누구나 풀 수 있는 문제라서 풀이는 생략..)
------------------------------------------------------------------
WAVE 파일은 대게 8 Bit , 16 Bit 가 많이 쓰이는데, 24, 32 Bit 파일은 별도로 치고.. 대표적인 8 / 16 Bit 파일들은 아래의 그림처럼 파일
에 저장되어 있다. 8 Bit 라면 - 1 Byte 이므로 1 Byte 단위 마다 저장되어 있고, 16 Bit 라면 당연히 2 Byte 마다 저장되어 있다. 아래 그림
을 보면 8 Bit 파일은 전부 16개 (16진수 10까지..) 로 되어 있는 반면 16 Bit 는 같은 크기인데도 8 칸 밖에는 안된다. 이론적으로 16 Bit 는
8 Bit 에 비해 2 배의 용량을 차지하기 때문이다. [ D ] 라고 표기되어있는 것은 본인이 편의상 구분하기 쉽게 [ DATA ] 를 줄여 표현한 것이
고.. ( Mono 는 L / R 구분이 없다 ) Stereo에서 [ L ] , [ R ] 이라고
표기 한 것은 양 채널 ( Left Channel, Right Channel ) 을 뜻 한다...
------------------------------------------------------------------
[ 8 Bit Mono ]
1 2 3 4 5 6 7 8 9 A B C D E F 10
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
: D : D : D : D : D : D : D : D : D : D : D : D : D : D : D : D :
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
[ 8 Bit Stereo ]
1 2 3 4 5 6 7 8 9 A B C D E F 10
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
: L : R : L : R : L : R : L : R : L : R : L : R : L : R : L : R :
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
[ 16Bit Mono ]
1 2 3 4 5 6 7 8
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
: D : D : D : D : D : D : D : D :
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
[16Bit Stereo ]
1 2 3 4 5 6 7 8
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
: L : R : L : R : L : R : L : R :
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
------------------------------------------------------------------
이건 어디까지나 2 채널(Stereo)방식만을 봤을때 그렇다는 것이고, 채널이 많아지면 또 저장구조는 당연히 달라지게 된다. 요즘 흔히 말하는
5.1채널이니 7.1채널이니 하는 것들은, 저것과는 모양새가 또 다르다..
------------------------------------------------------------------
WAVE 파일에 대해서 간략하게나마 알아봤는데,이제부터는 정말 자세히파헤쳐 볼 시간이다. WAVE 파일들은 크게 청크 부분과 데이타 부분으로
나뉜다. 실제 사운드가 들어있는 데이타 부분 앞에는 헤더 청크 부분이있는데, WAVE 파일의 구조를 살펴보면 아래와 같다.
------------------------------------------------------------------
1. Wave 파일 포맷(I)
1) PCMWAVEFORMAT 구조체의 구조
-. WAVEFORMAT wf;
-. WORD wBitsPerSample;
2) WAVEFORMAT 구조체의 구조
-. WORD wFormatTag;
-. WORD nChannels;
-. DWORD nSamplesPerSec;
-. DWORD nAvgBytesPerSec;
-. WORD nBlockAlign;
3) 예 : 22kHz 샘플링된 8bit 스테레오 Wave 파일의 구조
PCMWAVEFORMAT PcmWaveFormat;
PcmWaveFormat.wf.wFormatTag = 1;
PcmWaveFormat.wf.nChannels = 2;
PcmWaveFormat.wf.nSamplesPerSec = 22050;
PcmWaveFormat.wf.nAvgBytesPerSec = 44100;
PcmWaveFormat.wf.nBlockAlign = 2;
PcmWaveFormat.wBitsPerSample = 8;
2. Wave 파일 포맷(II)
------------------------------------------------------------------
데이터형 Byte 내용 의미
------------------------------------------------------------------
1) RIFF chunk
- Char 4 "RIFF" 파일의 종류가 RIFF 파일을 의미
- DWORD 4 FILE SIZE 현재부터 끝까지의 파일크기
(파일크기-4Byte 또는, 데이터 크기
+40Byte)
- Char 4 "WAVE" Wave 파일을 의미
2) FMT sub-chunk
- Char 4 "fmt " FMT sub-chunk의 시작
- DWORD 4 16 현재 포인터(16 Byte)
- short 2 wFormatTag PCMWAVEFORMAT의 값
( 1:Wave Format이 PCM 방식 )
- short 2 nChannels 채널 수 ( 1:모노, 2:스테레오 )
- DWORD 4 nSamplesPerSec 샘플링 수
( 11kHz:11025,
22kHz:22050,
44kHz:44100 )
- DWORD 4 nAvgBytesperSec 초당 샘플바이트
( nSamplesPerSec*BlockAlign )
- short 2 BlockAlign 샘플당 바이트( nChannels*비트/8 )
- short 2 wBitsPerSample 샘플당 비트수
3) Data sub-chunk
- Char 4 "data" 데이터청크의 시작
- DWORD 4 DATA SIZE 데이터의 크기
DATA 데이터
------------------------------------------------------------------
WAVE 파일들을 EDITOR 로 읽어보면 파일의 내용이 아래와 같이 나온다원래는 HEX 값이 나와야 하는데 메모장으로 읽어들였더니..아래처럼 나
왔다.. -_-; 그래도 상관없다. 중요한건 제일 처음 " RIFF " 라는 단어로 시작한다는 것이다. 그 다음에 WAVE 파일 포맷임을 알리는 " WAVE "
라는 단어가 온다. 보통 파일포맷에 따라 헤더에 해당 파일포맷임을 리는 식별자가 오는데 GIF나 PCX, 또는 EXE 파일들을 한번씩 열어 보면
같은 단어로 시작한다는 것을 알 수 있을 것이다.
[1] RIFF$?WAVEfmt D쵆Xdata? ...
[2] RIFF?$WAVEfmt D??data? ...
[3] RIFF? WAVEfmt D ? PAD ?
------------------------------------------------------------------
3 개의 WAVE 파일들을 열어봤는데, 모두 RIFF .. WAVE .. fmt 로 시작하고 있다.이 파일들이 WAVE 파일임을 알 수 있는 것이다. 사실 WAVE파
일에도 ADPCM 이니 PCM 이니 하는 식으로 다양한?포맷이 존재하는데 이
것은 쉽게 생각하면 압축방식의 차이다. 여기서 RIFF 파일 형식이라는
말이 나오는데, RIFF에 대해서 설명하자면..
------------------------------------------------------------------
[ RIFF 파일(Resource Interchange File Format) ]
------------------------------------------------------------------
음성이나 비디오 같은 유의 데이터들은 용량이 매우 크기 때문에 이를저장할 시에는 비트 단위보다는 블록 단위로 저장을 하게 된다.
이러한블록은 가변적인 크기를 가질 수 있는데 이를 위해서는 데이터 블록 앞에 헤더를 사용해 이를 정의해 주어야 한다. 일례로
10 MByte 의 음성
데이터를 파일에 저장 하려할 때 블록 단위로 하지 않으면 데이터를 불러오는데 10M의 메모리가 필요하게 된다. 이렇게 된다면 불러오기도 힘
들 뿐만 아니라 불러오는데 걸리는 시간이 많이 걸리는 단점이 생긴다.그러나 10M의 음성데이터를 0.5M 씩 블록으로 나누어 저장한다면 20 개
의 블록을 가질 것이다. 즉, 0.5M씩 메모리에 불러온 후 출력하고, 메모리를 해제한 후 다시 다음 블록을 불러오면 그만큼 메모리도 절약 할
수 있어 매우 편리하게 된다. 또한 데이터 저장 블록 앞에 블록의 데이터 크기를 넣어주는데, 이는 예를 들자면 어느 시간동안 모노로 듣다가
후에 스테레오로 들을 수 있는 상황 등에 대처하기 쉽다. 이럴 때 데이터 블록 앞에 데이터에 대한 정보를 만들어 준다. 각각의 부분 하나 하
나는 청크(Chunk)라고 하고 처음에 나오는 상자를 부모 청크,그 하단에위치하는 부분을 자식 청크, 데이터들은 데이터 청크라고 한다.이와 같
은 구성 데이터를 저장하는 방식을 RIFF라 하고 위와 같은 구성으로 저장된 데이터를 RIFF 파일이라 한다. WAVE 파일이나 AVI 파일이 바로
RIFF 파일이다.
기타
다음으로 알아두면 앞으로 강좌를 이해하기에 좋을 압축방식들에 대한정보들을 소개한다.
[ PCM(Pulse Code Modulation) 방식 ]
이 방식은 가장 널리 사용되는 방식으로서 음성을 아날로그에서 디지털로 변환하여 양자화(작은 단위화)한 데이터를 그대로 저장한 후 재생할
때에는 그 데이터를 디지털에서 아날로그로 재변환하여 음성 파형을 만든다. 이 방식은 양자화를 할 때 생기는 오차가 존재하지만 재생 시 상
당히 우수한 품질을 가진다.이 방식의 특징은 제로 크로스의 방법에 비해 생성되는 데이터의 양이 많다는 점이다.예를 들어, 샘플링 주파수를
8Khz로 하고 양자화 시 정밀도를 8bit로 하면 8000 * 8 = 64000/sec = 64Kbit/sec로 초당 64KB가 생성된다. 그러나 최근에는 메모리의 가격이
많이 떨어지고 있어서 뛰어난 음성 품질을 보장할수 있는 PCM방식을 많이 사용하고 있다.
[ DM(Delta Modulation) 방식 ]
DM 방식은 제로 크로스 방식과 PCM 방식의 중간적인 형태로 볼 수 있다이 방식은 어느 시점n의 파고와 바로 전 시점 (n-1)의 파고를 비교하여
그 차이점을 1,0,-1로 표현한다. DM 방식의 단점은 원파형의 급격한 변화를 따라가지 못한다는 것이다. DM 방식의 하드웨어 구현은 바로 이전
값에 1 또는 -1을 더하기만 하면 되므로 아주 간단하다.
[ DPCM(Differencial PCM) 방식 ]
우리의 음성 파형을 실제로 보면, 서로 인접한 샘플링 시점의 비교에서파형이 크게 변하지 않는다. 이점에 착안하여 만든 방식이 DPCM 방식이
다. DPCM 방식은 개선된 PCM 방식이라 할 수 있다. 즉, PCM 방식은 파고 값을 그대로 저장하지만 DPCM 방식은 이전의 값과의 차이만을 저장
하는 것이다. 음성의 파형이 크게 변하지 않으므로 차이값도 작아져서 bit-rate를 낮출 수 있다.
[ ADPCM(Adaptive Differencial PCM) 방식 ]
ADPCM 방식은 위의 여러 가지 방식의 단점을 보완한 것이다. DM 방식이나 DPCM 방식은 압축된 비트수로 표현 되는 최대의 변화량이 실제 파형
의 변화량보다 작기 때문에 실제로 구현하면 재생 파형이 원 파형의 급격한 변화를 나타내지 못한다. 이를 막기 위하여 양자화할때 시간 간격
을 작게 하면 bit-rate를 증가시키는 결과를 가져오게 된다.ADPCM 방식은 파형의 변화량이 급격히 변할 때는 양자화 할 때의 단위를 크게하여
차분값을 이용하는 것으로 파형의 진폭이 클경우 약간의 잡음이 있어도 사람이 잘 감지하지 못하는 점을 이용한 것이다.
- 출처 : 까먹었네요..하하;;^^ -
|