File: common.c

package info (click to toggle)
pywavelets 1.4.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 13,680 kB
  • sloc: python: 8,849; ansic: 5,134; makefile: 93
file content (97 lines) | stat: -rw-r--r-- 2,655 bytes parent folder | download | duplicates (3)
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;
}