实验原理
MPEG音频编码原理框图
MPEG-I 心理声学模型,根据人耳的听觉阈值和听觉掩蔽特性建立的模型,可以通过这个模型消除更多的冗余数据,计算信号中不可听觉感知的部分。
多相滤波器组(Polyphase Filter Bank):将PCM样本变换到32个子带的频域信号,如果输入的采样频率为48kHz,那么子带的频率宽度为48/(2*32)=0.75Hz
比例因子提取、比例因子选择:每个子带每12个样点为一个数据块,一个子带含有3个数据块,将这三个数据块的比例因子进行提取并比较。若相差不大,则使用统一的量化比特数;若相差较大,则根据比例因子选择信息,对3个数据块分别进行不同比特数的量化。
动态比特分配:根据目标码率和心理声学模型分析的结果,为子带分配最合理的量化比特数,使整帧和每个子带的噪掩比NMR最小的算法。(该信息需送至解码端,以供解码端完成解码)
线性量化器:根据动态比特分配给出的量化比特数,对子带的数据进行线性量化。
颗粒形成:将量化后的数据形成数据流。
动态比特分配原理
噪掩比(NMR)=信掩比(SMR)-信噪比(SNR)
每增加1bit的量化,信噪比增加6dB。对不同的频带,采用不同比特的量化,可以有效减少冗余。实例分析如下图:
代码分析和结果输出
- 输出音频的采样率和目标码率
代码部分为:
void print_config (frame_info * frame, int *psy, char *inPath,
char *outPath)
{
frame_header *header = frame->header;
if (glopts.verbosity == 0)
return;
fprintf (stderr, "--------------------------------------------\n");
fprintf (stderr, "Input File : '%s' %.1f kHz\n",
(strcmp (inPath, "-") ? inPath : "stdin"),
s_freq[header->version][header->sampling_frequency]);
fprintf (stderr, "Output File: '%s'\n",
(strcmp (outPath, "-") ? outPath : "stdout"));
fprintf (stderr, "%d kbps ", bitrate[header->version][header->bitrate_index]);
fprintf (stderr, "%s ", version_names[header->version]);
if (header->mode != MPG_MD_JOINT_STEREO)
fprintf (stderr, "Layer II %s Psycho model=%d (Mode_Extension=%d)\n",
mode_names[header->mode], *psy, header->mode_ext);
else
fprintf (stderr, "Layer II %s Psy model %d \n", mode_names[header->mode],
*psy);
fprintf (stderr, "[De-emph:%s\tCopyright:%s\tOriginal:%s\tCRC:%s]\n",
((header->emphasis) ? "On" : "Off"),
((header->copyright) ? "Yes" : "No"),
((header->original) ? "Yes" : "No"),
((header->error_protection) ? "On" : "Off"));
fprintf (stderr, "[Padding:%s\tByte-swap:%s\tChanswap:%s\tDAB:%s]\n",
((glopts.usepadbit) ? "Normal" : "Off"),
((glopts.byteswap) ? "On" : "Off"),
((glopts.channelswap) ? "On" : "Off"),
((glopts.dab) ? "On" : "Off"));
if (glopts.vbr == TRUE)
fprintf (stderr, "VBR Enabled. Using MNR boost of %f\n", glopts.vbrlevel);
fprintf(stderr,"ATH adjustment %f\n",glopts.athlevel);
fprintf (stderr, "--------------------------------------------\n");
}
以test.wav为例,输出test_n.mp2。
修改代码,使其可以输出某数据帧的相关内容
则增加代码部分为:
int gr;
FILE *out_txt=NULL;
unsigned char *outTXT=NULL;
out_txt=fopen("output.txt","w");
fprintf(out_txt, "该音频声道数:%d\n", nch);
fprintf(out_txt, "观测第 %d 帧\n", frameNum);
fprintf(out_txt, "本帧比特预算:%d bits\n", adb);
fprintf(out_txt, "该帧比例因子和比特分配表如下:\n");
for (ch = 0; ch < nch; ch++) //逐声道输出
{
fprintf(out_txt, "--- 声道%2d ----\n", ch + 1);
for (sb = 0; sb < frame.sblimit; sb++) //各子带
{
fprintf(out_txt, "子带[%2d]比例因子:\t", sb + 1);
for (gr = 0; gr < 3; gr++)
{
fprintf(out_txt, "%2d\t", scalar[ch][gr][sb]);
}
fprintf(out_txt, "\n");
fprintf(out_txt, "子带[%2d]比特分配表:\t%2d\n", sb + 1, bit_alloc[ch][sb]);
fprintf(out_txt, "\n");
}
}
free(outTXT);
fclose(out_txt);
自己选取三段音频分别为noise.wav music.wav music_noise.wav,依次得到输出如下:
noise.wav
该音频声道数:2
观测第 147 帧
本帧比特预算:4 bits
该帧比例因子和比特分配表如下:
— 声道 1 ----
子带[ 1]比例因子: 4 4 4
子带[ 1]比特分配表: 6子带[ 2]比例因子: 12 12 12
子带[ 2]比特分配表: 3子带[ 3]比例因子: 13 13 13
子带[ 3]比特分配表: 3子带[ 4]比例因子: 11 14 24
子带[ 4]比特分配表: 4子带[ 5]比例因子: 11 11 18
子带[ 5]比特分配表: 3子带[ 6]比例因子: 10 14 18
子带[ 6]比特分配表: 4子带[ 7]比例因子: 10 13 24
子带[ 7]比特分配表: 4子带[ 8]比例因子: 10 10 21
子带[ 8]比特分配表: 4子带[ 9]比例因子: 10 10 10
子带[ 9]比特分配表: 2子带[10]比例因子: 11 11 11
子带[10]比特分配表: 3子带[11]比例因子: 10 10 10
子带[11]比特分配表: 3子带[12]比例因子: 12 12 12
子带[12]比特分配表: 1子带[13]比例因子: 12 12 25
子带[13]比特分配表: 3子带[14]比例因子: 13 13 13
子带[14]比特分配表: 3子带[15]比例因子: 13 13 24
子带[15]比特分配表: 2子带[16]比例因子: 13 16 25
子带[16]比特分配表: 2子带[17]比例因子: 12 12 12
子带[17]比特分配表: 3子带[18]比例因子: 13 13 21
子带[18]比特分配表: 2子带[19]比例因子: 15 15 15
子带[19]比特分配表: 1子带[20]比例因子: 15 15 15
子带[20]比特分配表: 1子带[21]比例因子: 14 14 20
子带[21]比特分配表: 2子带[22]比例因子: 14 17 22
子带[22]比特分配表: 1子带[23]比例因子: 14 14 24
子带[23]比特分配表: 1子带[24]比例因子: 14 14 14
子带[24]比特分配表: 1子带[25]比例因子: 14 14 22
子带[25]比特分配表: 1子带[26]比例因子: 14 14 24
子带[26]比特分配表: 1子带[27]比例因子: 15 15 15
子带[27]比特分配表: 1— 声道 2 ----
子带[ 1]比例因子: 4 4 4
子带[ 1]比特分配表: 6子带[ 2]比例因子: 13 10 16
子带[ 2]比特分配表: 4子带[ 3]比例因子: 12 12 12
子带[ 3]比特分配表: 3子带[ 4]比例因子: 13 13 13
子带[ 4]比特分配表: 5子带[ 5]比例因子: 11 11 11
子带[ 5]比特分配表: 4子带[ 6]比例因子: 11 14 14
子带[ 6]比特分配表: 4子带[ 7]比例因子: 11 11 22
子带[ 7]比特分配表: 4子带[ 8]比例因子: 10 10 17
子带[ 8]比特分配表: 4子带[ 9]比例因子: 12 12 12
子带[ 9]比特分配表: 2子带[10]比例因子: 11 11 11
子带[10]比特分配表: 3子带[11]比例因子: 10 10 10
子带[11]比特分配表: 3子带[12]比例因子: 13 13 13
子带[12]比特分配表: 1子带[13]比例因子: 13 13 21
子带[13]比特分配表: 3子带[14]比例因子: 14 14 14
子带[14]比特分配表: 3子带[15]比例因子: 13 13 23
子带[15]比特分配表: 2子带[16]比例因子: 14 14 14
子带[16]比特分配表: 2子带[17]比例因子: 12 12 25
子带[17]比特分配表: 3子带[18]比例因子: 14 14 14
子带[18]比特分配表: 2子带[19]比例因子: 13 13 13
子带[19]比特分配表: 1子带[20]比例因子: 13 13 22
子带[20]比特分配表: 1子带[21]比例因子: 13 13 24
子带[21]比特分配表: 2子带[22]比例因子: 14 14 19
子带[22]比特分配表: 1子带[23]比例因子: 14 14 14
子带[23]比特分配表: 1子带[24]比例因子: 14 14 26
子带[24]比特分配表: 1子带[25]比例因子: 12 12 12
子带[25]比特分配表: 1子带[26]比例因子: 13 13 13
子带[26]比特分配表: 1子带[27]比例因子: 15 15 22
子带[27]比特分配表: 1
music.wav
该音频声道数:2
观测第 616 帧
本帧比特预算:2 bits
该帧比例因子和比特分配表如下:
— 声道 1 ----
子带[ 1]比例因子: 4 7 14
子带[ 1]比特分配表: 5子带[ 2]比例因子: 12 15 15
子带[ 2]比特分配表: 4子带[ 3]比例因子: 12 12 21
子带[ 3]比特分配表: 3子带[ 4]比例因子: 12 15 15
子带[ 4]比特分配表: 4子带[ 5]比例因子: 13 13 18
子带[ 5]比特分配表: 5子带[ 6]比例因子: 13 13 21
子带[ 6]比特分配表: 5子带[ 7]比例因子: 13 16 16
子带[ 7]比特分配表: 4子带[ 8]比例因子: 12 15 25
子带[ 8]比特分配表: 5子带[ 9]比例因子: 10 17 21
子带[ 9]比特分配表: 5子带[10]比例因子: 12 20 20
子带[10]比特分配表: 4子带[11]比例因子: 9 17 26
子带[11]比特分配表: 5子带[12]比例因子: 14 22 22
子带[12]比特分配表: 3子带[13]比例因子: 13 20 25
子带[13]比特分配表: 4子带[14]比例因子: 12 20 28
子带[14]比特分配表: 5子带[15]比例因子: 14 20 26
子带[15]比特分配表: 3子带[16]比例因子: 15 23 23
子带[16]比特分配表: 4子带[17]比例因子: 14 19 28
子带[17]比特分配表: 4子带[18]比例因子: 14 21 21
子带[18]比特分配表: 4子带[19]比例因子: 15 20 24
子带[19]比特分配表: 3子带[20]比例因子: 15 19 29
子带[20]比特分配表: 3子带[21]比例因子: 13 23 23
子带[21]比特分配表: 3子带[22]比例因子: 18 21 31
子带[22]比特分配表: 1子带[23]比例因子: 16 24 24
子带[23]比特分配表: 0子带[24]比例因子: 12 25 34
子带[24]比特分配表: 1子带[25]比例因子: 13 24 27
子带[25]比特分配表: 1子带[26]比例因子: 15 25 25
子带[26]比特分配表: 0子带[27]比例因子: 16 21 25
子带[27]比特分配表: 0— 声道 2 ----
子带[ 1]比例因子: 4 7 14
子带[ 1]比特分配表: 5子带[ 2]比例因子: 11 15 15
子带[ 2]比特分配表: 4子带[ 3]比例因子: 13 13 13
子带[ 3]比特分配表: 3子带[ 4]比例因子: 12 12 18
子带[ 4]比特分配表: 5子带[ 5]比例因子: 11 16 16
子带[ 5]比特分配表: 5子带[ 6]比例因子: 11 14 23
子带[ 6]比特分配表: 5子带[ 7]比例因子: 14 17 17
子带[ 7]比特分配表: 4子带[ 8]比例因子: 13 13 21
子带[ 8]比特分配表: 5子带[ 9]比例因子: 10 16 21
子带[ 9]比特分配表: 5子带[10]比例因子: 12 18 18
子带[10]比特分配表: 4子带[11]比例因子: 10 16 26
子带[11]比特分配表: 5子带[12]比例因子: 13 20 20
子带[12]比特分配表: 3子带[13]比例因子: 14 19 23
子带[13]比特分配表: 4子带[14]比例因子: 14 19 25
子带[14]比特分配表: 5子带[15]比例因子: 15 22 22
子带[15]比特分配表: 3子带[16]比例因子: 15 21 31
子带[16]比特分配表: 4子带[17]比例因子: 14 25 25
子带[17]比特分配表: 4子带[18]比例因子: 16 25 32
子带[18]比特分配表: 4子带[19]比例因子: 15 27 27
子带[19]比特分配表: 3子带[20]比例因子: 14 25 33
子带[20]比特分配表: 3子带[21]比例因子: 15 26 29
子带[21]比特分配表: 3子带[22]比例因子: 14 25 31
子带[22]比特分配表: 1子带[23]比例因子: 18 25 30
子带[23]比特分配表: 0子带[24]比例因子: 14 26 29
子带[24]比特分配表: 1子带[25]比例因子: 13 24 34
子带[25]比特分配表: 1子带[26]比例因子: 15 27 27
子带[26]比特分配表: 0子带[27]比例因子: 16 25 32
子带[27]比特分配表: 0
music_noise.wav
该音频声道数:2
观测第 622 帧
本帧比特预算:10 bits
该帧比例因子和比特分配表如下:
— 声道 1 ----
子带[ 1]比例因子: 8 8 8
子带[ 1]比特分配表: 5子带[ 2]比例因子: 22 13 63
子带[ 2]比特分配表: 4子带[ 3]比例因子: 23 15 63
子带[ 3]比特分配表: 3子带[ 4]比例因子: 24 13 63
子带[ 4]比特分配表: 5子带[ 5]比例因子: 23 14 63
子带[ 5]比特分配表: 5子带[ 6]比例因子: 25 15 63
子带[ 6]比特分配表: 4子带[ 7]比例因子: 24 15 63
子带[ 7]比特分配表: 4子带[ 8]比例因子: 26 15 63
子带[ 8]比特分配表: 4子带[ 9]比例因子: 24 17 63
子带[ 9]比特分配表: 4子带[10]比例因子: 25 18 63
子带[10]比特分配表: 3子带[11]比例因子: 24 16 63
子带[11]比特分配表: 4子带[12]比例因子: 25 19 63
子带[12]比特分配表: 3子带[13]比例因子: 24 20 63
子带[13]比特分配表: 4子带[14]比例因子: 25 19 63
子带[14]比特分配表: 3子带[15]比例因子: 25 20 63
子带[15]比特分配表: 3子带[16]比例因子: 23 23 23
子带[16]比特分配表: 2子带[17]比例因子: 26 23 63
子带[17]比特分配表: 3子带[18]比例因子: 25 25 25
子带[18]比特分配表: 3子带[19]比例因子: 26 26 63
子带[19]比特分配表: 1子带[20]比例因子: 25 25 25
子带[20]比特分配表: 1子带[21]比例因子: 25 28 63
子带[21]比特分配表: 2子带[22]比例因子: 25 25 25
子带[22]比特分配表: 0子带[23]比例因子: 24 24 63
子带[23]比特分配表: 0子带[24]比例因子: 25 25 63
子带[24]比特分配表: 0子带[25]比例因子: 25 25 63
子带[25]比特分配表: 0子带[26]比例因子: 25 25 63
子带[26]比特分配表: 0子带[27]比例因子: 25 29 63
子带[27]比特分配表: 0— 声道 2 ----
子带[ 1]比例因子: 8 8 8
子带[ 1]比特分配表: 5子带[ 2]比例因子: 24 13 63
子带[ 2]比特分配表: 4子带[ 3]比例因子: 22 14 63
子带[ 3]比特分配表: 3子带[ 4]比例因子: 24 13 63
子带[ 4]比特分配表: 5子带[ 5]比例因子: 25 14 63
子带[ 5]比特分配表: 5子带[ 6]比例因子: 24 16 63
子带[ 6]比特分配表: 4子带[ 7]比例因子: 25 16 63
子带[ 7]比特分配表: 4子带[ 8]比例因子: 26 15 63
子带[ 8]比特分配表: 4子带[ 9]比例因子: 25 17 63
子带[ 9]比特分配表: 4子带[10]比例因子: 25 19 63
子带[10]比特分配表: 3子带[11]比例因子: 25 18 63
子带[11]比特分配表: 4子带[12]比例因子: 25 19 63
子带[12]比特分配表: 3子带[13]比例因子: 25 19 63
子带[13]比特分配表: 4子带[14]比例因子: 25 21 63
子带[14]比特分配表: 3子带[15]比例因子: 26 20 63
子带[15]比特分配表: 3子带[16]比例因子: 25 22 63
子带[16]比特分配表: 2子带[17]比例因子: 26 19 63
子带[17]比特分配表: 3子带[18]比例因子: 25 19 63
子带[18]比特分配表: 3子带[19]比例因子: 26 21 63
子带[19]比特分配表: 1子带[20]比例因子: 25 22 63
子带[20]比特分配表: 1子带[21]比例因子: 25 20 63
子带[21]比特分配表: 2子带[22]比例因子: 26 22 63
子带[22]比特分配表: 0子带[23]比例因子: 25 25 63
子带[23]比特分配表: 0子带[24]比例因子: 25 25 25
子带[24]比特分配表: 0子带[25]比例因子: 25 25 25
子带[25]比特分配表: 0子带[26]比例因子: 27 23 63
子带[26]比特分配表: 0子带[27]比例因子: 25 20 63
子带[27]比特分配表: 0
可以看出,对于只有噪声和混合了噪声的音乐比特分配较为均匀;而纯音乐比特分配较为不均,高频部分比特数较少,这主要是因为人的发声语音范围有限。