Version: 0.3
Status: Alpha
License: BSD
Download: /files/project_builds/IIRsos96.zip
INTRODUCTION:
The standard fixed Point IIR filter on XMOS uses a 64 bit signed MAC and 32 bit internal states.
Today there exist DAC's that achieves > 130 dB DNR (Dynamic Noise Ratio), but a filter with 32 bit internal states will not achieve such SNR/DNR for many filter-coef's, instead the filter will often suffer from limit cycles
(A caotic behavior, where oscillating cycles will be superinposed to the filtered data)
An example :
fs=96 kHz
2:nd order butterworth HP filter @ 65 Hz that serves as the first SOS link in a 4:th order L-R filter, used as a crossover between the front and the subwoofer.
Inserting a linear chirp to the standard filter implementation will result in a limit cycle at the output with an amplitude near 4096, e.g. 2* 2^12 = 13 bits of limit cycles, thus reducing the DNR with 13 bits.
If the input signal is 24 bits, you would only have 11 bits DNR left at the output!
METHOD:
This asm implementation uses a 96 bit 2-complement MAC and 64 bits are then stored in the internal filterstates.
RESULT:
The output of this implemetation (for the same example as above) shows an error (compared to a reference calculation done with long double float) of +-0.5 e.g. only quantization noise.
DISCUSSION:
Compared to using double floats, this filter runs much much faster!
The reference asm code is for readabillity and understanding, it works but it's slower.
Images:
"High-End Audio" IIR filters
-
- XCore Expert
- Posts: 956
- Joined: Fri Dec 11, 2009 3:53 am
- Location: Sweden, Eskilstuna
"High-End Audio" IIR filters
Probably not the most confused programmer anymore on the XCORE forum.
-
- XCore Expert
- Posts: 956
- Joined: Fri Dec 11, 2009 3:53 am
- Location: Sweden, Eskilstuna
Starting timer
Stopping timer
Total time is 2774 us
Filter runs at 1476kHz
IN, OUT
0, 0
575243, 573515
2300970, 2290608
5177175, 5144382
9203827, 9127937
...
Stopping timer
Total time is 2774 us
Filter runs at 1476kHz
IN, OUT
0, 0
575243, 573515
2300970, 2290608
5177175, 5144382
9203827, 9127937
...
Probably not the most confused programmer anymore on the XCORE forum.
-
- XCore Expert
- Posts: 956
- Joined: Fri Dec 11, 2009 3:53 am
- Location: Sweden, Eskilstuna
Filling the channel buffer with samples increases the speed to
1856kHz
1856kHz
Probably not the most confused programmer anymore on the XCORE forum.
-
- XCore Expert
- Posts: 956
- Joined: Fri Dec 11, 2009 3:53 am
- Location: Sweden, Eskilstuna
Starting timer
Stopping timer
Total time is 437 us
Filter runs at 2339kHz
IN, OUT
0, 0
2300970, 2294059
...
Stopping timer
Total time is 437 us
Filter runs at 2339kHz
IN, OUT
0, 0
2300970, 2294059
...
Probably not the most confused programmer anymore on the XCORE forum.