3.4 并行编码
在区间计算过程中,high 和low 总是有限值,不可能无限制地划分下去。为了能够实现连续的编码,通过对high 和low 的处理,可以实现利用有限长的寄存器表示无限精度的区间,即在不断修改high 和low 的过程中输出high 和low 中相同的高端位,形成输出码流。详细过程如下:
high = 00110110
low = 00100111
输出码流为001,而high 和low 的结果为:
high = 10110111
low = 00111000
通过这种连续地处理便可生成符号序列的 自适应 算术编码 结束。但随着待编码符号序列的不断输入,可能会出现high 和low 十分接近,并且high 和low 的首位没有相同位的情况,如:
high = 10000000
low = 01111111
称这种现象为产生了下溢。产生下溢后,后面的编码都失去了意义,此时需要特殊处理。
对于下溢的处理方法为:保留首位,同时删除紧接在首位后的high 中连续的0 和low 中连续的1,并且保证对high 和low 删除的位数相同,若连续0 和连续1 的位数不同,则取其较小者;然后high 和low 左移相同的位数,同时high 的低位补1,low 的低位补0。表4给出了下溢处理前后high 和low 值。
表4 下溢处理前后对照表
经过处理后,扩大了区间,使得后面的编码可以顺利地进行。
在考虑了下溢的编码输出中,下溢作为输出码流的一部分,使得解码时能对下溢进行同样的处理,达到编解码的一致。但是下溢产生后并不马上输出,只记下下溢的个数,下溢则是在下一个符号编码时进行输出的。在下一个符号编码时,如果high 和low 比较后高端有相同位则输出下溢,即在第一个输出后紧接着插入首位的反,插入首则反的个数为前面产生下溢的个数,然后输出相同的次高位及以后相同的各位。这样处理既保留了下溢的信息又使得输出码流不偏离编码符号所在的子区间,使得解码时很容易处理。但是如此high 和low 比较后没有相同输出则不输出下溢,而是把两次产生的下溢的个数进行累加,再输入下一个符号,直到high 和low 有相同首位才输出下溢。
例如:在一个符号编码计算后得到的high=11010010 和low=11001101,而前一个符号编码产生的下溢为1 个,比较后输出为1010,同时记录下产生的下溢2 个,如表5 所示。
表5 含有下溢的编码输出
3.5 串行输出
并行编码后产生的码流存储在并行数据中,但在大多的情况下只有两、三个输出,甚至没有输出,若采用并行输出,就会产生极大的浪费。为了充分利用资源,在并行编码之后进行并/串转换,使其一位一位地输出,并且这个输出过程与下一个符号编码的过程并行完成,因此并不占用多余的时钟周期。
在编码过程中,当一个符号编码结束后,触发reload 信号,通知此次编码结束,进行下一次编码,读取输入的符号。同时需判断输入是否合法,如果是合法的输入,就进行编码;否则停止编码,否则停止编码,处于等待状态,直到复位信号ret 置1,重新初始化、编码。
点击看原图
4 仿真结果
本文算法采用VHDL 硬件描述语言实现,并在ALTERA 公司的MAX+plusⅡ软件上编译仿真。市府采用全局同步时钟,避免了毛剌的产生,保证了信号的稳定性。编码的仿真结果如图书3 所示。
www.55dianzi.com
其中,rst、clk、c 为输入信号,rst 为模块中各寄存器的初始化信号,clk 为时钟同步信号,而c 则为输入的编码信号;out_flag、out_bit、reload、end_code、为输出信号,out_flag和out_bit 分别为输出标志位和输出位(若out_falg=1,则此时out_bit 为有效输出;否则out_bit 输出无效),reload 为一个符号编码结束)下一个符号输入的标志位,end_code为编码结束的标志(若end_code=0,则继续编码,否则编码结束)。在进行性能仿真时[4],采用的器件是FLEX1K 系列的EP1K30TC144-1 器件,其最大工作频率为40MHz,消耗1533 个LC,平均编码时间为20 个时钟周期。一个符号的编码时间不到500ns,对于QCIF 格式的图像完全可以满足每秒钟实时编码30 帧图像的要求。
自适应 算术编码 是一种效率很高的无失真编码,本文通过VHDL 语言实 现了自适应的算术编码,在编码过程中,根据硬件结构的特点,充分利用其并行特性。通过并行执行,实现了速度的优化。由于满足每秒钟编码30 帧图像的要求,因此可以应用于视频图像的实时编码中。
本文关键字:暂无联系方式DSP/FPGA技术,单片机-工控设备 - DSP/FPGA技术