-
Notifications
You must be signed in to change notification settings - Fork 0
/
GolombRiceEncoderFunc.m
61 lines (56 loc) · 1.71 KB
/
GolombRiceEncoderFunc.m
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
function [encoded,m,bitstreamlength1] = GolombRiceEncoderFunc(seq, fileID)
% In this function, as proposed in forums and bibliography for the simple
% and non adaptive case of Golomb Rice coding we need to search
% exhaustively over the set to find the optimal m
% Reminder : the decoder only needs to know the encoded sequence and m.
%% INIT
mu=1;
j=0;
[block_length,total_blocks]=size(seq);
%% Find the maxmimum value m can take
while(1)
j=j+1;
mu=mu*2;
if(mu>max(max(seq)))
mu=mu/2;
break
end
end
%% Find m that gives the minimum length of encoded sequence
minimum=99999;
m=1;
while m<= mu
golomb_index=0;
len=0;
k=0;
for i=1:total_blocks
sequence=seq;
for j2=1:block_length
k=k+1;
golomb_index=golomb_index+1;
encoded_bitstream{golomb_index} = GolombRiceEncoder(sequence(j2,i),m); %m=2^k
bitstreamlength(k) = length(encoded_bitstream{golomb_index});
% fwrite(fileID, encoded_bitstream{golomb_index},'ubit1');
len=len+bitstreamlength(k);
end
end
len=len/(total_blocks*block_length);
if len < minimum
minimum = len;
minM=m;
end
m=m*2;
end
golomb_index=0;
%% At last, perform the encoding
for i=1:total_blocks
sequence=seq;
for j2=1:block_length
golomb_index=golomb_index+1;
encoded{golomb_index} = GolombRiceEncoder(sequence(j2,i),minM); %m=2^k
bitstreamlength1(golomb_index) = length(encoded{golomb_index});
fwrite(fileID, encoded{golomb_index},'ubit1');
end
end
m=minM;
end