Mercurial > hg > qm-dsp
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 |