Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Digital Signal Processing. The Scientist and Engineers Guide. Steven W. Smith

.pdf
Скачиваний:
166
Добавлен:
02.05.2014
Размер:
7 Мб
Скачать
☆

 

Chapter 26Neural Networks (and more!)

477

100 'ITERATIVE DESIGN OF RECURSIVE FILTER

 

110

'

 

 

120

 

'INITIALIZE

 

130

N% = 256

'number of points in FFT

 

140

NP% = 8

'number of poles in filter

 

150

DELTA = .00001

'perturbation increment

 

160

MU = .2

'iteration step size

 

170

DIM REX[255]

'real part of signal during FFT

 

180

DIM IMX[255]

'imaginary part of signal during FFT

 

190

DIM T[128]

'desired frequency response (mag only)

 

200

DIM A[8]

'the "a" recursion coefficients

 

210

DIM B[8]

'the "b" recursion coefficients

 

220

DIM SA[8]

'slope for "a" coefficients

 

230

DIM SB[8]

'slope for "b" coefficients

 

240

'

 

 

250

GOSUB XXXX

'mythical subroutine to load T[ ]

 

260

'

 

 

270

FOR P% = 0 TO NP%

'initialize coefficients to the identity system

 

280

A[P%] = 0

 

 

290

B[P%] = 0

 

 

300 NEXT P%

 

 

310

A[0] = 1

 

 

320

'

 

 

330

'

'ITERATION LOOP

 

340

FOR ITER% = 1 TO 100

'loop for desired number of iterations

 

350

GOSUB 2000

'calculate new coefficients

 

360

PRINT ITER% ENEW MU

'print current status to video screen

 

370

IF ENEW > EOLD THEN MU = MU/2

'adjust the value of MU

 

380 NEXT ITER%

 

 

390

'

 

 

400

'

 

 

410 FOR P% = 0 TO NP%

'PRINT OUT THE COEFFICIENTS

 

420

PRINT A[P%] B[P%]

 

 

430 NEXT P%

 

 

440

'

 

 

450 END

 

 

 

TABLE 26-4

 

3040 to 3080 load an impulse in the array, IMX[ ]. Next, lines 3100-3150 use this impulse as an input signal to the recursive filter defined by the current values of A[ ] and B[ ]. The output of this filter is thus the impulse response of the current system, and is stored in the array, REX[ ]. The system's frequency response is then found by taking the FFT of the impulse response, as shown in line 3170. Subroutine 1000 is the FFT program listed in Table 12-4 in Chapter 12. This FFT subroutine returns the frequency response in rectangular form, overwriting the arrays REX[ ] and IMX[ ].

Lines 3200-3250 then calculate ER, the mean squared error between the magnitude of the current frequency response, and the desired frequency response. Pay particular attention to how this error is found. The iterative action of this program optimizes this error, making the way it is defined very important. The FOR-NEXT loop runs through each frequency in the frequency response. For each frequency, line 3220 calculates the magnitude of the current frequency response from the rectangular data. In line 3230, the error at this frequency is found by subtracting the desired magnitude, T[ ], from the current magnitude, MAG. This error is then squared, and added to the

478

The Scientist and Engineer's Guide to Digital Signal Processing

accumulator variable, ER. After looping through each frequency, line 3250 completes the calculation to make ER the mean squared error of the entire frequency response.

Lines 340 to 380 control the iteration loop of the program. Subroutine 2000 is where the changes to the recursion coefficients are made. The first action in this subroutine is to determine the current value of ER, and store it in another variable, EOLD (lines 2040 & 2050). After the subroutine updates the coefficients, the value of ER is again determined, and assigned to the variable, ENEW (lines 2270 and 2280).

The variable, MU, controls the iteration step size, just as in the previous neural network program. An advanced feature is used in this program: an automated adjustment to the value of MU. This is the reason for having the two variables, EOLD and ENEW. When the program starts, MU is set to the relatively high value of 0.2 (line 160). This allows the convergence to proceed rapidly, but will limit how close the filter can come to an optimal solution. As the iterations proceed, points will be reached where no progress is being made, identified by ENEW being higher than EOLD. Each time this occurs, line 370 reduces the value of MU.

Subroutine 2000 updates the recursion coefficients according to the steepest decent method: calculate the slope for each coefficient, and then change the coefficient an amount proportional to its slope. Lines 2080-2130 calculate the slopes for the "a" coefficients, storing them in the array, SA[ ]. Likewise, lines 2150-2200 calculate the slopes for the "b" coefficients, storing them in the array, SB[ ]. Lines 2220-2250 then modify each of the recursion coefficients by an amount proportional to these slopes. In this program, the proportionality constant is simply the step size, MU. No error term is required in the proportionality constant because there is only one example to be matched: the desired frequency response.

