I have a suit of 240 unit tests of FIR filters convolutions with different number of taps.
Intended usage:
It's for writing an audio filter in Unity, the initial, naive convolution was done in managed code but was too slow for real-time audio processing.
The unit tests do test the exactness of different vectorized FIR convolution algorithms, one be picked up and implemented using Unity Burst, translating it to SIMD-aware native code.
To be able to decide on which convolution algorithm performs better, I wrote few:
- naive convolution
- used as a reference for comparison
- vectorized convolution
- inner, outer, inner and outer loop
- half-band versions of the above
- 1 tap in 2 iterating all the taps
- 1 tap in 2 iterating half the taps (leveraging filter symmetry)
Actual situation:
All tests are passing and as I'm polishing, I noticed the delta for comparing was 1E-04f
.
I lowered it down to 1E-05f
, that worked, tried 1E-06f
but then pass rate is < 50% then.
Below are the results of an input signal 0, 1, 2, 3 ... 28, 29, 30, 31
.
Example for 1E-05f:
index expected actual difference match
0 -2.7051452E-34 -2.7051452E-34 0.000000E+000 True
1 0.00011297482 0.00011297482 0.000000E+000 True
2 0.00022594964 0.00022594964 0.000000E+000 True
3 -0.0010179491 -0.0010179491 0.000000E+000 True
4 -0.0022618477 -0.0022618477 0.000000E+000 True
5 0.0019123415 0.0019123415 0.000000E+000 True
6 0.00608653 0.00608653 0.000000E+000 True
7 -0.0052014478 -0.0052014478 0.000000E+000 True
8 -0.016489426 -0.016489424 1.862645E-009 True
9 0.009599558 0.009599558 0.000000E+000 True
10 0.035688534 0.035688538 3.725290E-009 True
11 -0.026160091 -0.026160091 0.000000E+000 True
12 -0.08800873 -0.08800873 0.000000E+000 True
13 0.16196862 0.16196862 0.000000E+000 True
14 0.91199124 0.9119913 5.960464E-008 True
15 1.97384 1.97384 0.000000E+000 True
16 3.0356889 3.0356886 2.384186E-007 True
17 4.0095997 4.0095997 0.000000E+000 True
18 4.9835114 4.983511 4.768372E-007 True
19 5.9947987 5.994799 4.768372E-007 True
20 7.006087 7.0060863 4.768372E-007 True
21 8.001913 8.001913 0.000000E+000 True
22 8.997738 8.997738 0.000000E+000 True
23 9.998984 9.998981 2.861023E-006 True
24 11.000226 11.000226 0.000000E+000 True
25 12.0001135 12.0001135 0.000000E+000 True
26 13 13 0.000000E+000 True
27 13.999999 14 9.536743E-007 True
28 15.000001 15.000001 0.000000E+000 True
29 15.999998 16 1.907349E-006 True
30 17 17.000002 1.907349E-006 True
31 18.000002 18 1.907349E-006 True
Example for 1E-06f:
index expected actual difference match
0 -2.7051452E-34 -2.7051452E-34 0.000000E+000 True
1 0.00011297482 0.00011297482 0.000000E+000 True
2 0.00022594964 0.00022594964 0.000000E+000 True
3 -0.0010179491 -0.0010179491 0.000000E+000 True
4 -0.0022618477 -0.0022618477 0.000000E+000 True
5 0.0019123415 0.0019123415 0.000000E+000 True
6 0.00608653 0.00608653 0.000000E+000 True
7 -0.0052014478 -0.0052014478 0.000000E+000 True
8 -0.016489426 -0.016489424 1.862645E-009 True
9 0.009599558 0.009599558 0.000000E+000 True
10 0.035688534 0.035688538 3.725290E-009 True
11 -0.026160091 -0.026160091 0.000000E+000 True
12 -0.08800873 -0.08800873 0.000000E+000 True
13 0.16196862 0.16196862 0.000000E+000 True
14 0.91199124 0.9119913 5.960464E-008 True
15 1.97384 1.97384 0.000000E+000 True
16 3.0356889 3.0356886 2.384186E-007 True
17 4.0095997 4.0095997 0.000000E+000 True
18 4.9835114 4.983511 4.768372E-007 True
19 5.9947987 5.994799 4.768372E-007 True
20 7.006087 7.0060863 4.768372E-007 True
21 8.001913 8.001913 0.000000E+000 True
22 8.997738 8.997738 0.000000E+000 True
23 9.998984 9.998981 2.861023E-006 False
24 11.000226 11.000226 0.000000E+000 True
25 12.0001135 12.0001135 0.000000E+000 True
26 13 13 0.000000E+000 True
27 13.999999 14 9.536743E-007 True
28 15.000001 15.000001 0.000000E+000 True
29 15.999998 16 1.907349E-006 False
30 17 17.000002 1.907349E-006 False
31 18.000002 18 1.907349E-006 False
This is how I perform the comparison:
const float delta = 1E-05f;
var expectedValue = expected[i];
var actualValue = actual[i];
var difference = Math.Abs(expectedValue - actualValue);
var failed = difference > delta;
According to the documentation, the precision is about 6 to 9 digits.
Question:
Is the lowest delta I can compare to is indeed 1E-05f
or is 1E-06f
possible?