Inferno #06
03 декабря 2004 |
|
For Coderz - Arithmetic coding.
Arithmetic coding www.codenet.ru, author unknown. Published in abridged form. The idea of arithmetic coding. When arithmetic coding is submitted to the real numbers between 0 and 1. As the coding of the text displaying its range decreased and the number of bits for its presentation increases. Ordinary text characters cut the amount of space from the values of their probabilities, opredelyaemh modelyu.Bolee probable characters make this a lesser extent, than less likely, and hence add fewer bits to result. Before you begin, the text spacing is [0, 1). When processing the next symbol its width narrows for through the allocation of this symbol of the interval. For example, we apply to the text "eaii!" alphabet {a, e, i, o, u,! } Model with constant probabilities (the width of the interval equal to the probability of the symbol): "A" [0.0; 0.2); "E" [0.2; 0.5); "I" [0.5; 0.6); "O" [0.6; 0.8); "U" [0.8; 0.9); "!" [0.9, 1.0). And encoder and decoder know that at the very beginning interval is [0, 1). After watching the first character "e" encoder narrows the interval to [0.2, 0.5), which distinguishes this model character. The second character "a" narrow down the new interval to the first its fifth part, because "a" is selected a fixed interval [0.0, 0.2). The result is working interval [0.2, 0.26), as previous interval had a width of 0.3 units, and one-fifth of it is 0.06. The next character "i" corresponds to a fixed interval [0.5, 0.6) that, with respect to the working interval [0.2, 0.26) narrows it to the interval [0.23, 0.236). Continuing In the same spirit, we have: In the beginning [0.0, 1.0) After watching the "e" [0.2; 0.5) -"-"-"- "A" [0.2; 0.26) -"-"-"- "I" [0.23; 0.236) -"-"-"- "I" [0.233; 0.2336) -"-"-"- "" [0.23354, 0.2336) Assume that all decoder knows about the text - is finite interval [0.23354, 0.2336). He immediately realizes that the first encoded symbol is "e", because final interval lies in the interval, the selected model of this character under the first table. Now repeat the steps the encoder: First, [0.0, 1.0) After watching the "e" [0.2; 0.5) Hence it is clear that the second character - it's "a", as it will lead to the interval [0.2, 0.26), which fully accommodates the final interval [0.23354, 0.2336). Continuing to work the same way decoder will extract all the text. Decoder is not necessary to know the values of both borders the final interval, obtained from the encoder. Even a single value that lies within him, for example, 0.23355 is already enough. (Other numbers - 0.23354, 0.23357, or even 0.23354321 - quite suitable). Five decimal digits, it seems too much for coding Text of the 4 vowels. However, it is clear that different models give different entropiyu.Luchshaya model based on an analysis of the individual characters Text "eaii!", is the following set of frequencies of characters: {"E" (0.2), "a" (0.2), "i" (0.4), "!" (0.2)}. The program for arithmetic coding. Shows a fragment of pseudo-unifying procedure of encoding and decoding. Characters in it are numbered as 1, 2, 3 ... The frequency interval for the i-th symbol is given by cum_freq [i] to cum_freq [i-1]. With decreasing i cum_freq [i] increases so that cum_freq [0] = 1. (The reason for such "reverse" the agreement is that cum_freq [0] will then contain a normalizing factor, which can be conveniently stored at the beginning of the array). Current Work interval specified in the [low; high], and will at the very beginning is [0, 1) and an encoder, and Encoder. Unfortunately, this pseudo code is simplified, while in practice there are several factors that complicate and coding, and decoding. / / Algorithm for Arithmetic coding / / Each char. the text refer to the procedure encode_symbol () / / Check that the "final" last symbol is encoded / / Display the resulting value of the range [low; high) encode_symbol (symbol, cum_freq) range = high - low high = low + range * cum_freq [symbol-1] low = low + range * cum_freq [symbol] / / ARITHMETIC DECODING ALGORITHM / / Value - it goes to the input number / / Address to the procedure decode_symbol (), until she returns / / "Final" character decode_symbol (cum_freq) search for a symbol that cum_freq [symbol] <= (value-low) / (high-low)= Half) { output_bit (1); low = 2 * (low - Half); high = 2 * (high - Half) + 1; } else break; } Priraschaemy initial data input is done using the number of named value. Processed beats move to the top, but again received come in lower. First start_decoding () fills the value received bits. After determining the next input symbol procedure decode_symbol () removal is unnecessary, the same in low and high, the highest-order bits of the shift value for the number of digits (bits derived restored with the introduction of new lower-end). for (;;) { if (high <Half) { value = 2 * value + input_bit (); low = 2 * low; high = 2 * high + 1; } else if (low> Half) { value = 2 * (value - Half) + input_bit (); low = 2 * (low - Half); high = 2 * (high - Half) + 1; } else break; } The proof of the decoding of inequality. Let "[]" denotes the integral part - a division truncating. We believe: (Value-low +1) * cum_freq [0] -1 cum_freq [symbol] <= [] < high-low +1 0. range * cum_freq [symbol-1] (A) high '* low + [] - 1> = cum_freq [0] range (value-low +1) * cum_freq [0] -1 > = Low + [+ 1 - e] - 1 cum_freq [0] range from the expression (1) we have: range a range-1 > = Value + [- + 1 -] = value. cum_freq [0] range range Negative overflow. As shown in the pseudocode, arithmetic coding works by scaling the accumulated probability delivered model in the range [low; high] for each transmitted symbol. Assume that the low and high so close to each other that resize operation results obtained from different models characters to a single integer, a part of [low; high]. In this If further coding is impossible to continue. Consequently, the encoder must ensure that the interval [low; high] has always been quite wide. The simplest way to do this is to ensure that the width of the interval not less Max_frequency - the maximum amount of cumulative frequency. How can we make this condition is less severe? Explained above bit shift operation ensures that the low and high can only then it becomes dangerously close when enter into an Half. Suppose they get so close that First_qtr <= low <= Half <= high order, alternating to reflect changes perekodirovochnye table. As a result, the procedure increases the value of the appropriate frequency counter, and puts in order the corresponding accumulated frequency. Compression efficiency. When encoding text arithmetic method the number of bits in the encoded string is equal to the entropy of the text relative to that used to encode the model. Three factors cause the deterioration of the characteristics: * Costs of completing the text; * Use of Finite precision arithmetic; * Is a scaling counter that their amount does not exceed Max_frequency. As shown, none of them are not significant. In order highlight the results of the arithmetic coding model will regarded as a strict (in the sense defined above). Arithmetic coding has the additional bits shall be sent to the end of each text, thus making additional efforts to complete teksta.Dlya eliminate confusion with the last symbol procedure done_encoding () sends two bits. In the case when before you encode the bitstream should be blocked in 8bitovye characters, it will be necessary to round the end of the block. Such a combination may additionally require 9 bits. Costs when using finite precision arithmetic are manifested in the reduction of residues delenii.Eto seen by comparing the theoretical entropy, which displays the frequency of the counters exactly the same scalable encoding. Here the costs are negligible - about 10 ^ -4 bits / symbol. Additional costs for scaling counter part more, but still very small. For short texts (less than 2 ^ 14 bytes) does not. But even with the texts in 10 ^ 5 - 10 ^ 6 bytes of overhead costs, estimated experimentally to be less than 0.25% of the encoded string. Adaptive model in the program, with the threat of exceeding the total the cumulative frequency value Max_frequency, reduces all counters. This leads to what is to weigh recent events heavier than earlier. Thus, the figures tend to track changes in the input sequence that can be very useful. (We have encountered cases where restriction counters to 6-7 beats gave better results than improve the accuracy of arithmetic.) Of course, it depends on the source, is applied to the model. Implementation limit. Limitations associated with the length of words and associated opportunity overflow can be summarized as the belief that the frequency counter are presented f bits, and code_values - c bits. The program will work correctly when f <= c-2 and f + c <= p, where p is the precision of arithmetic. In most implementations in C p = 31, if used whole the number of type long, and p = 32 - for unsigned long. In our program f = 14 and c = 16. With appropriate changes in ads for unsigned long can be used f = 15 and c = 17. Assembly language c = 16 is the natural choice because it speeds up some operations of comparison and manipulation of bits. If we restrict p 16 bits, the best possible value c and f are respectively 9 and 7, which does not encode a full alphabet of 256 symbols, as each of them will have counter value is not less than one. With a smaller alphabet (for example, of 26 letters or 4-bit values) you can still cope. Conclusion. Upon completion of the encoding process is necessary to send a unique terminating character [he needed if the decoder is unknown length of the text], and then send the following sufficient number of bits to ensure that the encoded string will get into the final operational range. Because procedure done_encoding () can be confident that low and limited to either high expression (1a), or (1b), it need only transmit 01 or 10, respectively, to remove the remaining uncertainties. Convenient to do with the previously considered procedures bit_plus_follow (). Procedure input_bit () at the actually going to read a little bit more, from those that led output_bit (), because she needs to keep filling the lower end of the buffer. It does not matter what value are these bits, because EOF uniquely determined by the last bits transmitted. All exact references to the author's C-program I have destroyed, but however, left the information on the ratio of variable names and procedures, which is enough to restore the logic program. The program is very poorly framed, and therefore unlikely is useful to you (in C you can easily write his), so we put its assembler option developed Vitamin'om and accelerated I have no change in the algorithm. To achieve higher speed decompression (packing speed is less important) it should be changed in terms of the model update and retrieval. Algorithm in almost any If need to change, because only 256 supported literals and kept only one model at the same time - this is not enough to write a good packer. See ARIF16m.H in the appendix.
Other articles:
Similar articles:
В этот день... 21 November