1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
/* Copyright (c) 2006-2012 Filip Wasilewski <http://en.ig.ma/>
* Copyright (c) 2012-2016 The PyWavelets Developers
* <https://github.com/PyWavelets/pywt>
* See COPYING for license details.
*/
#include "common.h"
#include <limits.h> // for U*_MAX
// MSVC <= 2008 does not have stdint.h, but defines SIZE_MAX in limits.h
#if (!defined(_MSC_VER)) || (_MSC_VER > 1500)
#include <stdint.h> // for SIZE_MAX
#endif /* _MSC_VER */
/* Returns the floor of the base-2 log of it's input
*
* Undefined for x = 0
*/
unsigned char size_log2(size_t x){
#if defined(_MSC_VER)
unsigned long i;
#if SIZE_MAX == 0xFFFFFFFF
_BitScanReverse(&i, x);
#elif SIZE_MAX == 0xFFFFFFFFFFFFFFFF
_BitScanReverse64(&i, x);
#else
#error "Unrecognized SIZE_MAX"
#endif /* SIZE_MAX */
return i;
#else
// GCC and clang
// Safe cast: 0 <= clzl < arch_bits (64) where result is defined
#if SIZE_MAX == UINT_MAX
unsigned char leading_zeros = (unsigned char) __builtin_clz(x);
#elif SIZE_MAX == ULONG_MAX
unsigned char leading_zeros = (unsigned char) __builtin_clzl(x);
#elif SIZE_MAX == ULLONG_MAX
unsigned char leading_zeros = (unsigned char) __builtin_clzll(x);
#else
#error "Unrecognized SIZE_MAX"
#endif /* SIZE_MAX */
return sizeof(size_t) * 8 - leading_zeros - 1;
#endif /* _MSC_VER */
}
/* buffers and max levels params */
size_t dwt_buffer_length(size_t input_len, size_t filter_len, MODE mode){
if(input_len < 1 || filter_len < 1)
return 0;
switch(mode){
case MODE_PERIODIZATION:
return input_len / 2 + ((input_len%2) ? 1 : 0);
default:
return (input_len + filter_len - 1) / 2;
}
}
size_t reconstruction_buffer_length(size_t coeffs_len, size_t filter_len){
if(coeffs_len < 1 || filter_len < 1)
return 0;
return 2*coeffs_len+filter_len-2;
}
size_t idwt_buffer_length(size_t coeffs_len, size_t filter_len, MODE mode){
switch(mode){
case MODE_PERIODIZATION:
return 2*coeffs_len;
default:
return 2*coeffs_len-filter_len+2;
}
}
size_t swt_buffer_length(size_t input_len){
return input_len;
}
unsigned char dwt_max_level(size_t input_len, size_t filter_len){
if(filter_len <= 1 || input_len < (filter_len-1))
return 0;
return size_log2(input_len/(filter_len-1));
}
unsigned char swt_max_level(size_t input_len){
/* check how many times input_len is divisible by 2 */
unsigned char j = 0;
while (input_len > 0){
if (input_len % 2)
return j;
input_len /= 2;
j++;
}
return j;
}
|