C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 강좌/문서
C++Builder Programming Tutorial&Docments
[112] Wave파일의 구조를 알아보자.
조성택, 클라인 [whtjdxor] 30988 읽음    2006-09-15 17:55
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 방식은 파형의 변화량이 급격히 변할 때는 양자화 할 때의 단위를 크게하여

차분값을 이용하는 것으로 파형의 진폭이 클경우 약간의 잡음이 있어도 사람이 잘 감지하지 못하는 점을 이용한 것이다.
- 출처 : 까먹었네요..하하;;^^ -

+ -

관련 글 리스트
112 Wave파일의 구조를 알아보자. 조성택, 클라인 30988 2006/09/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.