comparison dsp/rateconversion/TestResampler.cpp @ 373:395771a6db7f

Avoid int overflow in resample; tidy
author Chris Cannam <c.cannam@qmul.ac.uk>
date Fri, 18 Oct 2013 11:11:41 +0100
parents d464286c007b
children
comparison
equal deleted inserted replaced
372:d464286c007b 373:395771a6db7f
33 in, n); 33 in, n);
34 if (skip == 0) { 34 if (skip == 0) {
35 BOOST_CHECK_EQUAL(resampled.size(), m); 35 BOOST_CHECK_EQUAL(resampled.size(), m);
36 } 36 }
37 for (int i = 0; i < m; ++i) { 37 for (int i = 0; i < m; ++i) {
38 BOOST_CHECK_SMALL(resampled[i + skip] - expected[i], 1e-8); 38 BOOST_CHECK_SMALL(resampled[i + skip] - expected[i], 1e-6);
39 } 39 }
40 } 40 }
41 41
42 void 42 void
43 testResampler(int sourceRate, 43 testResampler(int sourceRate,
91 } 91 }
92 92
93 delete[] outPadded; 93 delete[] outPadded;
94 delete[] inPadded; 94 delete[] inPadded;
95 } 95 }
96 /* 96
97 BOOST_AUTO_TEST_CASE(sameRateOneShot) 97 BOOST_AUTO_TEST_CASE(sameRateOneShot)
98 { 98 {
99 double d[] = { 0, 0.1, -0.3, -0.4, -0.3, 0, 0.5, 0.2, 0.8, -0.1 }; 99 double d[] = { 0, 0.1, -0.3, -0.4, -0.3, 0, 0.5, 0.2, 0.8, -0.1 };
100 testResamplerOneShot(4, 4, 10, d, 10, d, 0); 100 testResamplerOneShot(4, 4, 10, d, 10, d, 0);
101 } 101 }
147 for (int i = 0; i < 1000; ++i) { 147 for (int i = 0; i < 1000; ++i) {
148 out[i] = sin(i * M_PI / 4.0); 148 out[i] = sin(i * M_PI / 4.0);
149 } 149 }
150 testResamplerOneShot(16, 8, 2000, in, 200, out, 256); 150 testResamplerOneShot(16, 8, 2000, in, 200, out, 256);
151 } 151 }
152 */ 152
153 vector<double> 153 vector<double>
154 squareWave(int rate, double freq, int n) 154 squareWave(int rate, double freq, int n)
155 { 155 {
156 //!!! todo: hoist, test 156 //!!! todo: hoist, test
157 vector<double> v(n, 0.0); 157 vector<double> v(n, 0.0);
170 testSpectrum(int inrate, int outrate) 170 testSpectrum(int inrate, int outrate)
171 { 171 {
172 // One second of a square wave 172 // One second of a square wave
173 int freq = 500; 173 int freq = 500;
174 174
175 std::cerr << "inrate = " << inrate << ", outrate = " << outrate << ", freq * outrate / inrate = " << (double(freq) * double(outrate)) / double(inrate) << std::endl;
176
177 std::cerr << "making square wave... ";
178 vector<double> square = 175 vector<double> square =
179 squareWave(inrate, freq, inrate); 176 squareWave(inrate, freq, inrate);
180 std::cerr << "done" << std::endl;
181 177
182 vector<double> maybeSquare = 178 vector<double> maybeSquare =
183 Resampler::resample(inrate, outrate, square.data(), square.size()); 179 Resampler::resample(inrate, outrate, square.data(), square.size());
184 180
185 BOOST_CHECK_EQUAL(maybeSquare.size(), outrate); 181 BOOST_CHECK_EQUAL(maybeSquare.size(), outrate);
189 185
190 // forward magnitude with size inrate, outrate 186 // forward magnitude with size inrate, outrate
191 187
192 vector<double> inSpectrum(inrate, 0.0); 188 vector<double> inSpectrum(inrate, 0.0);
193 FFTReal(inrate).forwardMagnitude(square.data(), inSpectrum.data()); 189 FFTReal(inrate).forwardMagnitude(square.data(), inSpectrum.data());
194 for (int i = 0; i < inSpectrum.size(); ++i) { 190 for (int i = 0; i < (int)inSpectrum.size(); ++i) {
195 inSpectrum[i] /= inrate; 191 inSpectrum[i] /= inrate;
196 } 192 }
197 193
198 vector<double> outSpectrum(outrate, 0.0); 194 vector<double> outSpectrum(outrate, 0.0);
199 FFTReal(outrate).forwardMagnitude(maybeSquare.data(), outSpectrum.data()); 195 FFTReal(outrate).forwardMagnitude(maybeSquare.data(), outSpectrum.data());
200 for (int i = 0; i < outSpectrum.size(); ++i) { 196 for (int i = 0; i < (int)outSpectrum.size(); ++i) {
201 outSpectrum[i] /= outrate; 197 outSpectrum[i] /= outrate;
202 } 198 }
203 199
204 // Don't compare bins any higher than 99% of Nyquist freq of lower sr 200 // Don't compare bins any higher than 99% of Nyquist freq of lower sr
205 int lengthOfInterest = (inrate < outrate ? inrate : outrate) / 2; 201 int lengthOfInterest = (inrate < outrate ? inrate : outrate) / 2;
211 } 207 }
212 208
213 BOOST_AUTO_TEST_CASE(spectrum) 209 BOOST_AUTO_TEST_CASE(spectrum)
214 { 210 {
215 int rates[] = { 8000, 22050, 44100, 48000 }; 211 int rates[] = { 8000, 22050, 44100, 48000 };
216 for (int i = 0; i < sizeof(rates)/sizeof(rates[0]); ++i) { 212 for (int i = 0; i < (int)(sizeof(rates)/sizeof(rates[0])); ++i) {
217 for (int j = 0; j < sizeof(rates)/sizeof(rates[0]); ++j) { 213 for (int j = 0; j < (int)(sizeof(rates)/sizeof(rates[0])); ++j) {
218 testSpectrum(rates[i], rates[j]); 214 testSpectrum(rates[i], rates[j]);
219 } 215 }
220 } 216 }
221 } 217 }
222 218