I2S란? I2S를 이용한 .wav 파일 재생

728x90
반응형

1. I2S

 1.1 I2S 란?

I2S(Integrated Interchip Sound)는 Audio 데이터를 송수신하기 위해 필립스(현재의 NXP)에서 제정한 통신 프로토콜이다. I2C는 PCB 내의 IC 들과 데이터 송수신을 하기위해 만들어 졌지만 I2S는 PCB 내부의 Audio IC 와 데이터 전송만을 다루는 목적으로 만들어졌다.

Audio D/A Converter IC(MAX98357, PCM5100 등) 에 Clock과 데이터 전송해 디지털 음원 파일을 스피커를 통해 출력할 수 있도록 하는 통신 프로토콜이다.

 

 1.2  I2S 회로구성 Block diagram

아래 그림은 I2S의 버스 구성 및 타이밍에 관한 Block diagram이다. 아래 그림에서 "TRANSMITTER", "RECEIVER", "CONTROLLER" 이렇게 3가지 Block과 "SCK", "WS", "SD" 이렇게 3개의 라인을 볼 수 있다.

 TRANSMITTER : 데이터를 전송하는 디바이스를 의미

 RECEIVER : TRANSMITTER가 송신한 데이터를 수신한 Audio 데이터를 스피커를 통해 출력하는 IC

 CONTROLLER : SCK와 WS 라인을 제어하는 디바이스를 의미 

 

아래 그림1. 의 data SD, SD 라인의 화살표를 보면 3가지 형태 모두 TRANSMITTER에서 RECEIVER로 향해있다. 이 의미를 TRANSMITTER에서 데이터를 송신한다는 의미이다. TRANSMITTER는 MCU고, RECEIVER는 Audio D/A Converter IC를 의미한다. CONTROLLER는 SCK와 WS라인을 제어하면서 전체 버스라인을 제어하는데 이렇게 구성은 한번도 해본적이 없다(사실 잘 모름 ..^^;)

 

일반적으로 가장 많이 구성되는 형태는 왼쪽 상단의 TRANSMITTER가 MASTER가 되는 형태다.

그림 1. I2S 시스템 구성 및 프로토콜

SCK(Serial Clock) : bit clock 으로 1 clock에 1bit의 Audio 데이터를 송수신 할 수 있다. 

WS(Word Select) : 1(High)은 오른쪽(Right) 채널, 0은 왼쪽(Left) 채널의 스피커에 데이터를 출력 하도록 한다.

SD(Serial Data) : SCK와 동기되어 시리얼 데이터를 전송, 데이터 전송 라인이다.

 

 

데이타 전송을 위해서는 아래 주어진 타이밍에 맞춰 GPIO를 제어해야 한다. I2S 기능이 없는 MCU로 I2S를 구현하기 위해서는 아래 타이밍에 맞춰 GPIO를 제어해야 하지만 최근에 출시된 MCU는 거의 대부분 I2S를 내장하고 있기때문에 아래 내용은 자세히 몰라도 되지만 한번 정도는 읽어보는것도 나쁘지 않을것 같다. 

그림 2. I2S Transmitter 타이밍 블록다이어 그램

 

 

그림 3. I2S Receiver 타이밍 블록다이텅 그램

 

2. .wav 파일

.wav 파일은 wave 파일을 말한다. wave 파일의 구성은 다음과 같다.

그림 1. wave 파일 구조

wave 파일은 RIFF, FMT, DATA 이렇게 3 영역으로 구분된다.

 - RIFF는 Resource Interchange File Format의 약자로 동영상 재생을 위해 마이크로 소프트가 만든 내부 데이터 포맷이다. 

 - FMT는 wave 파일의 사운드 및 파일 관련 정보가 있다.

 - data는 음원으로 재생될 데이터가 있다.

 

여기서 데이터를 읽을때 big-endian과 little-endian을 주의하면서 읽어야 한다. 

2.1 RIFF(Resource Interchange File Format) 

아래 그림이 RIFF 영역이다. chunk descriptor 라고도 한다. 경고음에 사용할 .wav 파일이고, 파일은 HxD라는 프리웨어 tool을 이용했다.

그림 2.

2.1.1. 0-3 (ChunkID) :

 RIFF의 첫번째 바이트에는 "RIFF"라고 적혀 있다. 실제 데이터 파일을 열어 확인해 볼 수 있다. (big-endian 포맷)

그림 3.

2.1.2. 4-7 (ChunkSize) :

 파일의 크기 앖으로 아래 그림의 Chunk ID 4byte와 Chunk Size 4byte를 뺀 값이다. Little-endian 이기 때문에 0x0002B570byte가 된다. 0x0002B570byte 을 10진수로 환산하면 177,520byte 이고, 파일의 실제 사이즈는 8byte 를 더한 177,528 이다.

그림 4. 파일 사이즈 값

 

그림 5. 파일사이즈 0x0002B570을 10진수로 환산한 값

 

그림 6. 본 포스팅에서 사용한 파일의 속성 정보

2.1.3. 8-11 (Format) :

 데이터 파일의 Format을 나타낸다. .wav 파일의 경우 대문자 WAVE로 저장되어 있다.

그림 7.

2.2 fmt(Format)

포스팅을 작성하면서 wave파일을 분석하던중 이상한(?) 것을 발견했다. 검색에서 찾아본 자료들에는 하나같이 RIFF 영역뒤에 'fmt '라는 데이터가 온다고 되어있는데 포스팅에서 활용한 파일은 'fmt '가 아닌 'JUNK'가 기록되어있었다. 파일에 문제가 있는건가 싶어 다른 .wav 파일을 열어봤더니 모두 다 'JUNK'가 기록되어있었다.

