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.