The last issue is how the program calculates the slopes of the recursion coefficients. In the neural network example, an equation for the slope was derived. This procedure cannot be used here because it would require taking the derivative across the DFT. Instead, a brute force method is applied: actually change the recursion coefficient by a small increment, and then directly calculate the new value of ER. The slope is then found as the change in ER divided by the amount of the increment. Specifically, the current value of ER is found in lines 2040-2050, and stored in the variable, EOLD. The loop in lines 2080-2130 runs through each of the "a" coefficients. The first action inside this loop is to add a small increment, DELTA, to the recursion coefficient being worked on (line 2090). Subroutine 3000 is invoked in line 2100 to find the value of ER with the modified coefficient. Line 2110 then calculates the slope of this coefficient as: (ER & EOLD ) / DELTA . Line 2120 then restores the modified coefficient by subtracting the value of DELTA.

Figure 26-13 shows several examples of filters designed using this program. The dotted line is the desired frequency response, while the solid line is the

 

Chapter 26Neural Networks (and more!)

479

2000

'SUBROUTINE TO CALCULATE THE NEW RECURSION COEFFICIENTS

 

2010

'Variables entering routine:

A[ ], B[ ], DELTA, MU

 

2020

'Variables exiting routine:

A[ ], B[ ], EOLD, ENEW

 

2030

'

 

 

 

2040 GOSUB 3000

 

'FIND THE CURRENT ERROR

 

2050

EOLD = ER

 

'store current error in variable, EOLD

 

2060

'

 

 

 

2070

 

 

'FIND THE ERROR SLOPES

 

2080

FOR P% = 0 TO NP%

 

'loop through each "a" coefficient

 

2090

A[P%] = A[P%] + DELTA

 

'add a small increment to the coefficient

 

2100

GOSUB 3000

 

'find the error with the change

 

2110

SA[P%] = (ER-EOLD)/DELTA

'calculate the error slope, store in SA[ ]

 

2120

A[P%] = A[P%] - DELTA

 

'return coefficient to original value

 

2130 NEXT P%

 

 

 

2140

'

 

 

 

2150

FOR P% = 1 TO NP%

 

'repeat process for each "b" coefficient

 

2160

B[P%] = B[P%] + DELTA

 

 

 

2170

GOSUB 3000

 

 

 

2180

SB[P%] = (ER-EOLD)/DELTA

'calculate the error slope, store in SB[ ]

 

2190

B[P%] = B[P%] - DELTA

 

 

 

2200 NEXT P%

 

 

 

2210

'

 

'CALCULATE NEW COEFFICIENTS

 

2220

FOR P% = 0 TO NP%

 

'loop through each coefficient

 

2230

A[P%] = A[P%] - SA[P%] * MU

'adjust coefficients to move "downhill"

 

2240

B[P%] = B[P%] - SB[P%] * MU

 

 

2250 NEXT P%

 

 

 

2260

'

 

 

 

2270 GOSUB 3000

 

'FIND THE NEW ERROR

 

2280

ENEW = ER

 

'store new error in variable, ENEW

 

2290

'

 

 

 

2300 RETURN

 

 

 

3000

'SUBROUTINE TO CALCULATE THE FREQUENCY DOMAIN ERROR

 

3010

'Variables entering routine:

A[ ], B[ ], T[ ]

 

 

3020

'Variables exiting routine:

ER

 

 

3030

'

 

 

 

3040 FOR I% = 0 TO N%-1

 

'LOAD SHIFTED IMPULSE INTO IMX[ ]

 

3050

REX[I%] = 0

 

 

 

3060

IMX[I%] = 0

 

 

 

3070 NEXT I%

 

 

 

3080

IMX[12] = 1

 

 

 

3090

'

 

'CALCULATE IMPULSE RESPONSE

 

3100 FOR I% = 12 TO N%-1

 

 

 

3110

FOR J% = 0 TO NP%

 

 

 

3120

REX[I%] = REX[I%] + A[J%] * IMX[I%-J%] + B[J%] * REX[I%-J%]

 

3130

NEXT J%

 

 

 

3140 NEXT I%

 

 

 

3150

IMX[12] = 0

 

 

 

3160

'

 

'CALCULATE THE FFT

 

