def dwt(self,other="haar",wavelet_k=2): """ Wraps the gsl WaveletTransform.forward in dwt.pyx (written by Joshua Kantor). Assumes the length of the sample is a power of 2. Uses the GSL function gsl_wavelet_transform_forward. other -- the wavelet_type: the name of the type of wavelet, valid choices are: 'daubechies','daubechies_centered', 'haar' (default),'haar_centered', 'bspline', and 'bspline_centered'. wavelet_k -- For daubechies wavelets, wavelet_k specifies a daubechie wavelet with k/2 vanishing moments. k = 4,6,...,20 for k even are the only ones implemented. For Haar wavelets, wavelet_k must be 2. For bspline wavelets, wavelet_k = 103,105,202,204,206,208,301,305, 307,309 will give biorthogonal B-spline wavelets of order (i,j) where wavelet_k=100*i+j. The wavelet transform uses J=log_2(n) levels. EXAMPLES: sage: J = range(8) sage: A = [RR(1) for i in J] sage: s = IndexedSequence(A,J) sage: t = s.dwt() sage: t # slightly random output Indexed sequence: [2.82842712474999, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000] indexed by [0, 1, 2, 3, 4, 5, 6, 7] """ F = self.base_ring() ## elements must be coercible into RR J = self.index_object() ## must be = range(N) N = len(J) ## must be 1 minus a power of 2 S = self.list() if other=="haar" or other=="haar_centered": if wavelet_k in [2]: a = WaveletTransform(N,other,wavelet_k) else: raise ValueError,"wavelet_k must be = 2" if other=="debauchies" or other=="debauchies_centered": if wavelet_k in [4,6,8,10,12,14,16,18,20]: a = WaveletTransform(N,other,wavelet_k) else: raise ValueError,"wavelet_k must be in {4,6,8,10,12,14,16,18,20}" if other=="bspline" or other=="bspline_centered": if wavelet_k in [103,105,202,204,206,208,301,305,307,309]: a = WaveletTransform(N,other,103) else: raise ValueError,"wavelet_k must be in {103,105,202,204,206,208,301,305,307,309}" for i in range(N): a[i] = S[i] a.forward_transform() return IndexedSequence([RR(a[j]) for j in J],J)
def idwt(self, other="haar", wavelet_k=2): """ Implements the gsl ``WaveletTransform.backward()`` in :mod:`~sage.gsl.dwt`. Assumes the length of the sample is a power of 2. Uses the GSL function ``gsl_wavelet_transform_backward()``. INPUT: - ``other`` -- Must be one of the following: * ``"haar"`` * ``"daubechies"`` * ``"daubechies_centered"`` * ``"haar_centered"`` * ``"bspline"`` * ``"bspline_centered"`` - ``wavelet_k`` -- For daubechies wavelets, ``wavelet_k`` specifies a daubechie wavelet with `k/2` vanishing moments. `k = 4,6,...,20` for `k` even are the only ones implemented. For Haar wavelets, ``wavelet_k`` must be 2. For bspline wavelets, ``wavelet_k`` equal to `103,105,202,204, 206,208,301,305,307,309` will give biorthogonal B-spline wavelets of order `(i,j)` where ``wavelet_k`` equals `100 \cdot i + j`. EXAMPLES:: sage: J = range(8) sage: A = [RR(1) for i in J] sage: s = IndexedSequence(A,J) sage: t = s.dwt() sage: t # random arch dependent output Indexed sequence: [2.82842712474999, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000] indexed by [0, 1, 2, 3, 4, 5, 6, 7] sage: t.idwt() # random arch dependent output Indexed sequence: [1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000, 1.00000000000000] indexed by [0, 1, 2, 3, 4, 5, 6, 7] sage: t.idwt() == s True sage: J = range(16) sage: A = [RR(1) for i in J] sage: s = IndexedSequence(A,J) sage: t = s.dwt("bspline", 103) sage: t # random arch dependent output Indexed sequence: [4.00000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000] indexed by [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] sage: t.idwt("bspline", 103) == s True """ # elements must be coercible into RR J = self.index_object() ## must be = range(N) N = len(J) ## must be 1 minus a power of 2 S = self.list() k = wavelet_k if other=="haar" or other=="haar_centered": if k in [2]: a = WaveletTransform(N,other,wavelet_k) else: raise ValueError("wavelet_k must be = 2") if other=="debauchies" or other=="debauchies_centered": if k in [4,6,8,10,12,14,16,18,20]: a = WaveletTransform(N,other,wavelet_k) else: raise ValueError("wavelet_k must be in {4,6,8,10,12,14,16,18,20}") if other=="bspline" or other=="bspline_centered": if k in [103,105,202,204,206,208,301,305,307,309]: a = WaveletTransform(N,other,103) else: raise ValueError("wavelet_k must be in {103,105,202,204,206,208,301,305,307,309}") for i in range(N): a[i] = S[i] a.backward_transform() return IndexedSequence([RR(a[j]) for j in J],J)
def dwt(self,other="haar",wavelet_k=2): """ Wraps the gsl ``WaveletTransform.forward`` in :mod:`~sage.gsl.dwt` (written by Joshua Kantor). Assumes the length of the sample is a power of 2. Uses the GSL function ``gsl_wavelet_transform_forward()``. INPUT: - ``other`` -- the the name of the type of wavelet; valid choices are: * ``'daubechies'`` * ``'daubechies_centered'`` * ``'haar'`` (default) * ``'haar_centered'`` * ``'bspline'`` * ``'bspline_centered'`` - ``wavelet_k`` -- For daubechies wavelets, ``wavelet_k`` specifies a daubechie wavelet with `k/2` vanishing moments. `k = 4,6,...,20` for `k` even are the only ones implemented. For Haar wavelets, ``wavelet_k`` must be 2. For bspline wavelets, ``wavelet_k`` equal to `103,105,202,204, 206,208,301,305,307,309` will give biorthogonal B-spline wavelets of order `(i,j)` where ``wavelet_k`` equals `100 \cdot i + j`. The wavelet transform uses `J = \log_2(n)` levels. EXAMPLES:: sage: J = range(8) sage: A = [RR(1) for i in J] sage: s = IndexedSequence(A,J) sage: t = s.dwt() sage: t # slightly random output Indexed sequence: [2.82842712474999, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000, 0.000000000000000] indexed by [0, 1, 2, 3, 4, 5, 6, 7] """ # elements must be coercible into RR J = self.index_object() ## must be = range(N) N = len(J) ## must be 1 minus a power of 2 S = self.list() if other == "haar" or other == "haar_centered": if wavelet_k in [2]: a = WaveletTransform(N,other,wavelet_k) else: raise ValueError("wavelet_k must be = 2") if other == "debauchies" or other == "debauchies_centered": if wavelet_k in [4,6,8,10,12,14,16,18,20]: a = WaveletTransform(N,other,wavelet_k) else: raise ValueError("wavelet_k must be in {4,6,8,10,12,14,16,18,20}") if other == "bspline" or other == "bspline_centered": if wavelet_k in [103,105,202,204,206,208,301,305,307,309]: a = WaveletTransform(N,other,103) else: raise ValueError("wavelet_k must be in {103,105,202,204,206,208,301,305,307,309}") for i in range(N): a[i] = S[i] a.forward_transform() return IndexedSequence([RR(a[j]) for j in J],J)