annotate src/fftw-3.3.3/genfft/trig.ml @ 168:ceec0dd9ec9c

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam <cannam@all-day-breakfast.com>
date Fri, 07 Feb 2020 11:51:13 +0000
parents 89f5e221ed7b
children
rev   line source
cannam@95 1 (*
cannam@95 2 * Copyright (c) 1997-1999 Massachusetts Institute of Technology
cannam@95 3 * Copyright (c) 2003, 2007-11 Matteo Frigo
cannam@95 4 * Copyright (c) 2003, 2007-11 Massachusetts Institute of Technology
cannam@95 5 *
cannam@95 6 * This program is free software; you can redistribute it and/or modify
cannam@95 7 * it under the terms of the GNU General Public License as published by
cannam@95 8 * the Free Software Foundation; either version 2 of the License, or
cannam@95 9 * (at your option) any later version.
cannam@95 10 *
cannam@95 11 * This program is distributed in the hope that it will be useful,
cannam@95 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cannam@95 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cannam@95 14 * GNU General Public License for more details.
cannam@95 15 *
cannam@95 16 * You should have received a copy of the GNU General Public License
cannam@95 17 * along with this program; if not, write to the Free Software
cannam@95 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
cannam@95 19 *
cannam@95 20 *)
cannam@95 21
cannam@95 22 (* trigonometric transforms *)
cannam@95 23 open Util
cannam@95 24
cannam@95 25 (* DFT of real input *)
cannam@95 26 let rdft sign n input =
cannam@95 27 Fft.dft sign n (Complex.real @@ input)
cannam@95 28
cannam@95 29 (* DFT of hermitian input *)
cannam@95 30 let hdft sign n input =
cannam@95 31 Fft.dft sign n (Complex.hermitian n input)
cannam@95 32
cannam@95 33 (* DFT real transform of vectors of two real numbers,
cannam@95 34 multiplication by (NaN I), and summation *)
cannam@95 35 let dft_via_rdft sign n input =
cannam@95 36 let f = rdft sign n input
cannam@95 37 in fun i ->
cannam@95 38 Complex.plus
cannam@95 39 [Complex.real (f i);
cannam@95 40 Complex.times (Complex.nan Expr.I) (Complex.imag (f i))]
cannam@95 41
cannam@95 42 (* Discrete Hartley Transform *)
cannam@95 43 let dht sign n input =
cannam@95 44 let f = Fft.dft sign n (Complex.real @@ input) in
cannam@95 45 (fun i ->
cannam@95 46 Complex.plus [Complex.real (f i); Complex.imag (f i)])
cannam@95 47
cannam@95 48 let trigI n input =
cannam@95 49 let twon = 2 * n in
cannam@95 50 let input' = Complex.hermitian twon input
cannam@95 51 in
cannam@95 52 Fft.dft 1 twon input'
cannam@95 53
cannam@95 54 let interleave_zero input = fun i ->
cannam@95 55 if (i mod 2) == 0
cannam@95 56 then Complex.zero
cannam@95 57 else
cannam@95 58 input ((i - 1) / 2)
cannam@95 59
cannam@95 60 let trigII n input =
cannam@95 61 let fourn = 4 * n in
cannam@95 62 let input' = Complex.hermitian fourn (interleave_zero input)
cannam@95 63 in
cannam@95 64 Fft.dft 1 fourn input'
cannam@95 65
cannam@95 66 let trigIII n input =
cannam@95 67 let fourn = 4 * n in
cannam@95 68 let twon = 2 * n in
cannam@95 69 let input' = Complex.hermitian fourn
cannam@95 70 (fun i ->
cannam@95 71 if (i == 0) then
cannam@95 72 Complex.real (input 0)
cannam@95 73 else if (i == twon) then
cannam@95 74 Complex.uminus (Complex.real (input 0))
cannam@95 75 else
cannam@95 76 Complex.antihermitian twon input i)
cannam@95 77 in
cannam@95 78 let dft = Fft.dft 1 fourn input'
cannam@95 79 in fun k -> dft (2 * k + 1)
cannam@95 80
cannam@95 81 let zero_extend n input = fun i ->
cannam@95 82 if (i >= 0 && i < n)
cannam@95 83 then input i
cannam@95 84 else Complex.zero
cannam@95 85
cannam@95 86 let trigIV n input =
cannam@95 87 let fourn = 4 * n
cannam@95 88 and eightn = 8 * n in
cannam@95 89 let input' = Complex.hermitian eightn
cannam@95 90 (zero_extend fourn (Complex.antihermitian fourn
cannam@95 91 (interleave_zero input)))
cannam@95 92 in
cannam@95 93 let dft = Fft.dft 1 eightn input'
cannam@95 94 in fun k -> dft (2 * k + 1)
cannam@95 95
cannam@95 96 let make_dct scale nshift trig =
cannam@95 97 fun n input ->
cannam@95 98 trig (n - nshift) (Complex.real @@ (Complex.times scale) @@
cannam@95 99 (zero_extend n input))
cannam@95 100 (*
cannam@95 101 * DCT-I: y[k] = sum x[j] cos(pi * j * k / n)
cannam@95 102 *)
cannam@95 103 let dctI = make_dct Complex.one 1 trigI
cannam@95 104
cannam@95 105 (*
cannam@95 106 * DCT-II: y[k] = sum x[j] cos(pi * (j + 1/2) * k / n)
cannam@95 107 *)
cannam@95 108 let dctII = make_dct Complex.one 0 trigII
cannam@95 109
cannam@95 110 (*
cannam@95 111 * DCT-III: y[k] = sum x[j] cos(pi * j * (k + 1/2) / n)
cannam@95 112 *)
cannam@95 113 let dctIII = make_dct Complex.half 0 trigIII
cannam@95 114
cannam@95 115 (*
cannam@95 116 * DCT-IV y[k] = sum x[j] cos(pi * (j + 1/2) * (k + 1/2) / n)
cannam@95 117 *)
cannam@95 118 let dctIV = make_dct Complex.half 0 trigIV
cannam@95 119
cannam@95 120 let shift s input = fun i -> input (i - s)
cannam@95 121
cannam@95 122 (* DST-x input := TRIG-x (input / i) *)
cannam@95 123 let make_dst scale nshift kshift jshift trig =
cannam@95 124 fun n input ->
cannam@95 125 Complex.real @@
cannam@95 126 (shift (- jshift)
cannam@95 127 (trig (n + nshift) (Complex.uminus @@
cannam@95 128 (Complex.times Complex.i) @@
cannam@95 129 (Complex.times scale) @@
cannam@95 130 Complex.real @@
cannam@95 131 (shift kshift (zero_extend n input)))))
cannam@95 132
cannam@95 133 (*
cannam@95 134 * DST-I: y[k] = sum x[j] sin(pi * j * k / n)
cannam@95 135 *)
cannam@95 136 let dstI = make_dst Complex.one 1 1 1 trigI
cannam@95 137
cannam@95 138 (*
cannam@95 139 * DST-II: y[k] = sum x[j] sin(pi * (j + 1/2) * k / n)
cannam@95 140 *)
cannam@95 141 let dstII = make_dst Complex.one 0 0 1 trigII
cannam@95 142
cannam@95 143 (*
cannam@95 144 * DST-III: y[k] = sum x[j] sin(pi * j * (k + 1/2) / n)
cannam@95 145 *)
cannam@95 146 let dstIII = make_dst Complex.half 0 1 0 trigIII
cannam@95 147
cannam@95 148 (*
cannam@95 149 * DST-IV y[k] = sum x[j] sin(pi * (j + 1/2) * (k + 1/2) / n)
cannam@95 150 *)
cannam@95 151 let dstIV = make_dst Complex.half 0 0 0 trigIV
cannam@95 152