반응형




MPEG1 Audio Layer3

mp3 파일은 여러개의 AAU(Audio Access Uint)들과 1개의 AudioTag로 이루어져 있다.

AAU  AAU  AAU  ...  Audio Tag 

 

각각의 AAU들은 다음과 같은 구조를 가진다.

Header  CRC  SideInfo  Main Data 

 

AAU의 사이즈는 다음과 같다.

144*BitRate/샘플링주파수+Padding 

mp3는 프레임당 1152 비트가 할당되기 때문에 바이트 계산하면 144바이트가 된다. BitRate와 샘플링주파수는 헤더정보에서 얻을 수 있다. 파일 Size가 3985814 바이트이고 샘플링 주파수가 44.1khz, BitRate가 128kbit인 mp3파일의 프레임 Size는 144*128000 / 441000 로 약 417바이트가 되며 프레임당 약 9558바이트의 Size가된다.

 


1. Header 

mp3 파일에는 각각의 AAU마다 헤더가 따로 존재한다. 그러므로 각 AAU들은 독립적으로 decode될 수 있다. 그러나 대부분의 mp3에서 모든 헤더들은 동일하므로, 전체를 디코딩할 시에는 첫 번째 AAU의 헤더만을 읽는다.

Header는 32비트의 길이를 갖고 13개의 항목으로 구성되어 있다.

 

길이 설명
11  동기패턴 모두 1로 설정 
MPEG Audio Version ID 00 - MPEG Version 2.5
01 - reserved
10 - MPEG Version 2
11 - MPEG Version 1(mp3의 경우)
Layer 정의 00 - reserved 
01 - Layer III 
10 - Layer II 
11 - Layer I 
Checksum 설정유무 0 - Error 체크 있음 
1 - Error 체크 없음 
BitRate
MPEG1 
Layer1
MPEG1 
Layer2
MPEG1 
Layer3
MPEG2
Layer1
MPEG2
Layer2,3
0000  free  free  free  free  free 
0001  32  32  32  32 
0010  64  48  40  48  16 
0011  96  56  48  56  24 
0100  128  64  56  64  32 
0101  160  80  64  80  40 
0110  192  96  80  96  48 
0111  224  112  96  112  56 
1000  256  128  112  128  64 
1001  288  160  128  144  80 
1010  320  192  160  160  96 
1011  352  224  192  176  112 
1100  384  256  224  192  128 
1101  416  320  256  224  144 
1110  448  384  320  256  160 
1111  bad  bad  bad  bad  bad 
샘플링 주파수 
MPEG1  MPEG2  MPEG2.5 
00  44100  22050  11025 
01  48000  24000  12000 
10  32000  16000  8000 
11  reserved  reserved  reserved 
Padding bit 0 - frame is not padded 
1 - frame is padded with one extra bit 
개별용도비트 특별히 사용되지 않음
Channel Mode  00 - Stereo 
01 - Joint Stereo 
10 - Dual Channel 
11 - Single Channel 
확장 Mode(Joint Stereo에서만 사용)
Layer 1,2 Layer 3
Intensity
stereo
MS
stereo
00  subbands 4 to 31  off  off 
01  subbnads 8 to 31  on  off 
10  subbnads 12 to 31  off  on 
11  subbnads 16 to 31  on  on 
Copyright 0 - Audio is not copyrighted 
1 - Audio is copyrighted 
Original 0 - 복사본 
1 - 원본 
Emphasis   

2. CRC

CRC Check는 프레임의 오류를 검사하기 위한 정보를 가진다.

 


3. SideInfo 

mp3에서 주요하게 사용되는 압축 알고리즘에는 Scalefactor, Huffman 부호화, 양자화 등이 있다. 실제 각 프레임의 메인데이터를 decoding 하는 데 필요한 정보들을 담고 있다. 

 

길이 사이드인포 요소  설명
main_data_end  mp3 Player 프로그램의 버퍼상에서 비트스트림의 위치
Private_bits   
Scfsi  Scalefactor 디코딩에 사용
12  Part2_3_length  허프만 디코딩에 사용
Big_values  허프만 디코딩에 사용
Global_gain  역양자화에 사용
Scalefac_compress  Scalefactor Encoding시에 사용
Blocksplit_flag   
Block_type   
Switch_point   
Table_select  허프만 디코딩에 사용
Subblock_gain  역양자화에 사용
Region_address1  허프만 디코딩에 사용
Region_address2  허프만 디코딩에 사용
Preflag  역양자화에 사용
Scalefac_scale  Scalefactor 디코딩에 사용, 역양자화에 사용
Count1table_select  허프만 코딩에 사용

 

다음에 이 정보를 저장하기 위한 자료구조가 있다.

