Skip to content

Commit 53caa9d

Browse files
committed
improve Filter.estimate_frame_bounds
1 parent 3da9968 commit 53caa9d

File tree

2 files changed

+57
-22
lines changed

2 files changed

+57
-22
lines changed

pygsp/filters/filter.py

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -272,44 +272,79 @@ def tighten(self):
272272
"""
273273
raise NotImplementedError
274274

275-
def filterbank_bounds(self, N=999, bounds=None):
275+
def estimate_frame_bounds(self, min=0, max=None, N=1000,
276+
use_eigenvalues=False):
276277
r"""
277-
Compute approximate frame bounds for a filterbank.
278+
Compute approximate frame bounds for the filterbank.
279+
280+
The frame bounds are estimated using the vector :code:`np.linspace(min,
281+
max, N)` with min=0 and max=G.lmax by default. The eigenvalues G.e can
282+
be used instead if you set use_eigenvalues to True.
278283
279284
Parameters
280285
----------
281-
bounds : interval to compute the bound.
282-
Given in an ndarray: np.array([xmin, xnmax]).
283-
By default, bounds is None and filtering is bounded
284-
by the eigenvalues of G.
285-
N : Number of point for the line search
286-
Default is 999
286+
min : float
287+
The lowest value the filter bank is evaluated at. By default
288+
filtering is bounded by the eigenvalues of G, i.e. min = 0.
289+
max : float
290+
The largest value the filter bank is evaluated at. By default
291+
filtering is bounded by the eigenvalues of G, i.e. max = G.lmax.
292+
N : int
293+
Number of points where the filter bank is evaluated.
294+
Default is 1000.
295+
use_eigenvalues : bool
296+
Set to True to use the Laplacian eigenvalues instead.
287297
288298
Returns
289299
-------
290-
lower : Filterbank lower bound
291-
upper : Filterbank upper bound
300+
A : float
301+
Lower frame bound of the filter bank.
302+
B : float
303+
Upper frame bound of the filter bank.
292304
293305
Examples
294306
--------
295-
>>> import numpy as np
296307
>>> from pygsp import graphs, filters
297308
>>> G = graphs.Logo()
298-
>>> MH = filters.MexicanHat(G)
299-
>>> bounds = MH.filterbank_bounds()
300-
>>> print('lower={:.3f}, upper={:.3f}'.format(bounds[0], bounds[1]))
301-
lower=0.178, upper=0.270
309+
>>> G.estimate_lmax()
310+
>>> f = filters.MexicanHat(G)
311+
312+
Bad estimation:
313+
>>> A, B = f.estimate_frame_bounds(min=1, max=20, N=100)
314+
>>> print('A={:.3f}, B={:.3f}'.format(A, B))
315+
A=0.126, B=0.270
316+
317+
Better estimation:
318+
>>> A, B = f.estimate_frame_bounds()
319+
>>> print('A={:.3f}, B={:.3f}'.format(A, B))
320+
A=0.177, B=0.270
321+
322+
Best estimation:
323+
>>> G.compute_fourier_basis()
324+
>>> A, B = f.estimate_frame_bounds(use_eigenvalues=True)
325+
>>> print('A={:.3f}, B={:.3f}'.format(A, B))
326+
A=0.178, B=0.270
327+
328+
The Itersine filter bank defines a tight frame:
329+
>>> f = filters.Itersine(G)
330+
>>> G.compute_fourier_basis()
331+
>>> A, B = f.estimate_frame_bounds(use_eigenvalues=True)
332+
>>> print('A={:.3f}, B={:.3f}'.format(A, B))
333+
A=1.000, B=1.000
302334
303335
"""
304-
if bounds:
305-
xmin, xmax = bounds
306-
rng = np.linspace(xmin, xmax, N)
336+
337+
if max is None:
338+
max = self.G.lmax
339+
340+
if use_eigenvalues:
341+
x = self.G.e
307342
else:
308-
rng = self.G.e
343+
x = np.linspace(min, max, N)
309344

310-
sum_filters = np.sum(np.abs(np.power(self.evaluate(rng), 2)), axis=0)
345+
sum_filters = np.sum(np.abs(np.power(self.evaluate(x), 2)), axis=0)
311346

312-
return np.min(sum_filters), np.max(sum_filters)
347+
return sum_filters.min(), sum_filters.max()
313348

314349
def filterbank_matrix(self):
315350
r"""

pygsp/tests/test_filters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def _test_methods(self, f):
5151
self._test_synthesis(f)
5252
f.evaluate(np.ones(10))
5353

54-
f.filterbank_bounds()
54+
f.estimate_frame_bounds()
5555
# f.filterbank_matrix() TODO: too much memory
5656

5757
# TODO: f.can_dual()

0 commit comments

Comments
 (0)