Wiki » History » Version 14

Chris Cannam, 2013-10-22 02:34 PM

1 1 Chris Cannam
h1. Summary of results
2 6 Chris Cannam
3 6 Chris Cannam
{{>toc}}
4 1 Chris Cannam
5 9 Chris Cannam
h2. What we're looking at
6 9 Chris Cannam
7 9 Chris Cannam
Here we're only looking at causal methods, so no forward/backward filtering. The question in my head is really whether faster IIR filters are still so much faster as to be worth using in preference to linear-phase methods with better (?) theoretical quality. Of course that would always depend on the application, but it's interesting to compare. 
8 9 Chris Cannam
9 1 Chris Cannam
We compared
10 1 Chris Cannam
11 12 Chris Cannam
 * @decimate@: the "Decimator":http://code.soundsoftware.ac.uk/projects/qm-dsp/embedded/classDecimator.html implementation in the "qm-dsp":/projects/qm-dsp library, which uses an IIR lowpass filter (perhaps an elliptical filter?) with 8 coefficient pairs;
12 1 Chris Cannam
13 12 Chris Cannam
 * @decimate_b@: the "DecimatorB":http://code.soundsoftware.ac.uk/projects/qm-dsp/embedded/classDecimatorB.html class in the "qm-dsp":/projects/qm-dsp library, which uses a Butterworth IIR lowpass filter of order 6;
14 12 Chris Cannam
15 2 Chris Cannam
 * @resample_hq@, @resample_mq@, @resample_lq@: the "Resampler":http://code.soundsoftware.ac.uk/projects/qm-dsp/embedded/classResampler.html implementation in the "qm-dsp":/projects/qm-dsp library, which uses a lengthy Kaiser-windowed sinc filter, at three different quality settings;
16 1 Chris Cannam
   
17 1 Chris Cannam
 * @src@: the sndfile-resample program which uses "libsamplerate":http://mega-nerd.com/SRC/, a well trusted resampler also using a Kaiser-windowed sinc implementation, at its default quality setting;
18 1 Chris Cannam
19 1 Chris Cannam
 * @zoh@: the sndfile-resample zero-order hold resampler, which just takes every Nth sample without any filtering, serving as a baseline.
