Download Run Length Encoder/Decoder

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts

Elementary mathematics wikipedia , lookup

Transcript
Run Length
Encoder/Decoder
EE113D Project
Authors: Imran Hoque
Yipeng Li
Diwei Zhang
Introduction – What is RLE?

Compression technique
• Represents data using value and run length
• Run length defined as number of consecutive
equal values
e.g
1110011111
RLE
130215
Values
Run Lengths
Introduction - Applications

Useful for compressing data that contains
repeated values
• e.g. output from a filter, many consecutive
values are 0.


Very simple compared with other
compression techniques
Reversible (Lossless) compression
• decompression is just as easy
Introduction - Applications

Image Compression – JPEG
Run Length Encoder!
Introduction


Compression effectiveness depends on input
Must have consecutive runs of values in order
to maximize compression
• Best case: all values same

Can represent any length using two values
• Worst case: no repeating values


Compressed data twice the length of original!!
Should only be used in situations where we
know for sure have repeating values
Encoder - Algorithm


Start on the first element of input
Examine next value
• If same as previous value


Keep a counter of consecutive values
Keep examining the next value until a different
value or end of input then output the value
followed by the counter. Repeat
• If not same as previous value

Output the previous value followed by ‘1’ (run
length. Repeat
Encoder – Matlab Code
% Run Length Encoder
% EE113D Project
function encoded = RLE_encode(input)
my_size = size(input);
length = my_size(2);
run_length = 1;
encoded = [];
for i=2:length
if input(i) == input(i-1)
run_length = run_length + 1;
else
encoded = [encoded input(i-1) run_length];
run_length = 1;
end
end
if length > 1
% Add last value and run length to output
encoded = [encoded input(i) run_length];
else
% Special case if input is of length 1
encoded = [input(1) 1];
end
Encoder – Matlab Results
>> RLE_encode([1 0 0 0 0 2 2 2 1 1 3])
ans =
1
1
0
4
2
3
1
2
3
1
>> RLE_encode([0 0 0 0 0 0 0 0 0 0 0])
ans =
0 11
>> RLE_encode([0 1 2 3 4 5 6 7 8 9])
ans =
0
1
1
7
1
1
1
8
2
1
1
9
3
1
1
4
1
5
1
6
Encoder

Input from separate .asm file
• In the form of a vector
• e.g. ‘array .word

4,5,5,2,7,3,6,9,9,10,10,10,10,10,10,0,0’
Output is declared as data memory space
• Examine memory to get output
• Originally declared to be all -1.

Immediate Problem
• Output size not known until run-time (depends on input
size as well as input pattern)

Cannot initialize variable size array
Encoder

Solution
• Limit user input to preset length (16)
• Initialize output to worst case (double input
length – 32)
• Initialize output to all -1’s (we’re only handling
positive numbers and 0 as inputs)
• Output ends when -1 first appears or if length
of output equals to worst case
Encoder – DSP Code
;*******************************************************************
;EE113D Final Project
(encoder)
;
;Run Length Encoder: Shortens a series of input data by representing
;consecutive repeated numbers as the repeated number, followed by
;the number of repetitions.
;
;(Written by: Yi-peng Li, Diwei Zhang, Imran Hoque)
;
.setsect ".text", 0x500,0
.setsect ".data", 0x800,1
;Executible code in ".text"
;section will begin at 0x500
;in program memory
;Numbers to be sorted will
;begin at 0x800 in data memory
.data
;Data section begins
.copy "e_inputs.asm"
;Reads input values and initialize output
.text
;Executible code section begins.
count1
.set 1
;Initialize a counter starting at the number 1
count2
.set 15
;Initialize a counter starting at the number 15
Encoder – DSP Code
AR6 = #array
AR3 = #array
A = *AR3+
A = *AR3
AR5 = A
A = *AR6
AR0 = A
AR4 = #output
AR2 = #count2
;AR6 points to the input data location
;AR3 points to the next input data location
;AR5 represents the actual number stored
;in the memory address AR3 points to
;(the actual number represented in the input)
;AR0 represents the actual number stored
;in the memory address AR6 points to
;AR4 points to the output data location
;AR2 keeps track of how much of the input
;data has been read
;loop1 initializes the count of AR1 to '1'
loop1
AR1 = #count1
;Register AR1 is used to keep track of the
;number of repeated inputs in succession
;loop2 reads through the input data, and keeps
;track of the number of consecutive inputs
loop2 TC = (AR0 != AR5)
A = *AR6+
A = *AR3+
;Compares the number stored in AR5 with the
;number stored in AR0
;Increment the pointer AR6
;Increment the pointer AR3
Encoder – DSP Code
A = *AR3
AR5 = A
A = *AR6
;Re-initialize AR5
AR0 = A
if (TC) goto loop3
A = *AR1+
if (*AR2- != 0) goto loop2
A = *AR2+
;Re-initialize AR0
;Break loop if next number different
;else continue counting
;Stop encoder if count of AR2 reaches zero
;Leave count of AR2 at zero
;loop3 stores the encoded input, followed by
;its repeated count into the output array
loop3
A = *AR6A = *AR6
*AR4+ = A
A = AR1
*AR4+ = A
A = *AR6+
if (*AR2- != 0) goto loop1
stop
nop
goto stop
.end
;Point back to the last repeated number
;Add the repeated number to output
;Add the count of repeated number to output
;Move pointer back to where it left off
;Stop encoder if count of AR2 reaches zero
;infinite loop
Encoder – DSP Results
Input: 4,5,5,2,7,3,6,9,9,10,10,10,10,10,10,0,0
Output: 4,1,5,2,2,1,7,1,3,1,6,1,9,2,10,6,0,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1…
Valid Output
Output Ends Here
Best Case:
Input: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Output: 0,16,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1…
Worst Case:
Input: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
Output: 0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,1,10,1,11,1,12,1,13,1,14,1,15,1
Decoder – Matlab Code
% Run Length Decoder
% EE113D Project
% The input to this function should be the output from Run Length Encoder,
% which means it assumes even number of elements in the input. The first
% element is a value followed by the run count. Thus all odd elements in
% the input are assumed the values and even elements the run counts.
%
function decoded = RLE_decode(encoded)
my_size = size(encoded);
length = my_size(2);
index = 1;
decoded = [];
% iterate through the input
while (index <= length)
% get value which is followed by the run count
value = encoded(index);
run_length = encoded(index + 1);
for i=1:run_length
% loop adding 'value' to output 'run_length' times
decoded = [decoded value];
end
% put index at next value element (odd element)
index = index + 2;
end
Decoder – Matlab Results
>> RLE_decode([0 12])
ans =
0
0
0
0
0
0
0
0
0
0
0
0
>> RLE_decode([0 1 1 1 2 1 3 1 4 1 5 1])
ans =
0
1
2
3
4
5
>> RLE_decode(RLE_encode([0 0 3 1 4 4 5 6 10]))
ans =
0
0
3
1
4
4
5
6 10
Decoder – DSP Code
;*******************************************************************
;EE113D Final Project (decoder)
;
;Run Length Encoder: Takes as its input, a string of data encoded
;according the the run length encoder algorithm, and outputs it
;as the decoded string of data originally input to the encoder.
;(Written by: Yi-peng Li, Diwei Zhang, Imran Hoque)
.setsect ".text", 0x500,0
;Executible code in ".text“ section will begin at 0x500
;in program memory
.setsect ".data", 0x800,1
;Numbers to be sorted will begin at 0x800 in data memory
.data
.copy "d_inputs.asm"
;Data section begins
;Get input values and initialze outputs
.text
;Executible code section begins.
count2
.set 14
AR6 = #array
AR3 = #array
A = *AR3+
A = *AR3
AR5 = A
;Initialize a counter starting at the number 14
;AR6 points to the input data location
;AR3 points to the next input data location
;AR5 keeps track of the number of repetitions
Decoder – DSP Code
AR4 = #output
AR2 = #count2
;AR4 points to the output data location
;AR0 keeps track of how much of the input
;data has been read
;loop2 reads through the input data to the decoder
loop2
if (*AR5- != 0) goto loop3
;Keep outputting the current input number until
;the following count of that number reaches zero
;Else continue reading thru input
;Increment twice to get next number in output
A = *AR6+
A = *AR6+
A = *AR3+
A = *AR3+
;Increment twice to get the count of that number
A = *AR3
AR5 = A
;Re-initialize AR5
if (*AR2- != 0) goto loop2
;Stop encoder if count of AR2 reaches zero
goto stop
;loop3 stores the decoded output, by expanding the number of repeated inputs
loop3
A = *AR6
*AR4+ = A
goto loop2
stop
nop
goto stop
.end
;Add the repeated number to output
;infinite loop
Decoder – DSP Results
Input: 0,16
Output: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
Input: 1,5,0,11
Output: 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0
Conclusion


Results obtained from DSP match theoretical
results as well as Matlab results
Limitations:
• Does not handle negative numbers
• Input to encoder limited to 16 numbers in this
implementation

Future Improvements
• Variable input lengths
• Allocate memory for output real-time