There is no decompress code in the article ... Someone has to wright one to check.
The author and his company claim that it can operate in lossless mode and it is already in use in some medical systems, so probably yes. But the improvement, if any, when compared with established algorithms used for sound, seems not sensible. I would not bet time in writing the decompression code. ACC PS - Matlab compression code is attached. So anyone can try to decompress! On Tue, Jun 22, 2010 at 6:32 PM, <f...@kokkinizita.net> wrote: > On Tue, Jun 22, 2010 at 06:18:17PM -0300, A. C. Censi wrote: > >> On Tue, Jun 22, 2010 at 5:31 PM, <f...@kokkinizita.net> wrote: >> > >> > Does it decompress to the original ? >> >> ... lots of text but no answer ... > > So I'll repeat the question: Does it decompress to the original ? > ( _it_ meaning the file that was reported to be compressed better > than 7:1) > > Ciao, > > -- > FA > > O tu, che porte, correndo si ? > E guerra e morte ! > -- A. C. Censi accensi [em] gmail [ponto] com accensi [em] montreal [ponto] com [ponto] br
% % From http://electronicdesign.com/tabid/57/default.aspx?topic=algorithm_delivers_lossless_compression_to_adc_samples&catpath=&fltrTitle=&fltrSummary=&fltrPublication.aspx?nl=1 % function [cr, m, e, d] = simpleSamplify(x) % % function [cr, m, e, d] = simpleSamplify(x) Al Wegener August 2009 % % This function applies a simple lossless compression algorithm to a % sampled integer waveform and returns the mantissas and exponents and the % resulting compression ratio. % % Input: x integer input array (array length should be a multiple of 4) % % Output: cr compression ratio % m output mantissas % e 1 exponent per 4 mantissas % d derivative (0, 1, or 2) that uses the fewest bits % % Ensure that the x array length is a multiple of 4, and make sure % we have a row vector. N = 4 * floor(length(x)/4); x = x(1:N); x = x(:)'; % Determine the number of bits in the input array, which is the % product of the array length and the number of bits per sample. bitsPerSample = 1 + ceil(log(max(abs(x))) / log(2)); bits_in = N * bitsPerSample; % Generate the first and second derivatives of the input signal x1 = [x(1) diff(x)]; x2 = [x(1) x1(2) diff(x1(2:end))]; % Determine the length of each bit-packed array. [e0, N0] = calcExps(x); [e1, N1] = calcExps(x1); [e2, N2] = calcExps(x2); [y, i] = min([N0 N1 N2]); % which derivative array requires the fewest bits ? d = i - 1; % "winner" derivative = i - 1; % Return the compressed array, i.e. the derivative that requires the fewest bits. switch i case 1, e = e0; m = x; N = N0; case 2, e = e1; m = x1; N = N1; case 3, e = e2; m = x2; N = N2; otherwise, fprintf(1,'ERROR\n'); end cr = bits_in / N; return function [exps, Nbits] = calcExps(x) x1 = reshape(x, 4, length(x)/4); xmax = min(max(abs(x1)), 32768); % limit input to 16-bit samples exps = 1 + ceil(log(xmax+0.1) / log(2)); % calculate exponents for each 4-sample mantissa group exps = (exps > 0.9) .* exps; % if xmax was zero, exps should be zero too! mant_bits = 4 * sum(exps); % Calculate the total number of mantissa bits % Calculate the number of bits used for the Huffman-encoded exponent differences eDiffs = [exps(1) diff(exps)]; % generate the exponent differences h_exps = huffman(eDiffs); % determine how many bits are in the Huffman-encoded exponent array exp_bits = sum(h_exps); % calculate the total number of Huffman-encoded exponent bits % Combine the mantissa bit count, the exponent bit count, and the 2-bit derivative flag. Nbits = mant_bits + exp_bits + 2; % combine the mantissa and exponent bits, plus % 2 bits to hold the derivative in the packed array return function eBits = huffman(eDiff) % % Huffman encoding of exponent differences. This function assumes the following mapping of % exponent differences to Huffman tokens, and also shows the corresponding Huffman token length. % % Exp difference Huffman token Token length (# bits) % -------------- ------------- --------------------- % 0 0 1 % -1, +1 100, 101 3 % -2, +2 1100, 1101 4 % -3, +3 1110 0000, 1111 0000 8 % -4, +4 1110 0001, 1111 0001 8 % : : : % -16, +16 1110 1101, 1111 1101 8 % huffTable = 8 * ones(1,17); % most Huffman table entries take 8 bits, but huffTable(1:3) = [1 3 4]; % the first three Huffman table entries use 1, 3, and 4 bits % Exp diffs of 0, +/-1, and +/-2 usually account for more than % 80% of all exp diffs, so their token length should be short! j = 1 + abs(eDiff); % (exp diff range is {0, 16}, but huffTable indices are {1, 17}) eBits = huffTable(j); % calculate the Huffman token length for each exponent difference return
_______________________________________________ Linux-audio-dev mailing list Linux-audio-dev@lists.linuxaudio.org http://lists.linuxaudio.org/listinfo/linux-audio-dev