Digital Signal Processing
Digital signal processing (DSP) is concerned with the representation of signals by a sequence of numbers or symbols and the processing of these signals. Digital signal processing and analog signal processing are subfields of signal processing. DSP includes subfields like: audio and speech signal processing, sonar and radar signal processing, sensor array processing, spectral estimation, statistical signal processing, digital image processing, signal processing for communications, control of systems, biomedical signal processing, seismic data processing, etc.
(Source: Wikipedia article on Digital Signal Processing)
How does Aquila fit into that?
Aquila operates on signals, which in fact are only arrays of numeric values. You can read signals from files (for example .wav audio format), use the entire data or only some parts of it (we call these parts frames). You can calculate spectra (using Fast Fourier Transform), or apply other mathematical transformations.
Sometimes the signals have to be somehow reduced in size in order to be more easily comparable. This is not compression - the signals cannot be recovered from their reduced form - but something called feature extraction. Aquila makes it easy to calculate different features, for example MFCC, commonly used in speech recognition.
But how to compare one signal with another? How to determine that two signals are similar? With Aquila, the answer is: find the distance between them. The library implements a simple but powerful algorithm known as Dynamic Time Warping, which does some non-linear pattern matching to calculate distance between two sets of data.
It all started in 2007 as an academic project. The goal of the project was to develop software capable of recognizing birds' songs. The code was a big mess then, most of it was written in Borland 6 IDE and built only with Borland C++ compiler. It had a very crude user interface, but it worked :) The recognition accuracy reached 85-90% with several bird species.
Aquila 2 was an effort to separate the code responsible for signal processing from anything GUI-related, reduce code bloat and say goodbye to Borland. I have to admit that this was my "sandbox" for learning version control, design patterns and a few other things. For the most part, it was succesful. The code reached mostly stable state and was now (almost) independent of any GUI framework. Almost, because I was (hey, I still am) interested in Qt and decided to use qmake as build system. Well, that wasn't a well-thought choice. Aquila 2 formed a base of another bird-related software called SimpleBird (coming soon).
So what has changed in the third implementation of the library? Well, almost everything. The library is much more generic in the way it handles data. We moved from Subversion to Git (in case you don't know - GitHub rocks!) and from qmake to CMake, because building with CMake is sooo easy.
Currently there is still a lot of work to do. Many features present in Aquila 2 aren't ported yet and there are many new ideas to try and implement. The future lies ahead ;)