2
|
1 /* aec_test.cpp
|
|
2 *
|
|
3 * Copyright (C) DFS Deutsche Flugsicherung (2004). All Rights Reserved.
|
|
4 *
|
|
5 * Test stub for Acoustic Echo Cancellation NLMS-pw algorithm
|
|
6 * Author: Andre Adrian, DFS Deutsche Flugsicherung
|
|
7 * <Andre.Adrian@dfs.de>
|
|
8 *
|
|
9 * fortune says:
|
|
10 * It's never as good as it feels, and it's never as bad as it seems.
|
|
11 *
|
|
12 * compile
|
|
13 c++ -DWIDEB=2 -O2 -o aec_test aec_test.cpp aec.cpp tcp.cpp -lm
|
|
14 *
|
|
15 * Version 1.3 set/get ambient in dB
|
|
16 */
|
|
17
|
|
18 #include <stdio.h>
|
|
19 #include <stdlib.h>
|
|
20 #include <math.h>
|
|
21 #include <string.h>
|
|
22
|
|
23 #include "tcp.h"
|
|
24 #include "aec.h"
|
|
25
|
|
26 #define TAPS (40*WIDEB*8)
|
|
27
|
|
28 typedef signed short MONO;
|
|
29
|
|
30 typedef struct {
|
|
31 signed short l;
|
|
32 signed short r;
|
|
33 } STEREO;
|
|
34
|
|
35 float dB2q(float dB)
|
|
36 {
|
|
37 /* Dezibel to Ratio */
|
|
38 return powf(10.0f, dB / 20.0f);
|
|
39 }
|
|
40
|
|
41 float q2dB(float q)
|
|
42 {
|
|
43 /* Ratio to Dezibel */
|
|
44 return 20.0f * log10f(q);
|
|
45 }
|
|
46
|
|
47
|
|
48 /* Read a raw audio file (8KHz sample frequency, 16bit PCM, stereo)
|
|
49 * from stdin, echo cancel it and write it to stdout
|
|
50 */
|
|
51 int main(int argc, char *argv[])
|
|
52 {
|
|
53 STEREO inbuf[TAPS], outbuf[TAPS];
|
|
54 float visualize;
|
|
55
|
|
56 fprintf(stderr, "usage: aec_test [ambient in dB] <in.raw >out.raw\n");
|
|
57
|
|
58 AEC aec;
|
|
59
|
|
60 if (argc >= 2) {
|
|
61 aec.setambient(MAXPCM*dB2q(atof(argv[1])));
|
|
62 }
|
|
63
|
|
64 int taps;
|
|
65 float ambient;
|
|
66 while (taps = fread(inbuf, sizeof(STEREO), TAPS, stdin)) {
|
|
67 int i;
|
|
68 for (i = 0; i < taps; ++i) {
|
|
69 int s0 = inbuf[i].l; /* left channel microphone */
|
|
70 int s1 = inbuf[i].r; /* right channel speaker */
|
|
71
|
|
72 /* and do NLMS */
|
|
73 s0 = aec.doAEC(s0, s1);
|
|
74
|
|
75 /* output one internal variable */
|
|
76 // visualize = 16 * aec.hangover;
|
|
77 visualize = 32000 * aec.stepsize;
|
|
78
|
|
79 outbuf[i].l = (short)(visualize); /* left channel */
|
|
80 outbuf[i].r = s0; /* right channel echo cancelled mic */
|
|
81 }
|
|
82
|
|
83 fwrite(outbuf, sizeof(STEREO), taps, stdout);
|
|
84 }
|
|
85 ambient = aec.getambient();
|
|
86 float ambientdB = q2dB(ambient / 32767.0f);
|
|
87 fprintf(stderr, "Ambient = %2.0f dB\n", ambientdB);
|
|
88 fflush(NULL);
|
|
89
|
|
90 return 0;
|
|
91 }
|