哥伦布k阶编解码

K阶指数哥伦布码

  在H.264中,使用CABAC需要进行二值化处理,而指数哥伦布编码就是CABAC的一种二值化处理的方法。k阶指数哥伦布编解码具体过程如下:

A、编码过程:假设待编码数字为CodeNum(必须非负整数)

  指数哥伦布编码后的形式为[MZeors][1][Info],MZero表示M个0。

    1、将CodeNum以二进制形式表示(若不足k位,前面补0),去掉后面k位(若刚好是k位,去掉k位后得0),将结果(数值)加1,得到二进制数T1;

    2、M为二进制数T1的二进制位数减一;

    3、然后将第一步中舍去的k位接到T1结尾,就得到[1][Info]。

  设[Info]的二进制位数为I,编码过程也可以如下描述:

    [1 Info] 是CodeNum+2^k的二进制表示,MZeros中0的个数M = I - k。

    于是就有总的编码长度CodeLen = M + 1 + I =2M+k+1。 

B、解码过程:

  1、读入连续0,连续0的个数就是M;

  2、计算CodeLen = 2M+k+1,得到[1 Info]的位数是 I=CodeLen - M =M+K+1;

  3、读入I位二进制码字,转换成10进制,假设为W。由W = CodeNum + 2^k,得CodeNum = W-2^K。

C、示例:

  对于 k =0时:CodeNum=3。编码如下:

    二进制表示为11,去掉k=0位后加1得100;

    所以M=2;

    所以编码后结果为[MZeros][1][Info] = [MZeros][1 Info] = 00100

  解码如下:

    读入连续2个0,所以M=2;CodeLen=2M+1+k=5;所以需要再读入3个码流100,[1 Info]就是100,转成十进制结果W为4,所以CodeNum = W-2^K=4-1=3;

  同样对于k=0,CodeNum=6时,编码为:00111;

  同样对于k=3,CodeNum=3时,编码为:1011;

  同样对于k=3,CodeNum=6时,编码为:1110;

  同样对于k=3,CodeNum=10时,编码为:010010;


附:简单来说有两种解码方法

 (1)解析过程为1前面有几个0,1后面就跟几位,然后计算结果再减1
 (2)2的n次方-1,再加上v,n代表1前面0的个数,v是1后面的n比特计算值
 (3)以上两种是无符号的解析,有符号的解析为映射,codenum为无符号解析出来的值
 

### 哥伦布在FPGA上的解码方法 哥伦布(Golomb coding)是一种无损数据压缩算法,在图像和视频编领域广泛应用。对于哥伦布在FPGA上实现解码的方法,主要涉及以下几个方面: #### 1. 参数设置与初始化 为了适应不同的应用场景需求,首先需要设定哥伦布中的参数m值。该参数决定了编效率以及解码复杂度之间的平衡关系[^1]。 ```cpp // 设置哥伦布参数 m int golomb_param_m = 8; ``` #### 2. 输入比特流解析 通过读取输入的数据流来获取待解码的信息。由于哥伦布采用变长编方式表示数值大小,因此需逐位分析直至遇到终止条件为止。 ```verilog module bit_reader ( input wire clk, input wire rst_n, output reg [7:0] byte_out, output reg valid_bit ); always @(posedge clk or negedge rst_n) begin if (!rst_n) begin // Reset logic here... end else begin // Bit reading and parsing logic here... end end endmodule ``` #### 3. 商余分离逻辑 根据哥伦布定义,每个被编数n可分解成商q=n/m及其对应的二进制形式加上余数r=n%m两部分。此过程可以通过简单的除法运算完成,并且可以在硬件电路中高效执行。 ```vhdl -- VHDL code snippet for quotient and remainder extraction process(clk) begin if rising_edge(clk) then -- Quotient calculation q = n / m quotient <= std_logic_vector(unsigned(input_data) srl param_m); -- Remainder calculation r = n mod m remainder <= std_logic_vector(unsigned(input_data) rem to_unsigned(param_m, remainder'length)); end if; end process; ``` #### 4. 结果重组模块 最后一步是将上述得到的商和余数组合成最终的结果输出给后续处理单元。这通常涉及到一些额外的状态机控制机制以确保整个流程按预期工作。 ```c++ class GolombDecoder { public: int decode() { while (true /* condition */) { auto [quotient, remainder] = readQuotientAndRemainder(); int decodedValue = reconstructValue(quotient, remainder); return decodedValue; } } private: pair<int,int> readQuotientAndRemainder(); // Implementation omitted. int reconstructValue(int quotient, int remainder); // Reconstruct value from parts. }; ``` 以上就是在FPGA平台上针对哥伦布进行解码的一种可能方案。实际应用时还需要考虑更多细节优化性能并满足具体项目的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值