Voice input at ADC (p20) is sampled at 16kHz and delayed 0.1-0.5s and output at DAC (p18).

Dependencies:   mbed

Revision:
3:8ed0851755d7
Parent:
2:718d996170c2
--- a/voiceecho.cpp	Fri Apr 19 04:11:04 2019 +0000
+++ b/voiceecho.cpp	Mon Jul 26 01:25:31 2021 +0000
@@ -13,12 +13,12 @@
 AnalogOut spk(p18);
 Ticker voicetick;
 
-#define WAVMAX 7000  /*buffer size; SAMPFREQ*DEALY<WAVMAX*/
+#define WAVMAX 10000  /*buffer size; SAMPFREQ*DEALY<WAVMAX*/
 #define SAMPFREQ 16000.0
-#define DELAY 0.25 /*s*/
+#define DELAY 0.3 /*s*/
 
 unsigned short wave[WAVMAX];
-int readindex=0, writeindex=0;
+int readindex=0, writeindex=0, wavmax=WAVMAX;
 
 class KBline : public Serial
 {
@@ -81,12 +81,12 @@
 } ;
 
 int newindex(int ix)
-{   if (ix<0) ix += WAVMAX;
-    return(ix % WAVMAX); }
+{   if (ix<0) ix += wavmax;
+    return(ix % wavmax); }
 
 void voice_io()    /*timer driven*/
 {   unsigned short val;
-    wave[readindex]= wave[readindex]*0.4+mic.read_u16()*0.6;  //mic.read()*30000;
+    wave[readindex]= wave[readindex]*0.45+mic.read_u16()*0.55;  //mic.read()*30000;
     val=wave[writeindex];
     pwm.write((float)val/65536.0);
     spk.write_u16(val); // (val/30000.0  );
@@ -103,6 +103,7 @@
     pwm.period_us(32);  /* 62.5us*/
     delay=DELAY;
     readindex=0;
+    wavmax=delay*SAMPFREQ+1;
     writeindex=newindex(readindex-delay*SAMPFREQ);
     voicetick.attach(voice_io, 1.0/SAMPFREQ);
     pc.printf("echo machine  delay=%fs\n\r", delay);
@@ -113,6 +114,8 @@
             wait(0.2);
         }
         sscanf(pc.line,"%f", &delay);  /* multiple of 0.1s */
+        readindex=0;
+        wavmax=delay*SAMPFREQ+1;
         writeindex=newindex(readindex-delay*SAMPFREQ);
         pc.printf("new delay %5.2fs  r=%d  w=%d  val=%d\n\r", delay, readindex, writeindex, wave[writeindex]);
     }