2011/4/18 Li Maoquan <span dir="ltr">&lt;<a href="mailto:limaoquan2000@126.com">limaoquan2000@126.com</a>&gt;</span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">&gt;&gt;&gt;&gt; Hi, <br>&gt;&gt;&gt; <br>&gt;&gt;&gt; I have a scenario in a mobile VoIP app that requires echo cancellation but <br>&gt;&gt;&gt; is somewhat different from what&#39;s described in the docs. <br>
&gt;&gt;&gt; <br>&gt;&gt;&gt; Audio is received from and sent to the network at 8000Hz. Each packet <br>&gt;&gt;&gt; contains 160 samples worth a playback of 20ms. <br>&gt;&gt;&gt; <br>&gt;&gt;&gt; But the hardware requires aggregation for both playback and capture. So for <br>
&gt;&gt;&gt; playback, I coalesce 4 packets in a buffer and queue them as a larger buffer <br>&gt;&gt;&gt; for playback. <br>&gt;&gt;&gt; On the send side, I read a large buffer (worth 4 packets) and send them out <br>&gt;&gt;&gt; over time 20ms apart. <br>
&gt;&gt;&gt; <br>&gt;&gt;&gt; I tried using speex_echo_playback just when a 160-sample packet arrives from <br>&gt;&gt;&gt; the network, before coalescing and speex_echo_capture just before a packet <br>&gt;&gt;&gt; is sent out to the network but that doesn&#39;t seem to work properly (doesn&#39;t <br>
&gt;&gt;&gt; cancel any echo). <br>&gt;&gt;<br>&gt;&gt; The most likely reason is that you didn&#39;t align the far-end and near-end samples.<br>&gt;&gt; So the filter can not converge.<br>&gt;<br>&gt;Thanks for your response. Can you please explain what you mean by <br>
&gt;align samples from near-end and far-end? And how is that usually <br>&gt;accomplished? <br><br></div>You need to know the total delay caused by DAC buffer before speaker, ADC buffer<br>after microphone and acoustic path between speaker and microphone. Simply to say,<br>
if you play an impluse signal and its first echo appears after N sample cycles,<br>you can call N as the delay between y (echo in near-end signal) and x (far-end<br>signal). Then you can buffer far-end signal for N-M cycles before sending to AEC.<br>
M is a little number (such as 100) in order to avoid filter failure when echo<br>path drifts.<div class="im"><br></div></blockquote><div>&nbsp;</div><div>Thanks again. I am trying to model the delay between the near and far end signals using a circular queue of length n. Every time a frame is received and queued for playback, it is also entered into the queue. Each frame being read from the mic is echo-cancelled ( speex_echo_cancellation ) using the oldest frame in the queue if the queue is filled up, thus I am cancelling the recorded frame using a playback frame that is N-frames old.</div>
<div><br></div><div>I have played with different values of N from 2 to 50 (320 samples to 8000 samples), attempting to align the input and output but the cancellation doesn&#39;t seem to work. The echo is steady as ever.</div>
<div><br></div><div>Is this model correct and expected to converge with a right value of &quot;N&quot;? Or do I need some other adaptation to account for drifts here. Right now, it&#39;s a black box for me. I am not sure how to get some feedback from this system to tune the AEC (and the delay parameters) correctly.</div>
<div><br></div><div>Also, I did not follow the use of &quot;M&quot; in your description above and how it helps with drifts. My queue stores frames (160 samples each). So a number of 100 samples seems too small.</div><div>
<br></div><div>Btw, I am assuming that speex AEC API can be used even though I am not using the speex encoder/decoder.</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im"><br>&gt;&gt;<br>&gt;&gt;&gt;&gt; So, in this scenario above, please recommend a good place to insert <br>&gt;&gt;&gt; speex_echo_playback and speex_echo_capture. Should I be just before the read <br>&gt;&gt;&gt; and write to hardware? In that case, should I use a larger &quot;frame size&quot; of <br>
&gt;&gt;&gt; 160 samples x 4? <br>&gt;&gt;<br>&gt;&gt; Of course you can set frame size to 160*4. Otherwise you can feed samples 4 times<br>&gt;&gt; to the AEC if you don&#39;t want to modify the frame size. <br>&gt;&gt;<br>
&gt;&gt;&gt; <br>&gt;&gt; Thanks in advance, <br>&gt;&gt; Daniel.<br><br><br><br></div><span title="neteasefooter"><span><hr>
<a href="http://mail.163.com/html/110414_attachment/att1.htm" target="_blank">体验网易邮箱2G超大附件,轻松发优质大电影、大照片,提速3倍!</a>
</span></span><br>_______________________________________________<br>
Speex-dev mailing list<br>
<a href="mailto:Speex-dev@xiph.org">Speex-dev@xiph.org</a><br>
<a href="http://lists.xiph.org/mailman/listinfo/speex-dev" target="_blank">http://lists.xiph.org/mailman/listinfo/speex-dev</a><br>
<br></blockquote></div><br>