그림 8.

해당부분(JUNK 부터 fmt 전까지) 을 지우고 파일을 실행해봐도 문제없이 재생되었는데 RIFF 파일을 분석해주는 'Riffpad v0.73' tool을 이용해 파일을 열면 손상된 파일이라고 나온다. 

 

위키백과에서 확인해본 결과 해당 영역은 아래 그림 9. 와 같이 WAVE chunks에 대한 foramt 정보와 샘플데이터라는것을 확인 할 수 있었다.(사실 잘 모르겠어서 더이상의 설명은 어려울것 같다..ㅜㅜ)

 

그림 9.

 

 

다시 돌아와서 'fmt ' 영역을 확인해보도록 하겠다. sub-chunk 라고도 한다.

그림 10.

앞서 설명한 JUNK 때문에 데이터의 위치가 그림 1. 과는 다른위치지만 혼란을 막기위해 그림 1. 의 데이터 위치로 설명하도록 하겠다.

 

2.2.1 12~15 (Subchunk1ID) :

 RIFF와 마찬가지로 시작은 big-endian으로 'fmt '라고 적혀있다. 여기서 주의할 점은 'fmt'가 아니라 fmt+(space)라는 점이다. 

 

2.2.2. 16~19 (Subchunk1Size) :

 첫번째 sub-chunk 영역의 사이즈 값을 갖는다. Subchunk1ID, Subchunk1Size 영역을 제외한 나머지 영역이 사용하는 크기 값으로 0x10000000이다. little-endian이기 때문에 0x00000010으로 16byte를 갖는다. 

그림 11.

2.2.3. 20-21 (AudioFormat) :

 wave 파일의 Audio format에 대한 정보를 갖고 있다. 주의할 점은 2 byte이기 때문에 4Byte씩 데이터를 읽어올 경우 실수를 할 수 있다. 보통 PCM format으로 0x01로 되어있다고 하는데 포스팅에서 사용한 파일은 0x03으로 기록되어 있다. audio format은 총 다섯가지로 다음 그림12. 와 같다.

그림 12.

여기서는 little-endian 2byte 이기 때문에 0x0003이 된다.

 

2.2.4. 22-23 Byte (NumChannels) :

 wave파일의 채널수를 나타낸다. Mono 는 0x0001, Stereo는 0x0002이다. 이 영역도 2 byte라는 점에 주의 해야한다. NumChannels 값에 따른 정의는 아래 표와 같다.

NumChannel audio Type data transfer format
1 mono (data) (data) ... ... 
2 stereo (Left) (Right) ... ... 
3 3channel (Left) (Right) (Center) ... ... ... 
4 quad (Front Left) (Front Right) (Rear Left) (Rear Right) ... ... ... ... 
5 4channel (Left) (Right) (Center) (Surround) ... ... ... ...
6 6channel (Left center) (Left) (Center) (Right center) (Right) (Surround) ... ... 

2.2.5. 24-27 (SampleRate) :

 wave 파일의 sample rate값을 갖는다. 총 4byte로 구성되어 있고 little-endian형식이다. 그림 10.의 3C-3F영역의 값은 0x44AC0000으로 0x0000AC44이고 10진수로 변환하면 44,100이 된다. 즉 sample rate 가 44.1Khz라는것을 확인 할 수 있다.

그림 13.

 

2.2.6. 28-31 (ByteRate) :

 1초동안 재생되는 소리가 갖는 크기 값을 나타내며 공식은 SampleRate * NumChannels * BitsPerSampe / 8 로 계산된다.

그림 14. 포스팅에서 사용한 파일의 ByteRate 값

그림 14. 의 값을 보자 0x10B10200 little-endian 방식으로 big-endian 으로 변환하면 0x0002B110이고 다시 10진수로 변환하면 176,400 이다. 이 값은 아래 BitsPerSample 까지 확인 후 검증하도록 하겠다.

 

 

2.2.7. 32-33 (BlockAlign) : 

 Sample frame의 크기이다. 전체 채널을 포함하는 한 샘플의 크기이다. 공식은 NumChannels * BitsPerSample

 

 

2.2.8. 34-35 (BitsPerSample) :

 wave 파일의 샘플당 bits 수를 나타낸다. 1/sample rate의 각 샘플을 몇 개의 bits로 표현할지를 나타낸다. 여기서 bit수가 커지면 세분화된 표현으로 음질이 향상되겠지만 용량 또한 함께 증가하게된다. 

 

위 내용을 보기 쉽게 누군가(..??) 그림으로 정리해 놓았다. 

그림 15.

2.3. data

wave 파일의 실제 포맷 데이터로 I2S clock에 맞춰 SD 라인을 통해 데이터를 전송해주면 된다.

 

 

 

- 끝 -

 

- 자료출처

http://soundfile.sapp.org/doc/WaveFormat/

 

Microsoft WAVE soundfile format

WAVE PCM soundfile format The WAVE file format is a subset of Microsoft's RIFF specification for the storage of multimedia files. A RIFF file starts out with a file header followed by a sequence of data chunks. A WAVE file is often just a RIFF file with a

soundfile.sapp.org

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html

 

https://www.sparkfun.com/datasheets/BreakoutBoards/I2SBUS.pdf

728x90
반응형