Source code for pygsp.filters.meyer

# -*- coding: utf-8 -*-

from . import Filter

import numpy as np
from math import pi


[docs]class Meyer(Filter): r""" Meyer Filterbank Inherits its methods from Filters Parameters ---------- G : Graph Nf : int Number of filters from 0 to lmax (default = 6) Returns ------- out : Meyer Examples -------- >>> from pygsp import graphs, filters >>> G = graphs.Logo() >>> F = filters.Meyer(G) """ def __init__(self, G, Nf=6, **kwargs): super(Meyer, self).__init__(G, **kwargs) if not hasattr(G, 't'): G.t = (4./(3 * G.lmax)) * np.power(2., np.arange(Nf-2, -1, -1)) if len(G.t) >= Nf - 1: self.logger.warning('You have specified more scales than' ' the number of scales minus 1') t = G.t g = [lambda x: kernel_meyer(t[0] * x, 'sf')] for i in range(Nf - 1): g.append(lambda x, ind=i: kernel_meyer(t[ind] * x, 'wavelet')) self.g = g def kernel_meyer(x, kerneltype): r""" Evaluates Meyer function and scaling function Parameters ---------- x : ndarray Array of independant variables values kerneltype : str Can be either 'sf' or 'wavelet' Returns ------- r : ndarray """ x = np.array(x) l1 = 2/3. l2 = 4/3. l3 = 8/3. v = lambda x: x ** 4. * (35 - 84*x + 70*x**2 - 20*x**3) r1ind = (x < l1) r2ind = (x >= l1)*(x < l2) r3ind = (x >= l2)*(x < l3) r = np.empty(x.shape) if kerneltype is 'sf': r[r1ind] = 1 r[r2ind] = np.cos((pi/2) * v(np.abs(x[r2ind])/l1 - 1)) elif kerneltype is 'wavelet': r[r2ind] = np.sin((pi/2) * v(np.abs(x[r2ind])/l1 - 1)) r[r3ind] = np.cos((pi/2) * v(np.abs(x[r3ind])/l2 - 1)) else: raise TypeError('Unknown kernel type ', kerneltype) return r