typedef struct { 
unsigned long part2_3_length;
unsigned long big_values;
unsigned long global_gain;
unsigned long scalefac_compress;
unsigned long window_switching_flag;
unsigned long block_type;
unsigned long mixed_block_flag;
unsigned long table_select[3];
unsigned long subblock_gain[3];
unsigned long region0_count;
unsigned long region1_count;
unsigned long preflag;
unsigned long scalefac_scale;
unsigned long count1table_select;
}gr_info_s;


typedef struct {
unsigned long main_data_begin;
unsigned long private_bits; 
struct {
unsigned long scfsi[4]; 
gr_info_s gr[2]; // 메인데이터는 2개의 granule로 구성
}ch[2]; 
}III_side_info_t;

사이드인포의 크기는 채널에 따라 그 크기가 달라지는데 Mono일 경우 136bits, Stereo일 경우 256bits이다.(메인데이터는 2개의 granule로 나누어지고 각각의 granule은 채널로 나뉘어짐) 사이드인포 정보 중에서 granule별 채널별로 갖고 있는 정보가 있기 때문에 채널에 따라서 그 크기가 다른 것이다.

다음은 사이드 인포 정보를 얻기 위한 소스 코드이다.

// Mono : 136 bits (= 17 bytes)
// Stereo : 256 bits (= 32 bytes) 
BOOL get_side_info(uunsigned long channels, III_side_info_t *side_info) {
int ch, gr;
side_info->main_data_begin = get_bits(9);
if (channels == 1) 
side_info->private_bits = get_bits(5);
else 
side_info->private_bits = get_bits(3);
for (ch=0; chch[ch].scfsi[0] = get_bits(1);
side_info->ch[ch].scfsi[1] = get_bits(1);
side_info->ch[ch].scfsi[2] = get_bits(1);
side_info->ch[ch].scfsi[3] = get_bits(1);
}
for (gr=0; gr<2; gr++) {
for (ch=0; chch[ch].gr[gr].part2_3_length = get_bits(12);
  side_info->ch[ch].gr[gr].big_values = get_bits(9);
  side_info->ch[ch].gr[gr].global_gain = get_bits(8);
  side_info->ch[ch].gr[gr].scalefac_compress = get_bits(4);
  side_info->ch[ch].gr[gr].window_switching_flag = get_bits(1);
  // window_switching_flag 는 blocksplit_flag와 같다. 
  // mixed_block_flag 는 switch_point와 같다. 
  if (side_info->ch[ch].gr[gr].window_switching_flag) // 22 bits 
  { 
   side_info->ch[ch].gr[gr].block_type = get_bits(2);
   side_info->ch[ch].gr[gr].mixed_block_flag = get_bits(1);
   side_info->ch[ch].gr[gr].table_select[0] = get_bits(5);
   side_info->ch[ch].gr[gr].table_select[1] = get_bits(5);
   side_info->ch[ch].gr[gr].subblock_gain[0] = get_bits(3);
   side_info->ch[ch].gr[gr].subblock_gain[1] = get_bits(3);
   side_info->ch[ch].gr[gr].subblock_gain[2] = get_bits(3);
   if (side_info->ch[ch].gr[gr].block_type == 0)
    return(FALSE);
   else if (side_info->ch[ch].gr[gr].block_type == 2 && side_info->ch[ch].gr[gr].mixed_block_flag == 0)
    side_info->ch[ch].gr[gr].region0_count = 8;
   else 
    side_info->ch[ch].gr[gr].region0_count = 7;
   side_info->ch[ch].gr[gr].region1_count = 20 - side_info->ch[ch].gr[gr].region0_count;
  } 
  else // 22 bits 
  { 
   side_info->ch[ch].gr[gr].table_select[0] = get_bits(5);
   side_info->ch[ch].gr[gr].table_select[1] = get_bits(5);
   side_info->ch[ch].gr[gr].table_select[2] = get_bits(5);
   side_info->ch[ch].gr[gr].region0_count = get_bits(4);
   side_info->ch[ch].gr[gr].region1_count = get_bits(3);
   side_info->ch[ch].gr[gr].block_type = 0;
  }
  side_info->ch[ch].gr[gr].preflag = get_bits(1);
  side_info->ch[ch].gr[gr].scalefac_scale = get_bits(1);
  side_info->ch[ch].gr[gr].count1table_select = get_bits(1);
} 
}
return(TRUE);
}

4. Main Data 

메인데이터는 실질적인 오디오 데이터가 실려있는 영역을 말한다. mp3의 메인데이터는 한 프레임이 1152개의 Sample 데이터를 갖는다.  

