summaryrefslogtreecommitdiff
path: root/gr-wavelet/python
diff options
context:
space:
mode:
Diffstat (limited to 'gr-wavelet/python')
-rw-r--r--gr-wavelet/python/CMakeLists.txt47
-rw-r--r--gr-wavelet/python/__init__.py28
-rwxr-xr-xgr-wavelet/python/qa_classify.py181
3 files changed, 256 insertions, 0 deletions
diff --git a/gr-wavelet/python/CMakeLists.txt b/gr-wavelet/python/CMakeLists.txt
new file mode 100644
index 000000000..9ddcb7ea9
--- /dev/null
+++ b/gr-wavelet/python/CMakeLists.txt
@@ -0,0 +1,47 @@
+# Copyright 2012 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+
+########################################################################
+include(GrPython)
+
+GR_PYTHON_INSTALL(
+ FILES
+ __init__.py
+ DESTINATION ${GR_PYTHON_DIR}/gnuradio/wavelet
+ COMPONENT "wavelet_python"
+)
+
+########################################################################
+# Handle the unit tests
+########################################################################
+if(ENABLE_TESTING)
+include(GrTest)
+file(GLOB py_qa_test_files "qa_*.py")
+foreach(py_qa_test_file ${py_qa_test_files})
+ get_filename_component(py_qa_test_name ${py_qa_test_file} NAME_WE)
+ set(GR_TEST_PYTHON_DIRS
+ ${CMAKE_BINARY_DIR}/gnuradio-core/src/python
+ ${CMAKE_BINARY_DIR}/gnuradio-core/src/lib/swig
+ ${CMAKE_BINARY_DIR}/gr-wavelet/python
+ ${CMAKE_BINARY_DIR}/gr-wavelet/swig
+ )
+ set(GR_TEST_TARGET_DEPS gruel gnuradio-core gnuradio-wavelet)
+ GR_ADD_TEST(${py_qa_test_name} ${PYTHON_EXECUTABLE} ${py_qa_test_file})
+endforeach(py_qa_test_file)
+endif(ENABLE_TESTING)
diff --git a/gr-wavelet/python/__init__.py b/gr-wavelet/python/__init__.py
new file mode 100644
index 000000000..ce63ed37c
--- /dev/null
+++ b/gr-wavelet/python/__init__.py
@@ -0,0 +1,28 @@
+#
+# Copyright 2011 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+'''
+This is the gr-wavelet package. This package provides GNU Radio
+processing blocks for wavelet transforms.
+'''
+
+from wavelet_swig import *
+
diff --git a/gr-wavelet/python/qa_classify.py b/gr-wavelet/python/qa_classify.py
new file mode 100755
index 000000000..157d6b8c6
--- /dev/null
+++ b/gr-wavelet/python/qa_classify.py
@@ -0,0 +1,181 @@
+#!/usr/bin/env python
+#
+# Copyright 2008,2010 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+import numpy
+from gnuradio import gr, gr_unittest
+import copy
+#import pygsl.wavelet as wavelet # FIXME: pygsl not checked for in config
+import math
+import wavelet_swig
+
+def sqr(x):
+ return x*x
+
+def np2(k):
+ m = 0
+ n = k - 1
+ while n > 0:
+ m += 1
+ return m
+
+
+class test_classify(gr_unittest.TestCase):
+
+ def setUp(self):
+ self.tb = gr.top_block()
+
+ def tearDown(self):
+ self.tb = None
+
+# def test_000_(self):
+# src_data = numpy.zeros(10)
+# trg_data = numpy.zeros(10)
+# src = gr.vector_source_f(src_data)
+# dst = gr.vector_sink_f()
+# self.tb.connect(src, dst)
+# self.tb.run()
+# rsl_data = dst.data()
+# sum = 0
+# for (u,v) in zip(trg_data, rsl_data):
+# w = u - v
+# sum += w * w
+# sum /= float(len(trg_data))
+# assert sum < 1e-6
+
+ def test_001_(self):
+ src_data = numpy.array([-1.0, 1.0, -1.0, 1.0])
+ trg_data = src_data * 0.5
+ src = gr.vector_source_f(src_data)
+ dst = gr.vector_sink_f()
+ rail = gr.rail_ff(-0.5, 0.5)
+ self.tb.connect(src, rail)
+ self.tb.connect(rail, dst)
+ self.tb.run()
+ rsl_data = dst.data()
+ sum = 0
+ for (u, v) in zip(trg_data, rsl_data):
+ w = u - v
+ sum += w * w
+ sum /= float(len(trg_data))
+ assert sum < 1e-6
+
+ def test_002_(self):
+ src_data = numpy.array([-1.0,
+ -1.0/2.0,
+ -1.0/3.0,
+ -1.0/4.0,
+ -1.0/5.0])
+ trg_data = copy.deepcopy(src_data)
+
+ src = gr.vector_source_f(src_data, False, len(src_data))
+ st = gr.stretch_ff(-1.0/5.0, len(src_data))
+ dst = gr.vector_sink_f(len(src_data))
+ self.tb.connect(src, st)
+ self.tb.connect(st, dst)
+ self.tb.run()
+ rsl_data = dst.data()
+ sum = 0
+ for (u, v) in zip(trg_data, rsl_data):
+ w = u - v
+ sum += w * w
+ sum /= float(len(trg_data))
+ assert sum < 1e-6
+
+ def test_003_(self):
+ src_grid = (0.0, 1.0, 2.0, 3.0, 4.0)
+ trg_grid = copy.deepcopy(src_grid)
+ src_data = (0.0, 1.0, 0.0, 1.0, 0.0)
+
+ src = gr.vector_source_f(src_data, False, len(src_grid))
+ sq = wavelet_swig.squash_ff(src_grid, trg_grid)
+ dst = gr.vector_sink_f(len(trg_grid))
+ self.tb.connect(src, sq)
+ self.tb.connect(sq, dst)
+ self.tb.run()
+ rsl_data = dst.data()
+ sum = 0
+ for (u, v) in zip(src_data, rsl_data):
+ w = u - v
+ sum += w * w
+ sum /= float(len(src_data))
+ assert sum < 1e-6
+
+# def test_004_(self): # FIXME: requires pygsl
+#
+# n = 256
+# o = 4
+# ws = wavelet.workspace(n)
+# w = wavelet.daubechies(o)
+#
+# a = numpy.arange(n)
+# b = numpy.sin(a*numpy.pi/16.0)
+# c = w.transform_forward(b, ws)
+# d = w.transform_inverse(c, ws)
+#
+# src = gr.vector_source_f(b, False, n)
+# wv = wavelet_swig.wavelet_ff(n, o, True)
+#
+# dst = gr.vector_sink_f(n)
+# self.tb.connect(src, wv)
+# self.tb.connect(wv, dst)
+# self.tb.run()
+# e = dst.data()
+#
+# sum = 0
+# for (u, v) in zip(c, e):
+# w = u - v
+# sum += w * w
+# sum /= float(len(c))
+# assert sum < 1e-6
+
+ def test_005_(self):
+
+ src_data = (1.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0)
+
+ dwav = numpy.array(src_data)
+ wvps = numpy.zeros(3)
+ # wavelet power spectrum
+ scl = 1.0/sqr(dwav[0])
+ k = 1
+ for e in range(len(wvps)):
+ wvps[e] = scl*sqr(dwav[k:k+(01<<e)]).sum()
+ k += 01<<e
+
+ src = gr.vector_source_f(src_data, False, len(src_data))
+ kon = wavelet_swig.wvps_ff(len(src_data))
+ dst = gr.vector_sink_f(int(math.ceil(math.log(len(src_data), 2))))
+
+ self.tb.connect(src, kon)
+ self.tb.connect(kon, dst)
+
+ self.tb.run()
+ snk_data = dst.data()
+
+ sum = 0
+ for (u,v) in zip(snk_data, wvps):
+ w = u - v
+ sum += w * w
+ sum /= float(len(snk_data))
+ assert sum < 1e-6
+
+if __name__ == '__main__':
+ gr_unittest.run(test_classify, "test_classify.xml")