C++ DSP Library

I have built a C++ DSP Library, that comprises the following modules:

All computations are done with user-defineable precision, to be able to simulate any real life fixed point calculations. Custom fixed points can be used, whose precision can be set anywhere in the [2...63] bits range. Or, quasi-infinite precision can be obtained by simply changing the type of the numbers from fixed point to floating point.
Controlling simulation's precision is useful for numerically estimating the data width required by a fixed point processor implementation of a custom algorithm.
Most part of this DSP Library is documented in Information Technology Group's website .

Dolby AC3 Decoder

I have built a complete AC3 decoder.
The main source of information for implementing this decoder was the AC3 Standard, document A/52, released by ATSC (Advanced Television Systems Committee).

This decoder is built with ANSI C. It has a modular construction. Object-like entities, comprising data and methods, are emulated with ANSI C structures.
Eror handling is fully implemented. When relatively important events happen during decoding (such as CRC error, or improper stream formatting), the decoder sends messages through a dedicated interface, to inform the user about that.
Another dedicated interface was designed to allow the user to send commands to the decoder in real time. This way, the user can control miscellaneous decoder parameters; for example, the dynamic range of the audio signal output by the decoder, or the downmix procedure when changing the number of speakers.

Various modules perform the tasks needed for decoding, such as:



MPEG1 Layers 1, 2 Audio Decoder

I have written part of an MPEG1 Layers 1, 2 audio decoder - the synthesis filterbank module (ANSI C). The filterbank takes the decoded data from the stream decoder module, extensively crunches this data, and then outputs PCM samples.
The ISO document that defines the MPEG1 standard only shows a raw and slow synthesis method. More over, it doesn't say much about `why' things go that way. The numerical optimizations involved in a `real-life' MPEG1 synthesis filterbank are non-trivial. I had to gather quite much information before jumping into coding.
The defining ISO document seems to be written in the Nostradamus way - cryptic and unnecessary complicated, while still providing all the information.

I put here some of the things I've learned while working at this project. The documentation itself was generated using Doxygen.