aboutsummaryrefslogtreecommitdiff
path: root/src/walsh2.cpp
blob: 3e155924e71f0fde553ef472e90a37404a5f19e0 (plain)
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
/*
    walsh2.cpp
    Copyright (C) 2018 Mottakin Chowdhury
    Copyright (C) 2019 Richard Knight


    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 3 of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program; if not, write to the Free Software Foundation,
    Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 */
#include <plugin.h>

const int N = 1<<16;


void fwtanal(csnd::Vector<MYFLT> io) {
    int n = io.len();
    for (int d = 1; d < n; d <<= 1) {
        for (int i = 0, m = d<<1; i < n; i += m) {
            for (int j = 0; j < d; j++) { /// Don't forget modulo if required
                MYFLT x = io[i+j], y = io[i+j+d];
                io[i+j] = (x+y), io[i+j+d] = (x-y);	// xor
                // io[i+j] = x+y; // and
                // io[i+j+d] = x+y; // or
            }
        }
    }
}


void fwtsynth(csnd::Vector<MYFLT> io) {
    int n = io.len();
    for (int d = 1; d < n; d <<= 1) {
        for (int i = 0, m = d<<1; i < n; i += m) {
            for (int j = 0; j < d; j++) { /// Don't forget modulo if required
                MYFLT x = io[i+j]; 
                MYFLT y = io[i+j+d];
                 /// Modular inverse if required here
                ///////io[i+j] = (x+y)>>1, io[i+j+d] = (x-y)>>1; // xor
                io[i+j] = (x+y)/2;
                io[i+j+d] = (x-y)/2;
                // io[i+j] = x-y; // and
                // io[i+j+d] = y-x; // or
            }
        }
    }
}