#include #ifdef Q_OS_WIN #define _WIN32_IE 0x0600 #include #include #define CALLGRIND_START_INSTRUMENTATION #define CALLGRIND_STOP_INSTRUMENTATION #define CALLGRIND_ZERO_STATS #else #include #endif #include #include #include #include "Timer.h" template static inline double veccomp(const QVector &a, const QVector &b, const char *n) { long double rms = 0.0; long double gdiff = 0.0; if (a.size() != b.size()) { qFatal("%s: %d <=> %d", n, a.size(), b.size()); } for (int i=0;i gdiff) gdiff = diff; #ifdef EXACT if (a[i] != b[i]) { #else union { T tv; uint32_t uv; } v1, v2; v1.uv = v2.uv = 0; v1.tv = a[i]; v2.tv = b[i]; if (fabsf(a[i] - b[i]) > 1000) { qWarning("%08x %08x %08x", v1.uv, v2.uv, v1.uv ^ v2.uv); #endif qFatal("%s: Offset %d: %.10g <=> %.10g", n, i, static_cast(a[i]), static_cast(b[i])); } } return gdiff; return sqrt(rms / a.size()); } int main(int argc, char **argv) { CALLGRIND_STOP_INSTRUMENTATION; CALLGRIND_ZERO_STATS; QCoreApplication a(argc, argv); QFile f((argc >= 2) ? argv[1] : "wb_male.wav"); if (! f.open(QIODevice::ReadOnly)) { qFatal("Failed to open file!"); } f.seek(36 + 8); QFile o("output.agc"); if (! o.open(QIODevice::WriteOnly)) qFatal("Failed to open out file!"); QFile vf("verify.agc"); if (! vf.open(QIODevice::ReadOnly)) qWarning("No verify!"); QDataStream out(&o); QDataStream verify(&vf); static const int iFrameSize = 320; int iarg; SpeexPreprocessState *spp = speex_preprocess_state_init(iFrameSize, 16000); iarg = 0; speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_VAD, &iarg); speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_DENOISE, &iarg); speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_AGC, &iarg); speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_DEREVERB, &iarg); iarg = 1; speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_AGC, &iarg); iarg = 21747; speex_preprocess_ctl(spp, SPEEX_PREPROCESS_SET_AGC_TARGET, &iarg); QVector v; while (1) { QByteArray qba = f.read(iFrameSize * sizeof(short)); if (qba.size() != iFrameSize * sizeof(short)) break; v.append(qba); } int nframes = v.size(); qWarning("Ready to process %d frames of %d samples", nframes, iFrameSize); QVector qvIn; QVector sIn(nframes * iFrameSize); for (int i=0;i(v[i].constData()); short *s = sIn.data() + i * iFrameSize; for (int j=0;j vIn; verify >> vIn; veccomp(vIn, sIn, "AGC"); } } return 0; } #include "Timer.cpp"