granule은 메인데이터가 처리되는 기본단위다. mp3 부호화 방법중 주파수 등분할 방식인 32 서브밴드 방법이 있다. 각 서브밴드는 18개의 sample 데이터를 갖는다. 32*18 = 576 이라는 크기값이 나오며 이것을 한 개의 granule단위로 처리하게된다.  

mp3는 2개의 granule로 구성되어 1152개의 Sample 데이터를 갖게된다. 각 granule안에서는 채널별로 decoding된다.

 


5. 오디오 태그 (Audio Tag) 

오디오 태그는 AAU의 집합 끝 부분 즉 mp3파일의 마지막 부분 128바이트를 말한다. Artist정보, 곡의 제목, 앨범 Title, 출판년도 등의 mp3파일 전체의 부가정보를 담고 있다. 장르에 대한 인덱스는 생략한다.

길이(byte) 설명 
Tag ID 
30  Title 
30  Artist 
30  Album 
Year 
30  Comment
장르 

 


6. mp3 데이터 복원 

사이드 인포 디코드 (Side Information Decode) 

SideInfo는 mp3의 실제 음향 데이터인 MainData 부분 앞에 위치하며 압축데이터를 복원할 때 필요한 정보들의 집합체이다. SideInfo 정보를 읽어 각 알고리즘 ②,③,④,⑤,⑥ 에서 사용할 수 있게 재배치한다.

스케일 펙터 디코드 (Scalfactors Decode) 

스케일 펙터는 각 밴드의 샘플 데이터 부호화의 한 과정이다. 하나의 밴드 내의 36개 샘플 데이터(Layer III 의 경우 1152/32 = 36 즉 각 서브밴드 당 36 샘플)는 파형과 배율로 분리된다. 파형을 최대 진폭이 1.0이 되도록 정규화 하는데, 그때의 배율이 스케일 펙터로서 부호화 된다. 이 과정을 거치면 Band의 Sample Data 들은 비슷한 값들끼리 모이게 되고, 양자화잡음의 발생을 제한할 수 있기 때문에 청각심리 효과가 작용하여 이들 잡음이 감지되지 않게 된다. 

적응 비트 할당이란 각 프레임, 각 서브밴드 마다 비트를 조정하는 것을 말한다. 스케일 펙터와 조합해서 크리티컬 밴드(임계대역폭)를 고려한 마스킹 레벨 한도 내에서 양자화를 함으로써 마스킹 효과를 더욱 효과적으로 이용 할 수 있다. 즉 마스킹의 효과로 인하여 인식되지 않는 주파수 대역에 대해서는 비트를 할당하지 않는다. 

허프만 디코드 (Huffman Decode) 

허프만 부호화 테이블을 이용하여 복호화 한다. 이때 사용되는 허프만 테이블은 신호의 통계적 편중을 주파수 대역별로 최적화 하여 만들어진 표준화 테이블이라고 한다. 이는 무손실 압축 방법으로 MPEG, JPEG 등에 주로 사용되는 압축기법이므로 자료를 찾는데 무리가 없을 것이므로 여기서는 그냥 넘어가도록 하겠다. 

역양자화 (Dequantization)

역양자화는 양자화를 복원하는 방법이다. 양자화는 데이터의 손실이 오더라도 사람이 감각적으로 감지하기 힘들게 된다면 어느정도의 데이터에 손실을 가하여 압축률을 높이는 방법이다. 역시 허프만 부호화와 함께 주로 사용되는 기법이다.

IMDCT(Inverse Modified Discrete Cosine Transform) 

MDCT는 시간 영역 데이터를 주파수 영역으로 변환하는 것이므로, IMDCT는 역으로 주파수 영역 데이터를 시간영역 데이터로 복호화 한다. 디코딩과정에서 IMDCT는 전체 처리과정에서 CPU점유율 30%이상 많은 연산을 필요로 한다.

32서브밴드 통합 필터뱅크(32 Subband Synthesis Filter Bank) 

 

크리티컬 밴드 등의 청각특성을 효율적으로 이용하기 위해서는 우선 신호를 주파수 성분으로 나누는 것이 필요하다. 이 때문에 Encoder에서는 전 대역을 32개의 밴드로 등간격 주파수폭으로 세분하여 서브밴드 부호화 하므로 Decoder에서 다시 이를 복호화 한다. 

그러나 통상의 필터로 1/32의 주파수대역을 취하는 경우 이상적인 필터가 아니기 때문에 부 표본화의 시점에서 앨리어싱을 일으킨다. 앨리어싱 잡음을 소거하기 위해 폴리페이즈 필터뱅크라고 불리는 필터를 사용하며 이 방법은 주로 Layer I, II 에서 사용된다. Layer III 에서는 MDCT(Modified Discrete Cosine Transform : 변형이산 여현변화)를 복합적으로 사용하고 있다.

 


7. 참고 자료

반응형
Posted by Real_G