Wiki » History » Version 20

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