3170

GOSUB 1000

 

'Table 12-4, uses REX[ ], IMX[ ], N%

 

3180

'

 

 

 

3190

 

 

'FIND FREQUENCY DOMAIN ERROR

 

3200

ER = 0

 

'zero ER, to use as an accumulator

 

3210

FOR I% = 0 TO N%/2

 

'loop through each positive frequency

 

3220

MAG = SQR(REX[I%]^2 + IMX[I%]^2)

'rectangular --> polar conversion

 

3230

ER = ER + ( MAG - T[I%] )^2

 

'calculate and accumulate squared error

 

3240 NEXT I%

 

 

 

3250

ER = SQR( ER/(N%/2+1) )

 

'finish calculation of error, ER

 

3260

'

 

 

 

3270 RETURN

TABLE 26-5

480

The Scientist and Engineer's Guide to Digital Signal Processing

 

1.5

 

 

 

 

 

 

 

a. Low-pass

 

 

 

 

Amplitude

1.0

 

 

 

 

 

0.5

 

 

 

 

 

 

 

 

 

 

 

 

0.0

 

 

 

 

 

 

0

0.1

0.2

0.3

0.4

0.5

 

 

 

Frequency

 

 

 

2.0

 

 

 

 

 

 

 

c. 1/sinc(x)

 

 

 

 

Amplitude

1.5

 

 

 

 

 

1.0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a0 =

1.151692

 

 

0.5

 

 

a1 = -0.06794763

 

 

 

 

a2 = -0.07929603

 

 

 

 

 

 

 

 

 

 

b1 = -0.1129629

 

 

 

 

 

b2 =

0.1062142

 

 

0.0

 

 

 

 

 

 

0

0.1

0.2

0.3

0.4

0.5

 

 

 

Frequency

 

 

1.5

 

 

 

 

 

 

b. Low-pass

 

 

 

 

1.0

 

 

 

 

 

Amplitude

 

 

 

 

 

0.5

 

 

 

 

 

0.0

 

 

 

 

 

0

0.1

0.2

0.3

0.4

0.5

 

 

Frequency

 

 

1.5

 

 

 

 

 

 

d. Custom

 

 

 

 

1.0

 

 

 

 

 

Amplitude

 

 

 

 

 

0.5

 

 

 

 

 

0.0

 

 

 

 

 

0

0.1

0.2

0.3

0.4

0.5

 

 

Frequency

 

 

FIGURE 26-13

Iterative design of recursive filters. Figure (a) shows an 8 pole low-pass filter with the error equally distributed between 0 and 0.5. In (b), the error has been weighted to force better performance in the stopband, at the expense of error in the passband. Figure (c) shows a 2 pole filter used for the 1/sinc(x) correction in digital-to-analog conversion. The frequency response in (d) is completely custom. In each figure, the desired frequency response is shown by the dotted line, and the actual frequency response by the solid curve.

frequency response of the designed filter. Each of these filters requires several minutes to converge on a 100 MHz Pentium. Figure (a) is an 8 pole low-pass filter, where the error is equally weighted over the entire frequency spectrum (the program as written). Figure (b) is the same filter, except the error in the stopband is multiplied by eight when ER is being calculated. This forces the filter to have less stopband ripple, at the expense of greater ripple in the passband.

Figure (c) shows a 2 pole filter for: 1 / sinc(x) . As discussed in Chapter 3, this can be used to counteract the zeroth-order hold during digital-to-analog conversion (see Fig. 3-6). The error in this filter was only summed between 0 and 0.45, resulting in a better match over this range, at the expense of a worse match between 0.45 and 0.5. Lastly, (d) is a very irregular 6 pole frequency response that includes a sharp dip. To achieve convergence, the recursion coefficients were initially set to those of a notch filter.

CHAPTER

Data Compression

27

Data transmission and storage cost money. The more information being dealt with, the more it costs. In spite of this, most digital data are not stored in the most compact form. Rather, they are stored in whatever way makes them easiest to use, such as: ASCII text from word processors, binary code that can be executed on a computer, individual samples from a data acquisition system, etc. Typically, these easy-to-use encoding methods require data files about twice as large as actually needed to represent the information. Data compression is the general term for the various algorithms and programs developed to address this problem. A compression program is used to convert data from an easy-to-use format to one optimized for compactness. Likewise, an uncompression program returns the information to its original form. We examine five techniques for data compression in this chapter. The first three are simple encoding techniques, called: runlength, Huffman, and delta encoding. The last two are elaborate procedures that have established themselves as industry standards: LZW and JPEG.

