Wiki » History » Version 17

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