|
1 /*! |
|
2 Fourier transform traits |
|
3 */ |
|
4 |
|
5 use alg_tools::types::{Num, Float}; |
|
6 use alg_tools::mapping::{RealMapping, Mapping}; |
|
7 use alg_tools::bisection_tree::Weighted; |
|
8 use alg_tools::loc::Loc; |
|
9 |
|
10 /// Trait for Fourier transforms. When F is a non-complex number, the transform |
|
11 /// also has to be non-complex, i.e., the function itself symmetric. |
|
12 pub trait Fourier<F : Num> : Mapping<Self::Domain, Codomain=F> { |
|
13 type Domain; |
|
14 type Transformed : Mapping<Self::Domain, Codomain=F>; |
|
15 |
|
16 fn fourier(&self) -> Self::Transformed; |
|
17 } |
|
18 |
|
19 impl<F : Float, T, const N : usize> Fourier<F> |
|
20 for Weighted<T, F> |
|
21 where T : Fourier<F, Domain = Loc<F, N>> + RealMapping<F, N> { |
|
22 type Domain = T::Domain; |
|
23 type Transformed = Weighted<T::Transformed, F>; |
|
24 |
|
25 #[inline] |
|
26 fn fourier(&self) -> Self::Transformed { |
|
27 Weighted { |
|
28 base_fn : self.base_fn.fourier(), |
|
29 weight : self.weight |
|
30 } |
|
31 } |
|
32 } |