diff intercom/aec_test.cpp @ 2:13be24d74cd2

import intercom-0.4.1
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 09:57:52 +0200
parents
children 22a74b01a099
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/intercom/aec_test.cpp	Fri Jun 25 09:57:52 2010 +0200
@@ -0,0 +1,91 @@
+/* aec_test.cpp
+ *
+ * Copyright (C) DFS Deutsche Flugsicherung (2004). All Rights Reserved.
+ *
+ * Test stub for Acoustic Echo Cancellation NLMS-pw algorithm
+ * Author: Andre Adrian, DFS Deutsche Flugsicherung
+ * <Andre.Adrian@dfs.de>
+ *
+ * fortune says:
+ * It's never as good as it feels, and it's never as bad as it seems.
+ *
+ * compile
+c++ -DWIDEB=2 -O2 -o aec_test aec_test.cpp aec.cpp tcp.cpp -lm
+ *
+ * Version 1.3 set/get ambient in dB
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include "tcp.h"
+#include "aec.h"
+
+#define TAPS  	(40*WIDEB*8)
+
+typedef signed short MONO;
+
+typedef struct {
+  signed short l;
+  signed short r;
+} STEREO;
+
+float dB2q(float dB)
+{
+  /* Dezibel to Ratio */
+  return powf(10.0f, dB / 20.0f);
+}
+
+float q2dB(float q)
+{
+  /* Ratio to Dezibel */
+  return 20.0f * log10f(q);
+}
+
+
+/* Read a raw audio file (8KHz sample frequency, 16bit PCM, stereo)
+ * from stdin, echo cancel it and write it to stdout
+ */
+int main(int argc, char *argv[])
+{
+  STEREO inbuf[TAPS], outbuf[TAPS];
+  float visualize;
+
+  fprintf(stderr, "usage: aec_test [ambient in dB] <in.raw >out.raw\n");
+
+  AEC aec;
+
+  if (argc >= 2) {
+    aec.setambient(MAXPCM*dB2q(atof(argv[1])));    
+  }
+
+  int taps;
+  float ambient;
+  while (taps = fread(inbuf, sizeof(STEREO), TAPS, stdin)) {
+    int i;
+    for (i = 0; i < taps; ++i) {
+      int s0 = inbuf[i].l;      /* left channel microphone */
+      int s1 = inbuf[i].r;      /* right channel speaker */
+
+      /* and do NLMS */
+      s0 = aec.doAEC(s0, s1);
+      
+      /* output one internal variable */
+      // visualize = 16 * aec.hangover;
+      visualize = 32000 * aec.stepsize;
+      
+      outbuf[i].l = (short)(visualize); /* left channel */
+      outbuf[i].r = s0;         /* right channel echo cancelled mic */
+    }
+
+    fwrite(outbuf, sizeof(STEREO), taps, stdout);
+  }
+  ambient = aec.getambient();
+  float ambientdB = q2dB(ambient / 32767.0f);
+  fprintf(stderr, "Ambient = %2.0f dB\n", ambientdB);
+  fflush(NULL);
+
+  return 0;
+}

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.