Data Compression Strategies

Table 27-1 shows two different ways that data compression algorithms can be categorized. In (a), the methods have been classified as either lossless or lossy. A lossless technique means that the restored data file is identical to the original. This is absolutely necessary for many types of data, for example: executable code, word processing files, tabulated numbers, etc. You cannot afford to misplace even a single bit of this type of information. In comparison, data files that represent images and other acquired signals do not have to be keep in perfect condition for storage or transmission. All real world measurements inherently contain a certain amount of noise. If the changes made to these signals resemble a small amount of additional noise, no harm is done. Compression techniques that allow this type of degradation are called lossy. This distinction is important because lossy techniques are much more effective at compression than lossless methods. The higher the compression ratio, the more noise added to the data.

481

482

The Scientist and Engineer's Guide to Digital Signal Processing

 

Lossless

 

Lossy

 

Method

 

Group size:

 

 

 

 

 

 

 

 

input

output

 

 

 

 

 

 

 

 

 

 

run-length

 

CS&Q

 

CS&Q

 

fixed

fixed

 

Huffman

 

JPEG

 

Huffman

 

fixed

variable

 

delta

 

MPEG

 

Arithmetic

 

variable

variable

 

LZW

 

 

 

run-length, LZW

 

variable

fixed

 

a. Lossless or Lossy

 

b. Fixed or variable group size

TABLE 27-1

Compression classifications. Data compression methods can be divided in two ways. In (a), the techniques are classified as lossless or lossy. Lossless methods restore the compressed data to exactly the same form as the original, while lossy methods only generate an approximation. In (b), the methods are classified according to a fixed or variable size of group taken from the original file and written to the compressed file.

Images transmitted over the world wide web are an excellent example of why data compression is important. Suppose we need to download a digitized color photograph over a computer's 33.6 kbps modem. If the image is not compressed (a TIFF file, for example), it will contain about 600 kbytes of data. If it has been compressed using a lossless technique (such as used in the GIF format), it will be about one-half this size, or 300 kbytes. If lossy compression has been used (a JPEG file), it will be about 50 kbytes. The point is, the download times for these three equivalent files are 142 seconds, 71 seconds, and 12 seconds, respectively. That's a big difference! JPEG is the best choice for digitized photographs, while GIF is used with drawn images, such as company logos that have large areas of a single color.

Our second way of classifying data compression methods is shown in Table 271b. Most data compression programs operate by taking a group of data from the original file, compressing it in some way, and then writing the compressed group to the output file. For instance, one of the techniques in this table is

CS&Q, short for coarser sampling and/or quantization. Suppose we are compressing a digitized waveform, such as an audio signal that has been digitized to 12 bits. We might read two adjacent samples from the original file (24 bits), discard one of the sample completely, discard the least significant 4 bits from the other sample, and then write the remaining 8 bits to the output file. With 24 bits in and 8 bits out, we have implemented a 3:1 compression ratio using a lossy algorithm. While this is rather crude in itself, it is very effective when used with a technique called transform compression. As we will discuss later, this is the basis of JPEG.

Table 27-1b shows CS&Q to be a fixed-input fixed-output scheme. That is, a fixed number of bits are read from the input file and a smaller fixed number of bits are written to the output file. Other compression methods allow a variable number of bits to be read or written. As you go through the description of each of these compression methods, refer back to this table to understand how it fits into this classification scheme. Why are JPEG and MPEG not listed in this table? These are composite algorithms that combine many of the other techniques. They are too sophisticated to be classified into these simple categories.

Chapter 27Data Compression

483

Run-Length Encoding

Data files frequently contain the same character repeated many times in a row. For example, text files use multiple spaces to separate sentences, indent paragraphs, format tables & charts, etc. Digitized signals can also have runs of the same value, indicating that the signal is not changing. For instance, an image of the nighttime sky would contain long runs of the character or characters representing the black background. Likewise, digitized music might have a long run of zeros between songs. Run-length encoding is a simple method of compressing these types of files.

Figure 27-1 illustrates run-length encoding for a data sequence having frequent runs of zeros. Each time a zero is encountered in the input data, two values are written to the output file. The first of these values is a zero, a flag to indicate that run-length compression is beginning. The second value is the number of zeros in the run. If the average run-length is longer than two, compression will take place. On the other hand, many single zeros in the data can make the encoded file larger than the original.

Many different run-length schemes have been developed. For example, the input data can be treated as individual bytes, or groups of bytes that represent something more elaborate, such as floating point numbers. Run-length encoding can be used on only one of the characters (as with the zero above), several of the characters, or all of the characters.

A good example of a generalized run-length scheme is PackBits, created for Macintosh users. Each byte (eight bits) from the input file is replaced by nine bits in the compressed file. The added ninth bit is interpreted as the sign of the number. That is, each character read from the input file is between 0 to 255, while each character written to the encoded file is between -255 and 255. To understand how this is used, consider the input file: 1, 2, 3, 4, 2, 2, 2, 2, 4 , and the compressed file generated by the PackBits algorithm: 1, 2, 3, 4, 2,& 3, 4. The compression program simply transfers each number from the input file to the compressed file, with the exception of the run: 2,2,2,2. This is represented in the compressed file by the two numbers: 2,-3. The first number ("2") indicates what character the run consists of. The second number ("-3") indicates the number of characters in the run, found by taking the absolute value and adding one. For instance, 4,-2 means 4,4,4; 21,-4 means 21,21,21,21,21, etc.

original data stream:

17

8

54

0

0

0

97

5

16

0

45

23

0

0

0

0

0

3

67 0 0 8

run-length encoded:

17

8

54

0

3

97

5

16

0

1

45

23

0

5

3

67

0

2

8

FIGURE 27-1

Example of run-length encoding. Each run of zeros is replaced by two characters in the compressed file: a zero to indicate that compression is occurring, followed by the number of zeros in the run.

484

The Scientist and Engineer's Guide to Digital Signal Processing

An inconvenience with PackBits is that the nine bits must be reformatted into the standard eight bit bytes used in computer storage and transmission. A useful modification to this scheme can be made when the input is restricted to be ASCII text. As shown in Table 27-2, each ASCII character is usually stored as a full byte (eight bits), but really only uses seven of the bits to identify the character. In other words, the values 127 through 255 are not defined with any standardized meaning, and do not need to be stored or transmitted. This allows the eighth bit to indicate if run-length encoding is in progress.

Huffman Encoding

This method is named after D.A. Huffman, who developed the procedure in the 1950s. Figure 27-2 shows a histogram of the byte values from a large ASCII file. More than 96% of this file consists of only 31 characters: the lower case letters, the space, the comma, the period, and the carriage return. This observation can be used to make an appropriate compression scheme for this file. To start, we will assign each of these 31 common characters a five bit binary code: 00000 = "a", 00001 = "b", 00010 = "c", etc. This allows 96% of the file to be reduced in size by 5/8. The last of the five bit codes, 11111, will be a flag indicating that the character being transmitted is not one of the 31 common characters. The next eight bits in the file indicate what the character is, according to the standard ASCII assignment. This results in 4% of the characters in the input file requiring 5+8=13 bits. The idea is to assign frequently used characters fewer bits, and seldom used characters

TABLE 27-2

ASCII codes. This is a long established standard for allowing letters and numbers to be represented in digital form. Each printable character is assigned a number between 32 and 127, while the numbers between 0 and 31 are used for various control actions. Even though only 128 codes are defined, ASCII characters are usually stored as a full byte (8 bits). The undefined values (128 to 255) are often used for Greek letters, math symbols, and various geometric patterns; however, this is not standardized. Many of the control characters (0 to 31) are based on older communications networks, and are not applicable to computer technology.

0

null

32

space

64

@

96