20 3 Chris Cannam
21 3 Chris Cannam
h2. Speed
22 3 Chris Cannam
23 4 Chris Cannam
For 5292000 input frames on a Core i3-3229Y low-voltage CPU. (Frames-per-second values are for input frames.)
24 3 Chris Cannam
25 8 Chris Cannam
All code is 64-bit. The qm-dsp implementations (resample_* and decimate) were compiled with -O3 -ffast-math while the libsamplerate implementations (src and zoh) were standard Ubuntu packages, so probably -O2. This is likely to make a very significant difference, so these results are more useful for comparison among the qm-dsp implementations than between qm-dsp and libsamplerate.
26 1 Chris Cannam
27 5 Chris Cannam
The decimate implementation supports factors up to 8 only, so 16x, 32x and 64x are handled in two passes.
28 5 Chris Cannam
29 4 Chris Cannam
All implementations use libsndfile for audio file I/O, so that should not be a factor in overall speed.
30 4 Chris Cannam
31 13 Chris Cannam
These frames-per-second figures look terribly precise, but I imagine there's a good 10% margin of error (run to run or whatever).
32 13 Chris Cannam
33 14 Chris Cannam
34 4 Chris Cannam
h3. Implementations by decimation factor
35 1 Chris Cannam
36 14 Chris Cannam
For 11520000 input frames.
37 1 Chris Cannam
38 14 Chris Cannam
h4. Factor 02
39 1 Chris Cannam
40 14 Chris Cannam
|Kfps|Clock time|Implementation|
41 14 Chris Cannam
|      61604|0.187|zoh|
42 14 Chris Cannam
|      52602|0.219|decimate_b|
43 14 Chris Cannam
|      52363|0.220|decimate|
44 14 Chris Cannam
|      17668|0.652|resample_lq|
45 14 Chris Cannam
|       9365|1.230|resample_mq|
46 14 Chris Cannam
|       4768|2.416|resample_hq|
47 14 Chris Cannam
|       2176|5.294|src|
48 1 Chris Cannam
49 1 Chris Cannam
50 14 Chris Cannam
h4. Factor 04
51 1 Chris Cannam
52 14 Chris Cannam
|Kfps|Clock time|Implementation|
53 14 Chris Cannam
|      93658|0.123|zoh|
54 14 Chris Cannam
|      58181|0.198|decimate|
55 14 Chris Cannam
|      47213|0.244|decimate_b|
56 14 Chris Cannam
|      19896|0.579|resample_lq|
57 14 Chris Cannam
|       9982|1.154|resample_mq|
58 14 Chris Cannam
|       4965|2.320|resample_hq|
59 14 Chris Cannam
|       2292|5.026|src|
60 1 Chris Cannam
61 14 Chris Cannam
62 14 Chris Cannam
h4. Factor 08
63 14 Chris Cannam
64 14 Chris Cannam
|Kfps|Clock time|Implementation|
65 14 Chris Cannam
|     128000|0.090|zoh|
66 14 Chris Cannam
|      60952|0.189|decimate|
67 14 Chris Cannam
|      44651|0.258|decimate_b|
68 14 Chris Cannam
|      21215|0.543|resample_lq|
69 14 Chris Cannam
|      10331|1.115|resample_mq|
70 14 Chris Cannam
|       3480|3.310|resample_hq|
71 14 Chris Cannam
|       2361|4.879|src|
72 14 Chris Cannam
73 14 Chris Cannam
74 1 Chris Cannam
h4. Factor 16
75 1 Chris Cannam
76 14 Chris Cannam
|Kfps|Clock time|Implementation|
77 14 Chris Cannam
|     160000|0.072|zoh|
78 14 Chris Cannam
|      46080|0.250|decimate|
79 14 Chris Cannam
|      43636|0.264|decimate_b|
80 14 Chris Cannam
|      22068|0.522|resample_lq|
81 14 Chris Cannam
|       7700|1.496|resample_mq|
82 14 Chris Cannam
|       3529|3.264|resample_hq|
83 14 Chris Cannam
|       2119|5.435|src|
84 1 Chris Cannam
85 14 Chris Cannam
86 1 Chris Cannam
h4. Factor 32
87 1 Chris Cannam
88 14 Chris Cannam
|Kfps|Clock time|Implementation|
89 14 Chris Cannam
|     182857|0.063|zoh|
90 14 Chris Cannam
|      53333|0.216|decimate|
91 14 Chris Cannam
|      42825|0.269|decimate_b|
92 14 Chris Cannam
|      21021|0.548|resample_lq|
93 14 Chris Cannam
|       7379|1.561|resample_mq|
94 14 Chris Cannam
|       3443|3.345|resample_hq|
95 14 Chris Cannam
|       2179|5.286|src|
96 4 Chris Cannam
97 14 Chris Cannam
98 4 Chris Cannam
h4. Factor 64
99 4 Chris Cannam
100 14 Chris Cannam
|Kfps|Clock time|Implementation|
101 14 Chris Cannam
|     188852|0.061|zoh|
102 14 Chris Cannam
|      53581|0.215|decimate|
103 14 Chris Cannam
|      42666|0.270|decimate_b|
104 14 Chris Cannam
|      16202|0.711|resample_lq|
105 14 Chris Cannam
|       7417|1.553|resample_mq|
106 14 Chris Cannam
|       3489|3.301|resample_hq|
107 14 Chris Cannam
|       2423|4.753|src|
108 12 Chris Cannam
109 14 Chris Cannam
110 12 Chris Cannam
h3. Decimation factors by implementation
111 12 Chris Cannam
112 14 Chris Cannam
For 11520000 input frames.
113 14 Chris Cannam
114 4 Chris Cannam
h4. Implementation zoh
115 4 Chris Cannam
116 14 Chris Cannam
|Kfps|Clock time|Factor|
117 14 Chris Cannam
|     188852|0.061|64|
118 14 Chris Cannam
|     182857|0.063|32|
119 14 Chris Cannam
|     160000|0.072|16|
120 14 Chris Cannam
|     128000|0.090|08|
121 14 Chris Cannam
|      93658|0.123|04|
122 14 Chris Cannam
|      61604|0.187|02|
123 4 Chris Cannam
124 14 Chris Cannam
125 4 Chris Cannam
h4. Implementation decimate
126 4 Chris Cannam
127 14 Chris Cannam
|Kfps|Clock time|Factor|
128 14 Chris Cannam
|      60952|0.189|08|
129 14 Chris Cannam
|      58181|0.198|04|
130 14 Chris Cannam
|      53581|0.215|64|
131 14 Chris Cannam
|      53333|0.216|32|
132 14 Chris Cannam
|      52363|0.220|02|
133 14 Chris Cannam
|      46080|0.250|16|
134 4 Chris Cannam
135 14 Chris Cannam
136 4 Chris Cannam
h4. Implementation decimate_b
137 4 Chris Cannam
138 14 Chris Cannam
|Kfps|Clock time|Factor|
139 14 Chris Cannam
|      52602|0.219|02|
140 14 Chris Cannam
|      47213|0.244|04|
141 14 Chris Cannam
|      44651|0.258|08|
142 14 Chris Cannam
|      43636|0.264|16|
143 14 Chris Cannam
|      42825|0.269|32|
144 14 Chris Cannam
|      42666|0.270|64|
145 4 Chris Cannam
146 14 Chris Cannam
147 4 Chris Cannam
h4. Implementation resample_hq
148 4 Chris Cannam
149 14 Chris Cannam
|Kfps|Clock time|Factor|
150 14 Chris Cannam
|       4965|2.320|04|
151 14 Chris Cannam
|       4768|2.416|02|
152 14 Chris Cannam
|       3529|3.264|16|
153 14 Chris Cannam
|       3489|3.301|64|
154 14 Chris Cannam
|       3480|3.310|08|
155 14 Chris Cannam
|       3443|3.345|32|
156 11 Chris Cannam
157 14 Chris Cannam
158 11 Chris Cannam
h4. Implementation resample_mq
159 11 Chris Cannam
160 14 Chris Cannam
|Kfps|Clock time|Factor|
161 14 Chris Cannam
|      10331|1.115|08|
162 14 Chris Cannam
|       9982|1.154|04|
163 14 Chris Cannam
|       9365|1.230|02|
164 14 Chris Cannam
|       7700|1.496|16|
165 14 Chris Cannam
|       7417|1.553|64|
166 14 Chris Cannam
|       7379|1.561|32|
167 1 Chris Cannam
168 14 Chris Cannam
169 1 Chris Cannam
h4. Implementation resample_lq
170 1 Chris Cannam
171 14 Chris Cannam
|Kfps|Clock time|Factor|
172 14 Chris Cannam
|      22068|0.522|16|
173 14 Chris Cannam
|      21215|0.543|08|
174 14 Chris Cannam
|      21021|0.548|32|
175 14 Chris Cannam
|      19896|0.579|04|
176 14 Chris Cannam
|      17668|0.652|02|
177 14 Chris Cannam
|      16202|0.711|64|
178 1 Chris Cannam
179 14 Chris Cannam
180 1 Chris Cannam
h4. Implementation src
181 1 Chris Cannam
182 14 Chris Cannam
|Kfps|Clock time|Factor|
183 14 Chris Cannam
|       2423|4.753|64|
184 14 Chris Cannam
|       2361|4.879|08|
185 14 Chris Cannam
|       2292|5.026|04|
186 14 Chris Cannam
|       2179|5.286|32|
187 14 Chris Cannam
|       2176|5.294|02|
188 14 Chris Cannam
|       2119|5.435|16|
189 14 Chris Cannam
190 14 Chris Cannam
191 14 Chris Cannam
192 14 Chris Cannam
193 1 Chris Cannam
194 1 Chris Cannam
h3. Resampler filter lengths
195 1 Chris Cannam
196 1 Chris Cannam
Filter lengths the qm-dsp Resamplers decided to use:
197 1 Chris Cannam
198 1 Chris Cannam
|Factor|Length (hq)|Length (mq)|Length (lq)|
199 1 Chris Cannam
|2|643|291|119|
200 1 Chris Cannam
|4|1285|579|237|
201 1 Chris Cannam
|8|2567|1155|471|
202 1 Chris Cannam
|16|5131|2307|939|
203 1 Chris Cannam
|32|10261|4613|1877|
204 1 Chris Cannam
|64|20519|9223|3751|