WAV 파일을 사용하는 이유
기본적인 wav 파일 형식은 비교적 용량이 크다는 특징이 존재합니다.이는 즉 압축되지 않는 포맷이라는 것이고, 프로그래밍을 할 때 별도 압축 해제 작업을 해줄 필요 없이 바로 가져와 처리를 해주면 된다는 장점이 존재합니다.물론 wav 라고 해서, 다 같은 wav 포맷이 아니라, 내부 컨테이너가 해서 따로 WAVE 형태인지, 다른 형태인지 등... 구성 사항이 나뉘는 것 같긴 하나, 기본적으로 우리가 오디오 편집 프로그램에서 wav PCM 16 bit로 저장하는 건 PCM 데이터가 들어가는 오디오 파일입니다. 여기서 언급하는 wav는 WAVE 형태인 16bit - PCM 데이터가 들어가는 오디오 PCM 데이터로 간주하겠습니다.WAV 재생하기
기본적으로 wav 파일은 헤더 부분과 데이터 부분이 존재 합니다.헤더 부분에는 오디오 파일의 크기에 대한 정보들, 데이터 부분에는 raw 데이터인 PCM 데이터가 담겨 있습니다. raw 데이터는 소리 신호를 의미하는 데이터이기에 RAW 데이터만으로도 소리를 재생할 수 있지만,소리 파일이 어느 크기로 구성되어 있는지, 얼마만큼 세분화되어 있는지 알 수 없기에 정확하게 의도한대로 재생할 수 없다는 문제가 발생합니다.즉, 헤더 없이 재생을 하더라도, 원본에서 의도한대로 재생하기 위해서는 재생 속도, 샘플링 크기 등을 알아야 합니다. 기본적으로 wav 파일의 header에서 다음과 같은 자료를 알아낼 수 있습니다.ChannelSampleRateBitsPerSample...지금 당장은 모든 헤더를 알 필요가 없습니다. 이 3가지 데이터를 통해 약간 곱해주고 나누어주면 다른 값도 얻을 수 있기에... 이 세가지 값이 중요합니다.Channel 값
채널은 말 그대로, 오디오의 채널 수 입니다. 우리가 흔히 사용하는 스피커는 좌 우로 2개가 있습니다. 오디오 파일들도 이 좌 우 두대로 트랙을 나누어 놨는데, 이를 \"스테레오\"라고 합니다. 가끔 \"모노\"라고 하는 경우도 있는데, 이는 1 채널을 의미 합니다. SampleRate 값
SampleRate는 초당 소리 샘플이 재생되는 속도를 의미 합니다. 여기서 샘플이라는 말이 나오는데, 샘플은 소리의 최소 단위라고 생각하면 될 것 같습니다. 즉 이 최소 단위인 샘플을 얼마나 빠른 속도로 읽어들일 것 인지에 대한 정보이지요. 이게 무슨 소리냐... 더 쉬운 설명을 위해 소리가 아니라, 글자로 예를 들어보겠습니다.가나다라마바사아자차카파타
위 글자 데이터가 있습니다. 이를 1채널 소리 데이터라고 가정하겠습니다.사람이 직접 글자를 읽는다고 할 때, 초당 2개의 글자를 읽는다고 하면, SampleRate는 2가 되는 것 입니다. 2hz가 되는 것이지요. 다시 소리로 돌아와,말이 빨라지면, 단위 시간당 파형 주기가 짧아지기에 SampleRate가 클수록(빠를 수록) 높은 소리가 납니다. (Pitch Shift)말이 느려지면, 단위 시간당 파형 주기가 길어지기에 SampleRate가 작을수록(느릴 수록) 낮은 소리가 납니다.BitsPerSample 값
말 그대로, Sample 당 Bits 개수 입니다. 여기서 8을 나눠주면 Bytes가 됩니다.(1바이트=8bits) 그럼 위 정보들을 바탕으로...
wav 파일의 대한 크기도 대략 계산해 낼 수 있겠지요?ChannelSampleRateBitsPerSample1채널 \"모노\", 44100hz SampleRate, BitsPerSample 16, 16bit-PCM, 6.7 초 짜리 wav PCM 데이터의 경우 총 샘플 개수 : 1 * 44100 * 6.7총 차지 바이트 : 1 * 44100 * 6.7 * 16(BitsPerSample) / 8 PCM 데이터 가져오기
그럼 이제, 파형을 가져오는 방법에 대해 알아보겠습니다.기본적으로 Data 부분에는 Raw PCM이 저장되어 있다고 언급했습니다. 이 Raw PCM 은 파형에 대한 16bit-PCM 정보를 글자로 바로 담은게 아니라, bytes로 변환되어 담겨 있습니다. (파일 구조 및 바이너리 작업을 해보셨다면 무슨말인지 이해하실 겁니다.) 즉, 16bit-PCM 으로 저장이 되어 있다는건, 각 샘플이 16bit(2bytes)로 저장되어 있다는 겁니다. 0 샘플 소리 데이터 2bytes 1 샘플 소리 데이터 2bytes 2 샘플 소리 데이터 3bytes
위 표는 모노 기준 샘플이 저장되는 순서 입니다. 스테레오의 경우 각 채널을 순서대로 번갈아가면서 저장되어 있습니다.0 샘플 소리 데이터 LEFT 2bytes 0 샘플 소리 데이터 RIGHT 2bytes 1 샘플 소리 데이터 LEFT 3bytes ...
실제 소리는 초당 44100개의 샘플(44100hz)로 구성된 경우가 많으니, 샘플 개수가 몇 만~ 몇 십, 백 만개씩 되겠지요.결국 16bit(2bytes)는 C# 기준 short 데이터 형(Int16)2바이트씩 읽어줘서 Int16으로 변환하면 최대 -32768~32767 값의 범위로 나옵니다.이를 다시 Normalize, 노말화하기 위해 32767 정도로 나누어주고, 각 끝 값이 초과하는 건 잘라주면, -1~+1 값으로 나오겠지요. 이를 그래프로 그려주면 됩니다.