This is a simple example of wavelets implementation that may be extended to some applied Digital Signal Processing implementations.
For release notes about latest version, go to the end here.
I'm a Computer Engineer responsible for DSP implementation and real time applications in my job. Looking for increasing my skills with DSP I decided to study the Wavelet transforms that could be very useful for any future project. I started reading the book Conceptual Wavelets by D. Lee Fugal. During the studies I became amazed with the power of Wavelets. Well, in order to consolidate the knowledge I did some "experiments" in Matlab, but since I am a C++ developer I decided to implement my own algorithm for Wavelets computation.
Why my own implementation?
- First of all, because it's a passion.
- I'm thinking about a code that could be easily be ported to use CUDA nVidia processors.
- I expect to make a code that is suitable to be used in embedded systems.
- For my interests, I need an implementation where it will be possible to know very well the amount of memory needed for a certain Wavelet configuration (levels, filter size, signal window...)
- An easy LGPLv2.1 license for anyone who wants to use.
Memory and CPU usage considerations
- I worked a lot with projects where thousands of instances had to be started in one PC. When we think about just one instance (like most people does) we can imagine that there is infinite amount of memory and CPU resources, but when we thing about thousands instances running, we need to program as we were in an resource limited embedded system.
- When thinking about performance, the cache performance becomes critical. And then, a well usage of memory must be taken into account.
Some plans of implementation here. But I will transform all plans to issue in bitbucket
- Now that CUDA is already being tested and timers are already implemented, it would be nice to start implementing some methods using CUDA and check the performance.
- Some wavelet application that I am planning to implement will be private.
- Gabor transform would be easier to implement now that a fourier transform class is already implemented.
- Generation of some important functions. Sync, Mexican hat, gausian...
- Complete FIR filter, low, high, band-pass and band-reject.
- Class for handling complex numbers.
- Fast FIR filter using FAST FOURIER TRANSFORM.
Just for now I left the Doxygen output on the following link for reference: libwavelet doc
About me: Starting my blog
I don't have enough time to go fast as I would like with this implementation. I just have some nights after the work and weekends. That's not a problem, since programming is a passion for me, but it limits the amount of time I have to create new things.
- I could calculate that I have arround 3 hours per week to dedicate to the project.
- Until now (MAR,07 2016), I spent arround 30 hours on it.
- Until now (APR,02 2016), I spent arround 38 hours on it.
- Until now (APR,21 2016), I spent arround 43 hours on it.
- Until now (MAY,04 2016), I spent arround 53 hours on it.
- ***I am still counting the time I spend on it, but now it is for me, internal.
Implemented in current latest version
- Improvement: DFT class method for calculation fourier transform module.
- Improvement: Unit tests were better described and reorganized.
- Improvement: DFT class better documented.
- Improvement: Implemented a circular convolution much faster than the one implemented before.
- Feature: Inverse Fourier Transform implementation finished.
Remaining from previous versions
- Before compiling it is needed to manually execture "source ./yeppp-1.0.0/set-vars.sh" in order to prepare the yeppp library environment. It would be nice to make it automatically.
- Makefile not checking automatically if CUDA libraries must be compiled together.
- Lot's of "todo" were added since some new implementations were not completely finished yet.