`

1

start heading

33

!

65

A

97

a

2

start of text

34

"

66

B

98

b

3

end of text

35

#

67

C

99

c

4

end of xmit

36

$

68

D

100

d

5

enquiry

37

%

69

E

101

e

6

acknowledge

38

&

70

F

102

f

7

bell, beep

39

'

71

G

103

g

8

backspace

40

(

72

H

104

h

9

horz. tab

41

)

73

I

105

i

10

line feed

42

*

74

J

106

j

11

vert. tab, home

43

+

75

K

107

k

12

form feed, cls

44

,

76

L

108

l

13

carriage return

45

-

77

M

109

m

14

shift out

46 .

78

N

110

n

15

shift in

47

/

79

O

111

o

16

data line esc

48

0

80

P

112

p

17

device control 1

49

1

81

Q

113

q

18

device control 2

50

2

82

R

114

r

19

device control 3

51

3

83

S

115

s

20

device control 4

52

4

84

T

116

t

21

negative ack.

53

5

85

U

117

r

22

synch. idle

54

6

86

V

118

v

23

end xmit block

55

7

87

W

119

w

24

cancel

56

8

88

X

120

x

25

end of medium

57

9

89

Y

121

y

26

substitute

58

:

90

Z

122

z

27

escape

59

;

91

[

123

{

28

file separator

60

<

92

\

124

|

29

group separator

61

=

93

]

125

}

30

record separator

62

>

94

^

126

~

31

unit separator

63

?

95

_

127

del

Chapter 27Data Compression

485

FIGURE 27-2

Histogram of text. This is a histogram of the ASCII values from a chapter in this book. The most common characters are the lower case letters, the space and the carriage return.

Fractional occurence

0.20

0.15

0.10

0.05

0.00

0

space

lower case letters

 

upper case

CR

letters &

 

numbers

50

100

150

200

250

Byte value

more bits. In this example, the average number of bits required per original character is: 0.96 × 5 % 0.04 × 13 ' 5.32 . In other words, an overall compression ratio of: 8 bits/5.32 bits, or about 1.5 :1 .

Huffman encoding takes this idea to the extreme. Characters that occur most often, such the space and period, may be assigned as few as one or two bits. Infrequently used characters, such as: !, @, #, $ and %, may require a dozen or more bits. In mathematical terms, the optimal situation is reached when the number of bits used for each character is proportional to the logarithm of the character's probability of occurrence.

A clever feature of Huffman encoding is how the variable length codes can be packed together. Imagine receiving a serial data stream of ones and zeros. If each character is represented by eight bits, you can directly separate one character from the next by breaking off 8 bit chunks. Now consider a Huffman encoded data stream, where each character can have a variable number of bits. How do you separate one character from the next? The answer lies in the proper selection of the Huffman codes that enable the correct separation. An example will illustrate how this works.

Figure 27-3 shows a simplified Huffman encoding scheme. The characters A through G occur in the original data stream with the probabilities shown. Since the character A is the most common, we will represent it with a single bit, the code: 1. The next most common character, B, receives two bits, the code: 01. This continues to the least frequent character, G, being assigned six bits, 000011. As shown in this illustration, the variable length codes are resorted into eight bit groups, the standard for computer use.

When uncompression occurs, all the eight bit groups are placed end-to-end to form a long serial string of ones and zeros. Look closely at the encoding table of Fig. 27-3, and notice how each code consists of two parts: a number of zeros before a one, and an optional binary code after the one. This allows the binary data stream to be separated into codes without the need for delimiters or other marker between the codes. The uncompression program

486

The Scientist and Engineer's Guide to Digital Signal Processing

Example Encoding Table

FIGURE 27-3

Huffman encoding. The encoding table assigns each of the seven letters used in this example a variable length binary code, based on its probability of occurrence. The original data stream composed of these 7 characters is translated by this table into the Huffman encoded data. Since each of the Huffman codes is a different length, the binary data need to be regrouped into standard 8 bit bytes for storage and transmission.

original data stream:

letter

 

probability

 

Huffman code

 

 

A

 

.154

 

1

B

 

.110

 

01

C

 

.072

 

0010

D

 

.063

 

0011

E

 

.059

 

0001

F

 

.015

 

000010

G

 

.011

 

000011

 

 

 

 

 

C E G A D F B E A

Huffman encoded:

0010 0001

000011 1 0011 000010 01 00 01 1

grouped into bytes:

00100001

00001110 01100001 00100011

 

byte 1

byte 2

byte 3

byte 4

looks at the stream of ones and zeros until a valid code is formed, and then starting over looking for the next character. The way that the codes are formed insures that no ambiguity exists in the separation.

A more sophisticated version of the Huffman approach is called arithmetic encoding. In this scheme, sequences of characters are represented by individual codes, according to their probability of occurrence. This has the advantage of better data compression, say 5-10%. Run-length encoding followed by either Huffman or arithmetic encoding is also a common strategy. As you might expect, these types of algorithms are very complicated, and usually left to data compression specialists.

To implement Huffman or arithmetic encoding, the compression and uncompression algorithms must agree on the binary codes used to represent each character (or groups of characters). This can be handled in one of two ways. The simplest is to use a predefined encoding table that is always the same, regardless of the information being compressed. More complex schemes use encoding optimized for the particular data being used. This requires that the encoding table be included in the compressed file for use by the uncompression program. Both methods are common.

Delta Encoding

In science, engineering, and mathematics, the Greek letter delta ()) is used to denote the change in a variable. The term delta encoding, refers to

Соседние файлы в предмете Электроника