具体实施方式
在说明书及权利要求书当中使用了某些词汇来指称特定的组件。所属领域中的技术人员应可理解,制造商可能会用不同的名词来称呼同样的组件。本说明书及权利要求书并不以名称的差异来作为区分组件的方式,而是以组件在功能上的差异来作为区分的基准。在通篇说明书及权利要求书当中所提及的「耦接」一词在此包含任何直接及/或间接的电气耦接手段。因此,若文中描述第一装置耦接于第二装置,则代表第一装置可直接电气耦接于第二装置,或透过其它装置或耦接手段间接地电气耦接至第二装置。下面结合附图和实施例对本发明进行详细说明。
请参照图1,图1是本发明实施例的嵌入式音频解码器的结构示意图。如图1所示,嵌入式音频解码器包括:异步先进先出存储器1、取位器2、帧大小判别器3、控制器4、解码及错误检测装置5、后处理模块6、音频输出模块7和模数转换器8。
异步先进先出存储器1用于对连续的待解码的码流进行缓存。
取位器2与异步先进先出存储器1耦接,用于从异步先进先出存储器1获取待解码的码流数据。在嵌入式***中,取位操作可采用硬件取位电路来实现,也可采用软件取位来实现。其中,采用硬件取位电路的取位器2具有很好的实时性。采用软件取位的取位器2可方便地实现缓冲错误保护(Buffer Error Protection)功能,保证取位操作的准确性。本说明书在此不做限制。
帧大小判别器3与异步先进先出存储器1耦接,用于检查异步先进先出存储器1中是否缓存有长度至少为当前解码所需数据长度的数据。以解码AAC帧头为例来说,AAC数据帧中帧头长度固定为7个字节,则帧大小判别器3检查异步先进先出存储器1中是否缓存有至少7个字节的数据。
在本实施例中,取位器2采用硬件取位电路来实现。由于实现缓冲错误保护功能需要加大电路面积以及采用更复杂的设计,大大增加成本,因此硬件取位电路一般不带有缓冲错误保护功能,而帧大小判别器3可有效防止硬件取位电路出错。因此在本实施例中,取位器2在取位前通过帧大小判别器3确认异步先进先出存储器1是否保存有足够量数据,以保证取位器2的正确取位。控制器4分别与帧大小判别器3、解码及错误检测装置5和后处理模块6耦接,用于控制和协调整个音频解码器的工作。当帧大小判别器3检查到异步先进先出存储器1中缓存有至少当前解码所需数据长度的数据时,控制器4控制取位器2执行获取异步先进先出存储器1中的数据的操作,并控制取位器2将获取到的数据传递给解码及错误检测装置5以对待解码的码流进行解码操作以及错误检测。当解码及错误检测装置5完成解码操作以及错误检测后,控制器4进一步控制解码及错误检测装置5将已解码的码流数据传递给后处理模块6进行后续处理以还原出原始的音频数据。
解码及错误检测装置5分别与取位器2和后处理模块6耦接,用于解码码流中的数据帧,并根据数据帧的长度信息和已解码数据位数判断数据帧是否出错。其中,数据帧的长度信息可从数据帧的帧头提供的信息、或数据帧的规格书(Specification)中提供的信息、或通过其它途径传递到解码端的信息获取得到。
以AAC为例来说,解码及错误检测装置5通过取位器2从异步先进先去存储器1获取若干数据位数后,通过查表(例如,二叉树搜索方法)得到解码出来的尺度因子或频谱数据。在解码的过程中,解码及错误检测装置5进一步判断数据帧是否出错,若出错,进行出错处理。
后处理模块6分别与解码及错误检测装置5和音频输出模块7耦接,用于接收解码后的码流数据并对接收到的数据进行后续处理,接着将完成处理的数据输出给音频输出模块7。以AAC为例,后处理模块6对解码后的尺度因子或频谱数据进行反量化、应用尺度因子、预测、声强/耦合、瞬时噪声定形、滤波器组和增益控制等处理后,得到脉冲编码调制(Pulse-code modulation,PCM)音频数据。本领域技术人员了解音频处理中后处理模块6,在此不再赘述。
音频输出模块7分别与后处理模块6和模数转换器8耦接,用于接收处理后的数据,并通过模数转换器8将处理后的数据转换为模拟信号,接着输出给喇叭(未图示)。
请参照图2,图2是图1中的解码及错误检测装置第一范例的结构示意图。如图2所示,解码及错误检测装置5包括:解码模块10、第一判断模块11和出错处理模块12。
解码模块10分别与取位器2和后处理模块6耦接,用于从取位器2获取待解码的码流数据后,解码码流中的数据帧,进一步将解码后的码流数据传送给后处理模块6。第一判断模块11与解码模块10耦接,在解码模块10执行解码码流中的数据帧的操作时,根据数据帧的长度信息和已解码数据位数判断数据帧是否出错。出错处理模块12与第一判断模块11耦接,在第一判断模块11判断数据帧出错时,对数据帧进行出错处理。
请参照图3,图3是图1中的解码及错误检测装置第二范例的结构示意图。如图3所示,解码及错误检测装置5包括:解码模块20、第一判断模块21和出错处理模块22。
解码模块20、出错处理模块22和图2解码及错误检测装置第一范例中的解码模块10、出错处理模块12类似,在此不再赘述。
当解码模块20依据码表解码数据帧时,第一判断模块21根据码表和当前取位数判断数据帧是否出错。具体来说,第一判断模块21包括码长范围获取单元211和第二判断单元212。
码长范围获取单元211与解码模块20耦接,用于获取与码表中当前取位数据对应的码字的码长范围。
第二判断单元212与码长范围获取单元211耦接,从码长范围获取单元211获取码长范围后,判断当前取位数是否在码长范围内。其中,当第二判断单元212判断当前取位数未在码长范围内时,出错处理模块22对数据帧进行出错处理。
请参照图4,图4是图1中的解码及错误检测装置第三范例的结构示意图。如图4所示,解码及错误检测装置5包括:解码模块30、第一判断模块31和出错处理模块32。
解码模块30、出错处理模块32和图2解码及错误检测装置第一范例中的解码模块10、出错处理模块12类似,在此不再赘述。
当解码模块30依据码表解码数据帧时,第一判断模块31根据长度信息判断累计取位数是否在数据帧的长度范围内以判断数据帧是否出错。具体来说,第一判断模块31包括剩余数据位数获取单元311、预定数据位数范围获取单元312和第一判断单元313。
剩余数据位数获取单元311与解码模块30耦接,用于根据累计取位数获取数据帧内未解码的剩余数据位数。具体来说,剩余数据位数获取单元311用于根据长度信息和累计取位数获取数据帧内未解码的剩余数据位数。其中,剩余数据位数对应于数据帧的长度和累计取位数之差。
预定数据位数范围获取单元312与解码模块30耦接,用于根据码表获取数据帧内未解码的码字对应的预定数据位数范围。具体来说,预定数据位数范围获取单元312分别获取数据帧内未解码的码字所使用的码表的码长范围,根据未解码的码字所使用的码表的码长范围获取未解码的码字对应的预定数据位数范围。其中,预定数据位数范围对应于未解码的码字所使用的码表的码长范围的累计求和值。
第一判断单元313分别与剩余数据位数获取单元311和预定数据位数范围获取单元312耦接,用于从剩余数据位数获取单元311获取剩余数据位数,从预定数据位数范围获取单元312获取预定数据位数范围,判断剩余数据位数是否在预定数据位数范围内。其中,当第一判断单元313判断剩余数据位数未在预定数据位数范围内,出错处理模块32对数据帧进行出错处理。
请参照图5,图5是图1中的解码及错误检测装置第四范例的结构示意图。如图5所示,解码及错误检测装置5包括:解码模块40、第一判断模块41、出错处理模块42和第二判断模块43。
解码模块40、出错处理模块42和图2解码及错误检测装置第一范例中的解码模块10、出错处理模块12类似,在此不再赘述。
解码模块40依据码表解码数据帧时,第一判断模块41根据长度信息判断累计取位数是否在数据帧的长度范围内,以及判断当前取位数是否在码长范围内来判断数据帧是否出错。
具体来说,第一判断模块41包括剩余数据位数获取单元411、预定数据位数范围获取单元412、第一判断单元413、码长范围获取单元414和第二判断单元415。
剩余数据位数获取单元411、预定数据位数范围获取单元412、第一判断单元413和图4中剩余数据位数获取单元311、预定数据位数范围获取单元312、第一判断单元313类似,码长范围获取单元414和第二判断单元415和图3中码长范围获取单元211和第二判断单元212类似,为简洁起见,此处不再赘述。
另外,第二判断模块43分别与第一判断单元413和解码模块40耦接,当第一判断单元413判断剩余数据位数在预定数据位数范围内时,第二判断模块43进一步判断是否已完成数据帧内所***字的解码;若第二判断模块43判断未完成数据帧内所***字的解码,解码模块40依据码表解码当前数据帧中的码字;若第二判断模块43判断已完成数据帧内所***字的解码,解码模块40依据码表解码码流中的下一数据帧。
图6是本发明第一实施例的检测变长编码码流错误的方法的流程图。需注意的是,若有实质上相同的结果,本发明的方法并不以图6所示的流程顺序为限。如图6所示,该方法包括如下步骤:
步骤S201:解码码流中的数据帧;
步骤S202:根据数据帧的长度信息和已解码数据位数判断数据帧是否出错。
在步骤S201中,码流可以为AAC、MP3、APE、FLAC、APLC或其他变长编码音频格式的码流,码流以数据帧的格式传输编码后的音频数据,码流中的数据帧被解码后还原出码流中的音频数据。
在步骤S202中,数据帧的长度信息可从数据帧的帧头提供的信息、或数据帧的规格书(Specification)中提供的信息、或通过其它途径传递到解码端的信息获取得,已解码数据位数为数据帧中已解码的帧数据的比特数。根据数据帧的长度信息和已解码数据位数之间的差异,可以判断数据帧在解码的过程中是否发生数据帧解码错误,进而进行相应的出错处理。
通过上述实施方式,本发明第一实施例的检测变长编码码流错误的方法通过数据帧的长度信息和已解码数据位数来判断数据帧是否出错,实现了在CRC校验前即能检测出数据帧出错,从而避免数据帧出错导致的***异常。具体来说,上述方法避免了因数据帧解码错误而出现声音不连续或尖锐爆音,甚至导致***当机的问题。
图7是本发明第二实施例的检测变长编码码流错误的方法的流程图。需注意的是,若有实质上相同的结果,本发明的方法并不以图7所示的流程顺序为限。如图7所示,该方法包括如下步骤:
步骤S301:解码码流中的数据帧;
在本实施例中,步骤S301与图6中的步骤S201类似,在此不再赘述。
步骤S302:根据长度信息判断累计取位数是否在数据帧的长度范围内,若是,返回步骤S301,若否,执行步骤S303;在步骤S302中,累计取位数为从数据帧中累计已解码的数据位数。
举例来说,假设数据帧中有5个码字,其分别为A1、A2、A3、A4、A5,其对应的数据位数(以字节(Byte)为单位)分别为2、3、4、3、2。通常,对数据帧的解码是顺序进行的,也即解码出A1后再解码A2,解码出A2后再解码A3,……,依此类推,直至解码出数据帧中所有数据。在正常解码的条件下,假设已解码出A2,则对应的累计取位数为A1、A2的数据位数之和,即5字节;又假设已解码出A3,则对应的累计取位数为A1、A2、A3的数据位数之和,即9字节。
下面将承接上述举例阐述根据数据帧的长度信息判断累计取位数是否在数据帧的长度范围内的具体操作。
数据帧的长度信息可从数据帧的帧头提供的信息、或数据帧的规格书中提供的信息、或通过其它途径传递到解码端的信息获取得到。在本实施例中,获取得到的数据帧的长度为2+3+4+3+2,即14字节。
假设解码出A4时解到的位置是数据帧中的第15个字节,即累计取位数为15字节,此时累计取位数(15字节)大于长度信息(14字节),则可以判断出解码出A4时所对应的累计取位数大于数据帧的长度,也即解码出A4时所对应的累计取位数不在数据帧的长度范围内,数据帧出错。
假设已解码出最后一个编码数据,也即A5,此时解到的位置是数据帧中的第12个字节,也即累计取位数为12字节,此时,累计取位数小于长度信息,也即12字节小于14字节,可以判断出解码出A5所对应的累计取位数小于数据帧的长度,也即解码出A5所对应的累计取位数不在数据帧的长度范围内,数据帧出错。
步骤S303:对数据帧进行出错处理。在步骤S303中,出错处理包括丢弃码流中的出错帧或者将码流中的出错帧输出静音等等。
通过上述实施方式,本发明第二实施例的检测变长编码码流错误的方法根据数据帧的长度信息判断累计取位数是否在数据帧的长度范围内来判断数据帧是否出错,具体来说,当未完成数据帧的解码而出现累计取位数超出数据帧的长度范围,或当完成数据帧的解码而出现累计取位数小于数据帧的长度范围,则可判断出数据帧出错,从而解决了现有技术在数据帧解码完成后才能通过CRC校验检测出数据帧出错,避免数据帧出错导致的***异常。
图8是本发明第三实施例的检测变长编码码流错误的方法的流程图。需注意的是,若有实质上相同的结果,本发明的方法并不以图8所示的流程顺序为限。如图8所示,该方法具体包括如下步骤:
步骤S401:依据码表解码码流中的数据帧。
步骤S402:根据累计取位数获取数据帧内未解码的剩余数据位数;在步骤S402中,根据数据帧的长度信息和累计取位数获取数据帧内未解码的剩余数据位数,其中,累计取位数为从数据帧中累计已解码的数据位数。
以AAC单声道码流为例,AAC单声道码流结构如下所示:
数据帧的结构如下所示:
数据帧包括帧头(FRAME HEADER),单声道单元(Signal_Channel_Element,简写为SCE)和结束单元(Terminator,简写为TERM)。具体来说,帧头包括12比特的帧头同步字(Syncword)“1111 1111 1111”和13比特的帧长度字(AAC_Frame_Length);SCE包括独立通道流信息(Ics_info)数据和缩放因子带(Scalefactor Band,SFB)数据,SFB数据采用huffman VLC编码,每个SFB数据就是一个码字,SFB数据位于帧尾;TERM固定为0X07,以标识数据帧的结束。
在对数据帧解码的过程中,通过读取AAC_Frame_Length的值可以获取数据帧长度,该长度为数据帧的整个长度,可以理解为其它数据长度和SFB数据长度之和。其中,其它数据长度为帧头长度、Ics_info长度等等的累计和。
假设从AAC_Frame_Length得到数据帧的长度为163个字节,从Ics_info获取得到传输的SFB数据的总数(MAX_SFB)为36个。
数据帧解码的过程中,假设已解码出第1个SFB,此时解到的位置是数据帧中的第120个字节,也即累计取位数为120字节-其它数据长度,此时,数据帧内未解码的剩余数据位数RENAIN_BITS=SFB数据长度-累计取位数,而根据上述文件结构可知,SFB数据长度=163字节-其它数据长度,故数据帧内未解码的剩余数据位数:
REMAIN_BITS=SFB数据长度-累计取位数=163-120=43字节。
步骤S403:根据码表获取数据帧内未解码的码字对应的预定数据位数范围;在步骤S403中,首先分别获取数据帧内未解码的码字对应于其所使用的码表的码长范围,然后根据码长范围获取所有未解码的码字对应的预定数据位数范围。其中,预定数据位数范围对应于未解码的码字所使用的码表的码长范围的累计求和值。
以AAC单声道码流为例来说,SCE中包括区段数据(Section_Data),从Section_Data可获取得到SCE中每个SFB数据使用的码表信息。具体来说,从Section_Data可获取得到未解码的码字对应的码表信息。例如,根据Section_Data得知,第2-36个SFB使用的码表分别为:第2-14个SFB使用码表6,第15-27个SFB使用码表4,第28-36个SFB使用码表2。举例来说,码表6中的码字的码长范围为大于等于4比特小于等于11比特,码表4中的码字的码长范围为大于等于4比特小于等于11比特,码表2中的码字的码长范围为大于等于3比特小于等于9比特。
未解码的码字的预定数据位数范围的最大值MAX_BITS为第2-36个SFB所使用的码表的最大码长的累计求和值,即当第2-14(共13)个SFB的码长取11比特,第15-27(共13)个SFB的码长取11比特,第28-36(共9)个SFB的码长取9比特时,最大码长范围为:
MAX_BITS=11*13+11*13+9*9=367比特。
未解码的码字的预定数据位数范围的最小值MIN_BITS为第2-36个SFB所使用的码表的最小码长的累计求和值,即当第2-14个SFB的码长取4比特,第15-27个SFB的码长取4比特,第28-36个SFB的码长取3比特时,最小码长范围为:
MIN_BITS=4*13+4*13+3*9=131比特。
步骤S404:判断剩余数据位数是否在预定数据位数范围内,若在预定数据位数范围内,执行步骤S405,若不在预定数据位数范围内,执行步骤S407;
以AAC单声道码流为例来说,已解码出第1个SFB后剩余数据位数为43字节,也即344比特,预定数据位数范围为大于等于131比特小于等于367比特,因344比特在131比特与367比特的范围内,说明在解码出第1个SFB后,剩余数据位数在预定数据位数范围内,则继续执行步骤S405。
假设已解码出第1个SFB后,此时解到的位置是数据帧中的第116个字节,则剩余数据位数=163-116=47字节=374比特,其大于预定数据位数范围的最大值367比特,说明在解码出第1个SFB后,剩余数据位数不在预定数据范围内,继续执行步骤S407。
步骤S405:判断是否已完成数据帧内所***字的解码,若未完成,继续执行步骤S401,若已完成,执行步骤S406;在步骤S405中,可将已解码的最大码字序号与数据帧中码字的总数相比较并判断两者是否相等;若不相等,则表示未完成数据帧内所***字的解码,继续执行步骤S401;若相等,则表示已完成数据帧内所***字的解码,继续执行步骤S406。
以AAC单声道码流为例来说,假设已解码出第20个SFB,则已解码的最大码字序号为20,其小于MAX_SFB36,需继续解码数据帧中的第21个SFB。假设已解码出第36个SFB,则已解码的最大码字序号为36,其等于MAX_SFB,则表示数据帧已解码完毕,继续进行码流中下一数据帧的解码。
步骤S406:依据码表解码码流中下一数据帧;
步骤S407:对数据帧进行出错处理。在步骤S407中,对数据帧进行出错处理后,对排列在出错帧后的数据帧,可以通过寻找帧同步头的方式确定数据帧的起始位置,继而通过对数据帧继续进行解码操作以还原出原始数据。
过上述实施方式,本发明第三实施例的检测变长编码码流错误的方法根据未解码的剩余数据位数是否在预定数据位数范围来判断数据帧是否出错,可检测出因码流位反转或者其它传输错误而导致的数据帧出错,避免了数据帧出错导致的***异常。
图9是本发明第四实施例的检测变长编码码流错误方法的流程图。需注意的是,若有实质上相同的结果,本发明的方法并不以图9所示的流程顺序为限。如图9所示,该方法包括如下步骤:
步骤S501:依据码表解码码流中的数据帧;在本实施例中,步骤S501与图8中的步骤S401类似,在此不再赘述。
步骤S502:根据码表和当前取位数判断数据帧是否出错。在步骤S502中,获取与码表中当前取位数对应的码字的码长范围;判断当前取位数是否在码长范围内;若当前取位数未在码长范围内,则对数据帧进行出错处理。
当前取位数为当前解码的码字所对应的取位数。在嵌入式***中,码表一般保存在静态随机存储器(SRAM)或动态随机存储器(DRAM)中,其与***中的其它数据统一编址。本领域技术人员可以了解,不管是SRAM还是DRAM,其存储单元的内容可按需随意取出或存入。如果解码出错或者其它解码异常,在对SRAM或DRAM的存储单元进行存入操作时,有可能导致码表的内容被修改或覆盖,进而导致当前取位数不在码长范围内。
举例来说,假设码表中有6个码字a1,a2,a3,a4,a5,a6分别为10、11、000、001、010、0110,可知当前码表的码长范围为大于等于2比特小于等于4比特。若在解码的过程中码表中的码字a1被修改为11011,a2被修改为10,假设待解码的码流为1101101011,则根据码表解码出第1个码字的原始值为a1,解码出第1个码字对应的当前取位数为5比特,依次为11011,其大于当前码表的最大码长4比特,说明当前取位数不在码表的码长范围内,由此可判断出在数据帧解码的过程中发生错误,进而进行出错处理。
在本实施例中,进行出错处理可以为重新初始化存储在存储器中的码表,以保证后续数据帧的正确解码。
通过上述实施方式,本发明第四实施例的检测变长编码码流错误的方法根据码表和当前取位数来判断数据帧是否出错,可以检测出因存储在随机存储器中码表发生变化而导致的数据帧出错,避免数据帧出错导致的***异常。
图10是本发明第五实施例的检测变长编码码流错误的方法的流程图。需注意的是,若有实质上相同的结果,本发明的方法并不以图10所示的流程顺序为限。
如图10所示,图10与图8中第三实施例主要区别在于:
在步骤S401后,图10进一步包括步骤S601和S602,具体如下所示:
步骤S601:获取与码表中当前取位数对应的码字的码长范围;
具体而言,在图8实施例的基础上,当步骤S401执行完毕后,获取当前已解码的码字对应的码长范围,也就是说,获取当前已解码的码字所使用的码表的码长范围。
步骤S602:判断当前取位数是否在码长范围内,若在码长范围内,则继续执行步骤S402,若不在码长范围内,则继续执行步骤S407。在步骤S602中,若当前取位数在码长范围内,则表示数据帧的当前码字的解码正常。若当前取位数不在码长范围内,则表示数据帧的解码在当前码字已经发生错误。
图10所示流程图的其他步骤均已揭露于图8中,为简洁起见,此处不再赘述。通过上述实施方式,本发明第五实施例的检测变长编码码流错误的方法,首先通过判断当前取位数是否在码长范围内判断数据帧是否出错,然后通过判断未解码的剩余数据位数是否在预定数据位数范围进一步判断数据帧是否出错,可检测出因为码流位反转或者其它传输错误,以及因存储在随机存储器中码表发生变化而导致的数据帧出错,避免了数据帧出错而导致的***异常。
图11是本发明第六实施例的检测变长编码码流错误的方法的流程图。需注意的是,若有实质上相同的结果,本发明的方法并不以图11所示的流程顺序为限。
如图11所示,图11与图8中第三实施例主要区别在于:
在步骤S404后,图11进一步包括步骤S701和S702。
图11所示流程图中的步骤S701和步骤S702与图10中的步骤S601和步骤S602类似,图11所示流程图的其他步骤均已揭露于图8中,为简洁起见,此处不再赘述。
通过上述实施方式,本发明第六实施例的检测变长编码码流错误的方法,首先通过判断未解码的剩余数据位数是否在预定数据位数范围判断数据帧是否出错,然后通过判断当前取位数是否在码长范围内进一步判断数据帧是否出错,可检测出因为码流位反转或者其它传输错误,以及因存储在随机存储器中码表发生变化而导致的数据帧出错,避免了数据帧出错而导致的***异常。
以上所述仅为本发明的实施方式,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。