| 158 | }; |
| 159 | |
| 160 | static void runAccuracyTest(Mode mode, const char *modeName, |
| 161 | int samples, int bands, float fmin, float fmax, |
| 162 | int sampleRate, const float *testFreqs, int nFreqs, |
| 163 | fl::vector<AccuracyResult> &results) { |
| 164 | Args args(samples, bands, fmin, fmax, sampleRate, mode); |
| 165 | Impl fft(args); |
| 166 | Bins out(bands); |
| 167 | fl::vector<fl::i16> signal; |
| 168 | |
| 169 | for (int f = 0; f < nFreqs; f++) { |
| 170 | generateSine(signal, samples, sampleRate, testFreqs[f]); |
| 171 | fft.run(signal, &out); |
| 172 | |
| 173 | int expected = out.freqToBin(testFreqs[f]); |
| 174 | int actual = peakBin(out.raw()); |
| 175 | float leak = leakageRatio(out.raw(), actual); |
| 176 | |
| 177 | AccuracyResult r; |
| 178 | r.modeName = modeName; |
| 179 | r.testFreq = testFreqs[f]; |
| 180 | r.expectedBinFreq = out.binToFreq(expected); |
| 181 | r.actualBinFreq = out.binToFreq(actual); |
| 182 | r.expectedBin = expected; |
| 183 | r.actualBin = actual; |
| 184 | r.binError = (actual > expected) ? (actual - expected) |
| 185 | : (expected - actual); |
| 186 | r.leakage = leak; |
| 187 | results.push_back(r); |
| 188 | } |
| 189 | } |
| 190 | |
| 191 | struct ModeEntry { |
| 192 | Mode mode; |
no test coverage detected