Wiki » History » Version 21

Chris Cannam, 2013-10-22 04:38 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 15 Chris Cannam
Input is 11520000 frames (two minutes at 96kHz sample rate). Listed kfps values correspond to 1000s of input frames.
24 3 Chris Cannam
25 16 Chris Cannam
CPU is a Core 2 Quad Q9550 at 2.83GHz. 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 distro 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 13 Chris Cannam
29 13 Chris Cannam
All implementations use libsndfile for audio file I/O, so that should not be a factor in overall speed.
30 14 Chris Cannam
31 4 Chris Cannam
h3. Implementations by decimation factor
32 1 Chris Cannam
33 14 Chris Cannam
For 11520000 input frames.
34 1 Chris Cannam
35 14 Chris Cannam
h4. Factor 02
36 1 Chris Cannam
37 14 Chris Cannam
|Kfps|Clock time|Implementation|
38 14 Chris Cannam
|      61604|0.187|zoh|
39 14 Chris Cannam
|      52602|0.219|decimate_b|
40 14 Chris Cannam
|      52363|0.220|decimate|
41 14 Chris Cannam
|      17668|0.652|resample_lq|
42 14 Chris Cannam
|       9365|1.230|resample_mq|
43 14 Chris Cannam
|       4768|2.416|resample_hq|
44 14 Chris Cannam
|       2176|5.294|src|
45 1 Chris Cannam
46 1 Chris Cannam
47 14 Chris Cannam
h4. Factor 04
48 1 Chris Cannam
49 14 Chris Cannam
|Kfps|Clock time|Implementation|
50 14 Chris Cannam
|      93658|0.123|zoh|
51 14 Chris Cannam
|      58181|0.198|decimate|
52 14 Chris Cannam
|      47213|0.244|decimate_b|
53 14 Chris Cannam
|      19896|0.579|resample_lq|
54 14 Chris Cannam
|       9982|1.154|resample_mq|
55 14 Chris Cannam
|       4965|2.320|resample_hq|
56 14 Chris Cannam
|       2292|5.026|src|
57 1 Chris Cannam
58 14 Chris Cannam
59 14 Chris Cannam
h4. Factor 08
60 14 Chris Cannam
61 14 Chris Cannam
|Kfps|Clock time|Implementation|
62 14 Chris Cannam
|     128000|0.090|zoh|
63 14 Chris Cannam
|      60952|0.189|decimate|
64 14 Chris Cannam
|      44651|0.258|decimate_b|
65 14 Chris Cannam
|      21215|0.543|resample_lq|
66 14 Chris Cannam
|      10331|1.115|resample_mq|
67 14 Chris Cannam
|       3480|3.310|resample_hq|
68 14 Chris Cannam
|       2361|4.879|src|
69 14 Chris Cannam
70 14 Chris Cannam
71 1 Chris Cannam
h4. Factor 16
72 1 Chris Cannam
73 14 Chris Cannam
|Kfps|Clock time|Implementation|
74 14 Chris Cannam
|     160000|0.072|zoh|
75 14 Chris Cannam
|      46080|0.250|decimate|
76 14 Chris Cannam
|      43636|0.264|decimate_b|
77 14 Chris Cannam
|      22068|0.522|resample_lq|
78 14 Chris Cannam
|       7700|1.496|resample_mq|
79 14 Chris Cannam
|       3529|3.264|resample_hq|
80 14 Chris Cannam
|       2119|5.435|src|
81 1 Chris Cannam
82 14 Chris Cannam
83 1 Chris Cannam
h4. Factor 32
84 1 Chris Cannam
85 14 Chris Cannam
|Kfps|Clock time|Implementation|
86 14 Chris Cannam
|     182857|0.063|zoh|
87 14 Chris Cannam
|      53333|0.216|decimate|
88 14 Chris Cannam
|      42825|0.269|decimate_b|
89 14 Chris Cannam
|      21021|0.548|resample_lq|
90 14 Chris Cannam
|       7379|1.561|resample_mq|
91 14 Chris Cannam
|       3443|3.345|resample_hq|
92 14 Chris Cannam
|       2179|5.286|src|
93 4 Chris Cannam
94 14 Chris Cannam
95 4 Chris Cannam
h4. Factor 64
96 4 Chris Cannam
97 14 Chris Cannam
|Kfps|Clock time|Implementation|
98 14 Chris Cannam
|     188852|0.061|zoh|
99 14 Chris Cannam
|      53581|0.215|decimate|
100 14 Chris Cannam
|      42666|0.270|decimate_b|
101 14 Chris Cannam
|      16202|0.711|resample_lq|
102 14 Chris Cannam
|       7417|1.553|resample_mq|
103 14 Chris Cannam
|       3489|3.301|resample_hq|
104 14 Chris Cannam
|       2423|4.753|src|
105 12 Chris Cannam
106 14 Chris Cannam
107 12 Chris Cannam
h3. Decimation factors by implementation
108 12 Chris Cannam
109 14 Chris Cannam
For 11520000 input frames.
110 14 Chris Cannam
111 4 Chris Cannam
h4. Implementation zoh
112 4 Chris Cannam
113 14 Chris Cannam
|Kfps|Clock time|Factor|
114 14 Chris Cannam
|     188852|0.061|64|
115 14 Chris Cannam
|     182857|0.063|32|
116 14 Chris Cannam
|     160000|0.072|16|
117 14 Chris Cannam
|     128000|0.090|08|
118 14 Chris Cannam
|      93658|0.123|04|
119 14 Chris Cannam
|      61604|0.187|02|
120 4 Chris Cannam
121 14 Chris Cannam
122 4 Chris Cannam
h4. Implementation decimate
123 4 Chris Cannam
124 14 Chris Cannam
|Kfps|Clock time|Factor|
125 14 Chris Cannam
|      60952|0.189|08|
126 14 Chris Cannam
|      58181|0.198|04|
127 14 Chris Cannam
|      53581|0.215|64|
128 14 Chris Cannam
|      53333|0.216|32|
129 14 Chris Cannam
|      52363|0.220|02|
130 14 Chris Cannam
|      46080|0.250|16|
131 4 Chris Cannam
132 14 Chris Cannam
133 4 Chris Cannam
h4. Implementation decimate_b
134 4 Chris Cannam
135 14 Chris Cannam
|Kfps|Clock time|Factor|
136 14 Chris Cannam
|      52602|0.219|02|
137 14 Chris Cannam
|      47213|0.244|04|
138 14 Chris Cannam
|      44651|0.258|08|
139 14 Chris Cannam
|      43636|0.264|16|
140 14 Chris Cannam
|      42825|0.269|32|
141 14 Chris Cannam
|      42666|0.270|64|
142 4 Chris Cannam
143 14 Chris Cannam
144 4 Chris Cannam
h4. Implementation resample_hq
145 4 Chris Cannam
146 14 Chris Cannam
|Kfps|Clock time|Factor|
147 14 Chris Cannam
|       4965|2.320|04|
148 14 Chris Cannam
|       4768|2.416|02|
149 14 Chris Cannam
|       3529|3.264|16|
150 14 Chris Cannam
|       3489|3.301|64|
151 14 Chris Cannam
|       3480|3.310|08|
152 14 Chris Cannam
|       3443|3.345|32|
153 11 Chris Cannam
154 14 Chris Cannam
155 11 Chris Cannam
h4. Implementation resample_mq
156 11 Chris Cannam
157 14 Chris Cannam
|Kfps|Clock time|Factor|
158 14 Chris Cannam
|      10331|1.115|08|
159 14 Chris Cannam
|       9982|1.154|04|
160 14 Chris Cannam
|       9365|1.230|02|
161 14 Chris Cannam
|       7700|1.496|16|
162 14 Chris Cannam
|       7417|1.553|64|
163 14 Chris Cannam
|       7379|1.561|32|
164 1 Chris Cannam
165 14 Chris Cannam
166 1 Chris Cannam
h4. Implementation resample_lq
167 1 Chris Cannam
168 14 Chris Cannam
|Kfps|Clock time|Factor|
169 14 Chris Cannam
|      22068|0.522|16|
170 14 Chris Cannam
|      21215|0.543|08|
171 14 Chris Cannam
|      21021|0.548|32|
172 14 Chris Cannam
|      19896|0.579|04|
173 14 Chris Cannam
|      17668|0.652|02|
174 14 Chris Cannam
|      16202|0.711|64|
175 1 Chris Cannam
176 14 Chris Cannam
177 1 Chris Cannam
h4. Implementation src
178 1 Chris Cannam
179 14 Chris Cannam
|Kfps|Clock time|Factor|
180 14 Chris Cannam
|       2423|4.753|64|
181 14 Chris Cannam
|       2361|4.879|08|
182 14 Chris Cannam
|       2292|5.026|04|
183 14 Chris Cannam
|       2179|5.286|32|
184 14 Chris Cannam
|       2176|5.294|02|
185 14 Chris Cannam
|       2119|5.435|16|
186 14 Chris Cannam
187 14 Chris Cannam
188 14 Chris Cannam
189 14 Chris Cannam
190 1 Chris Cannam
191 1 Chris Cannam
h3. Resampler filter lengths
192 1 Chris Cannam
193 1 Chris Cannam
Filter lengths the qm-dsp Resamplers decided to use:
194 1 Chris Cannam
195 1 Chris Cannam
|Factor|Length (hq)|Length (mq)|Length (lq)|
196 1 Chris Cannam
|2|643|291|119|
197 1 Chris Cannam
|4|1285|579|237|
198 1 Chris Cannam
|8|2567|1155|471|
199 1 Chris Cannam
|16|5131|2307|939|
200 1 Chris Cannam
|32|10261|4613|1877|
201 1 Chris Cannam
|64|20519|9223|3751|
202 21 Chris Cannam
203 21 Chris Cannam
h2. Quality
204 21 Chris Cannam
205 21 Chris Cannam
See plots attached below: