-
Notifications
You must be signed in to change notification settings - Fork 0
/
huffman_ac_decoding.asv
63 lines (44 loc) · 1.69 KB
/
huffman_ac_decoding.asv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
%% this function is to do the Inverse huffman coding
%% the input should be the whole sequence including the output
%% AC components and EOB, the idea is to match the sequence with the code in
%% decode table, get the category of the value then cut the relative number,
%% change them into decimal
function [ac_dehuff]=huffman_ac_decoding(blockbit_seq)
ac_dehuff=[];point=1;
len=length(blockbit_seq);
for i = point:len
temp_ac = blockbit_seq(point:i);
group_ac = detableAC2(temp_ac);
if group_ac(1,1)==0 && group_ac(1,2)==0; % EOB reached.
group_ac;
break
elseif group_ac(1,2) >= 0 && group_ac(1,2) <= 10;%get correct output, while doing the loop the category_dc
group_ac; %would be 11
for zero = 1: group_ac(1,1)
ac_dehuff=[ac_dehuff, 0];
end
%ac_dehuff = [ac_dehuff zeros(1,group_ac(1,1));
if group_ac(1,2)==0;
ac_dehuff=[ac_dehuff, 0];
else
r_ac = blockbit_seq(i+1:i+group_ac(1,2));
if r_ac(1)=='0'; %% if it's a negative number
for j=1:length(r_ac)
if r_ac(j)=='0';
r_ac(j)='1';
else
r_ac(j)='0';
end
end
r_new=-bin2dec(r_ac);
else r_new=bin2dec(r_ac);
end
r_new;
ac_dehuff=[ac_dehuff,r_new];
end
point=i+group_ac(1,2)+1;
i=point;
ac_dehuff;
end
end %finish AC part
ac_dehuff;