I have built a C++ DSP Library, that comprises the following modules:
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:
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.