The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Math::DCT - 1D and NxN 2D Fast Discreet Cosine Transforms (DCT-II)

SYNOPSIS

    use Math::DCT qw/dct dct1d dct2d/;

    my $dct1d = dct([[1,2,3,4]]);
    $dct1d = dct1d([1,2,3,4]);

    my $dct2d = dct([[1,2],[3,4]]);
    $dct2d = dct2d([1,2,3,4]);

VERSION

Version 0.01

DESCRIPTION

An unscaled DCT-II implementation for 1D and NxN 2D in XS. For array sizes which are a power of 2, a fast algorithm described by Lee is used (with the addition of a coefficient table that makes it even faster than the most common implementations of this algorithm).

The module was written for a perceptual hash project that needed 32x32 DCT-II, and on a 2.5GHz 2015 Macbook Pro over 11500/s are processed. There is no specifically optimized algorithm for the common 8x8 DCT-II, so specialized software will be faster for that (still, a respectable 185000/s is achieved on the same CPU).

METHODS

dct

  my $dct = dct([[1,2],[3,4]]);

Pass an array (ref) of either a single array, or N N-length arrays for 1D and 2D DCT-II calculation respectivelly. The output will be an arrayref of array(s) with the result of the transform.

dct1d

  my $dct = dct1d([1,2,3]);

Pass an array (ref) for a 1D DCT-II calculation. The output will be an arrayref with the result of the transform.

dct2d

  my $dct = dct2d([1,2,3,4]);

Pass an array (ref) for a 2D DCT-II calculation. The length of the array is expected to be a square (as only NxN arrays are suppodted). The output will be an arrayref with the result of the transform.

If your 2D data is available in a 1d array as is usual with most image manipulation etc cases, this function will be faster, as the DCT calculation is done on a 1d array in any case, so there is no cost of conversion.

USAGE NOTES

The C functions are not exported, but theoretically you could use them directly if you do your own pack/unpack. The fast versions for power-of-2 size arrays are fast_dct_1d and fast_dct_2d, while the generic versions are dct_1d and dct_2d. First argument is a char * (use pack "dN"), second is the size N.

ACKNOWLEDGEMENTS

Some code from Project Nayuki was adapted and improved upon.

(https://www.nayuki.io/page/fast-discrete-cosine-transform-algorithms)

AUTHOR

Dimitrios Kechagias, <dkechag at cpan.org>

BUGS

Please report any bugs or feature requests to bug-math-dct at rt.cpan.org, or through the web interface at https://rt.cpan.org/NoAuth/ReportBug.html?Queue=Math-DCT. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

GIT

https://github.com/SpareRoom/Math-DCT

COPYRIGHT & LICENSE

Copyright (C) 2019, SpareRoom.com

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.