comparison spandsp-0.0.3/README.txt @ 5:f762bf195c4b

import spandsp-0.0.3
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 16:00:21 +0200
parents
children
comparison
equal deleted inserted replaced
4:26cd8f1ef0b1 5:f762bf195c4b
1 Open Source Line Echo Canceller (OSLEC)
2 =======================================
3
4 [[introduction]]
5 Introduction
6 ------------
7
8 Oslec is an open source high performance line echo canceller. When
9 used with Asterisk it works well on lines where the built-in Zaptel
10 echo canceller fails. No tweaks like rxgain/txgain or fxotrain are
11 required. Oslec is supplied as GPL licensed C source code and is free
12 as in speech.
13
14 Oslec partially complies with the G168 standard and runs in real time
15 on x86 and Blackfin platforms. Patches exist to allow any Zaptel
16 compatible hardware to use Oslec. It has been successfully tested on
17 hardware ranging from single port X100P FXO cards to dual E1 systems.
18 Hardware tested includes TDM400, X100P, Sangoma A104, Rhino E1 etc.
19 It also works well on the link:ip04.html[IP04 embedded Asterisk
20 platform].
21
22 There is also a project underway to use
23 http://peter.schlaile.de/mISDN/[OSLEC with mISDN].
24
25 Oslec is included in many distributions, including Debian, Gentoo,
26 Trixbox, Elastix, and Callweaver.
27
28 [[testimonials]]
29 Testimonials
30 ------------
31
32 So how good is Oslec?
33
34 + The http://www.trixbox[Trixbox] community have been testing
35 Oslec, here is a
36 http://www.trixbox.org/forums/trixbox-forums/open-discussion/need-people-echo-problems[Trixbox
37 forum thread] that has feedback from many people. Start about half
38 way down the page, or search on the string "night and day" :-)
39
40 + The http://callweaver.org/wiki/Zaptel[CallWeaver] project use and recommend Oslec.
41
42 + Here is some feedback from Oslec users:
43
44 [Gordon Henderson, posted in the Asterisk-user mailing list July 21 2008]
45
46 ________________________________________________________________________
47 I switched to OSLEC after testing HPEC on TDM400 boards, and found that it
48 worked much better and wasn't limited to the restricted mechanism Digium
49 uses for licensing (unlikely as it sounds, I have some clients who do not
50 have a connection to the public Internet, and never will for their phone
51 system)
52
53 It also passes the wife test which HPEC didn't.
54
55 It's also free (OS as in Open Source), which HPEC isn't, although that
56 wasn't my primary reason for using it - ease of use and "workability" was.
57 _____________________________________________________________________
58
59 [Michael Gernoth, Author of the Zaptel MG2 echo canceller]
60
61 ________________________________________________________________________
62 Thanks for OSLEC, it's so much better than my hacked KB1 which is called
63 MG2 :-)
64 _____________________________________________________________________
65
66 [David Gottschalk]
67
68 ________________________________________________________________________
69 Once I managed to get OSLEC installed (it was a big job for me, because I was
70 missing many of the dependancies and knowledge), it immediately fixed the echo
71 problems I had been unable to get rid of to date despite lots and lots of
72 tweeks, tests and fiddling. Even more suprisingly, it appears to converge
73 almost immediately from my initial test.
74
75 This code is the best since thing since, well, Asterisk !!!
76 _____________________________________________________________________
77
78 [Nic Bellamy, Head Of Engineering; Vadacom Ltd]
79
80 ________________________________________________________________________
81 Short version: KB1 < MG2 < OSLEC < HPEC
82
83 In the open source line echo canceller category, OSLEC is so far the
84 best I've seen.
85
86 It converges reasonably fast, and thanks to it's dual-path approach,
87 will converge, albeit a bit slowly, on nasty echo paths where cancellers
88 like KB1 and MG2 will fail entirely.
89
90 The nonlinear processor and comfort noise generator provide for a far
91 more pleasant listening experience than KB1/MG2.
92
93 It's not quite up to the grade of ADT's G.168 canceller used in Digiums
94 HPEC product in terms of convergence speed or tail coverage.
95 _____________________________________________________________________
96
97 [Pawel Pastuszak, Astfin.org]
98
99 ________________________________________________________________________
100 Since I installed the first version of OSLEC I was hooked.... It's
101 been several months now since the alpha version was released; after
102 using OSLEC Mark and I agreed that we had to have OSLEC as the main
103 echo cancellation in the Astfin distribution.
104 ________________________________________________________________________
105
106 [Pavel Selivano, Parabel Ltd]
107
108 ________________________________________________________________________
109 I've been working with Oslec since March of 2007. Oslec has had some
110 problems, but, thanks to David, they are solved. Now, I can say Oslec
111 is time-tested. The best, I can note - it is still under development
112 (with feed-back). Thank you David for your good deed.
113
114 BTW: comparison to Intel IPP's echo canceler have shown, Oslec is very
115 good :-)
116 ________________________________________________________________________
117
118
119 [[news]]
120 Oslec News
121 ----------
122
123 + Saturday, June 7, 2008: We have worked out how to use <<rhino,Oslec with
124 Rhino>> PRI cards. Thanks Juan Manuel Coronado!
125
126 + Friday, May 16, 2008: Oslec Road Map. I have kicked off a
127 discussion of the
128 http://sourceforge.net/mailarchive/forum.php?thread_name=1210895745.7127.60.camel%40localhost&forum_name=freetel-oslec[development
129 roadmap] for Oslec. Is hardware echo cancellation headed for
130 extinction?
131
132 + Friday, May 16, 2008: Oslec chosen as the **default**
133 http://sourceforge.net/mailarchive/forum.php?thread_name=20080515131239.GJ27523%40xorcom.com&forum_name=freetel-oslec[echo
134 canceler for Debian]. Thanks Tzafrir for your work on packaging Oslec
135 for Debian!
136
137 + Tuesday, May 13, 2008: link:/blog/?p=64[Oslec versus the SPA 3000]
138 ATA. A blog post comparing the SPA 3000 echo cancellation to Oslec on
139 a problem FXO line.
140
141 + Wednesday, February 11, 2008: Oslec mailing list created. Due to
142 popular demand (well, Tzafrir mainly!) there is now an
143 https://lists.sourceforge.net/lists/listinfo/freetel-oslec[Oslec
144 mailing list].
145
146 + Sunday, February 10, 2008: Zaptel 1.4.8 patch checked into SVN,
147 thanks Tzafrir.
148
149 [[install]]
150 Installing OSLEC with Asterisk/Zaptel
151 --------------------------------------
152
153 Notes:
154
155 + This process also installs a system for sampling echo signals that
156 is helpful for developing oslec.
157
158 + I assume Asterisk is already installed and tested.
159
160 + I assume you are running Linux 2.6 and Zaptel 1.2.13 or a later
161 1.2/1.4 version of Zaptel.
162
163 + I assume you are using a Digium TDM400 line interface card. Change
164 the "insmod wctdm.ko" line below to match your line interface
165 hardware (e.g. wcfxo for a X100P).
166
167 + For Zaptel 1.4.x replace the 1.2.13 text below 1.4.x (tar ball and
168 patch file).
169
170 + For Linux 2.4 replace the "insmod moduleXYZ.ko" lines below with
171 "insmod moduleXYZ.o".
172
173 1/ Download, build and install oslec:
174
175 $ cd ~
176 $ wget http://www.rowetel.com/ucasterisk/downloads/oslec-0.1.tar.gz
177 $ tar xvzf oslec-0.1.tar.gz
178 $ cd oslec-0.1
179 $ make
180 $ insmod kernel/oslec.ko
181
182 Optional: If you want the latest and greatest, replace the "wget" step
183 with:
184
185 $ svn co http://svn.astfin.org/software/oslec/trunk/ oslec
186
187 NOTE: There are patches for Zaptel 1.2.13, 1.2.18, 1.2.24, 1.4.1,
188 1.4.3, 1.4.4, 1.4.7.1, 1.4.8, 1.4.9.2 and 1.4.11. It's quite easy to
189 port to other versions, please feel free to send me a new patch should
190 you get Oslec working with another Zaptel version. If you can't see a
191 patch for your Zaptel version try
192 http://svn.astfin.org/software/oslec/trunk/kernel[Oslec SVN] for the
193 latest patches.
194
195 2/ Build, patch and install Zaptel. First obtain zaptel-1.2.13.tar.gz and:
196
197 $ tar xvzf zaptel-1.2.13.tar.gz
198 $ cd zaptel-1.2.13
199 $ ./configure
200 $ patch < ../oslec-0.1/kernel/zaptel-1.2.13.patch (see note 1 below)
201 $ cp ../oslec-0.1/kernel/dir/Module.symvers . (see note 2 below)
202 $ make
203 $ insmod zaptel.ko
204 $ insmod wctdm.ko
205 $ ./ztcfg
206 $ asterisk
207
208 NOTE: 1: Use -p1 option for zaptel-1.4.9.2 and above
209
210 NOTE: 2: The "cp Module.symvers" step above is optional on many systems;
211 it stops warnings like WARNING: "oslec_echo_can_create" [zaptel.ko]
212 undefined!". However on some Linux machines zaptel will not compile
213 without this step.
214
215 3/ These options in zapata.conf are important:
216
217 ---------------------------------------------------------------------
218 echocancel=yes
219 echocancelwhenbridged=no
220 ;echotraining=400
221 ---------------------------------------------------------------------
222
223 The *echocancelwhenbridged=no* allows faxes to pass from FXS to FXO
224 ports without interference from the echo canceller. This option is
225 important for fax signals.
226
227 Make sure *echotraining* is disabled when using Oslec - this is not
228 supported and if enabled will cause the channel to be silent (i.e. no
229 audio will pass through).
230
231 4/ The settings above have been shown to reliably cancel echo in 95%
232 of cases. If you can still hear echo you may have one of the rare
233 cases where your echo is longer than 16ms. To configure Oslec with a
234 32ms tail:
235
236 ---------------------------------------------------------------------
237 echocancel=256
238 echocancelwhenbridged=no
239 ;echotraining=400
240 ---------------------------------------------------------------------
241
242 Then restart Asterisk.
243
244 [[pbxinaflash]]
245 PBX in a Flash Install
246 ----------------------
247
248 Here are the
249 http://pbxinaflash.com/forum/showthread.php?t=100&page=3[Oslec install
250 procedure] for PBX in a Flash. Check the 7-24-08 post in this thread
251 by Alex728 for Zaptel-1.4.11 instructions. Thanks JD Austin and Alex.
252
253 Matt Keys has suggested that the PBX in a Flash install procedure also
254 worked well for Ubuntu server.
255
256 [[rhino]]
257 Rhino PRI cards
258 ---------------
259
260 The rhino-2.2.6 driver for Rhino PRI cards has software echo
261 cancellation disabled by default. This means there is no echo
262 cancellation unless you opt for the Rhino hardware echo cancellation
263 module. However the driver is easy to hack to enable software echo
264 cancellation, and hence Oslec.
265
266 In the rhino-2.2.6 driver, file r1t1_base.c, r1t1_receiveprep
267 function, around line 800:
268
269 ---------------------------------------------------------------------
270 static void r1t1_receiveprep(struct r1t1 *rh, int nextbuf)
271 {
272 /*
273 int x;
274
275 for (x=0;x<rh->span.channels;x++) {
276 zt_ec_chunk(&rh->chans[x], rh->chans[x].readchunk, rh->ec_chunk2[x]);
277 memcpy(rh->ec_chunk2[x],rh->ec_chunk1[x],ZT_CHUNKSIZE);
278 memcpy(rh->ec_chunk1[x],rh->chans[x].writechunk,ZT_CHUNKSIZE);
279 }
280 */
281 zt_receive(&rh->span);
282 }
283 ---------------------------------------------------------------------
284
285 **Solution 1:** Simply un-comment the code and rebuild the driver:
286
287 ---------------------------------------------------------------------
288 static void r1t1_receiveprep(struct r1t1 *rh, int nextbuf)
289 {
290
291 int x;
292
293 for (x=0;x<rh->span.channels;x++) {
294 zt_ec_chunk(&rh->chans[x], rh->chans[x].readchunk, rh->ec_chunk2[x]);
295 memcpy(rh->ec_chunk2[x],rh->ec_chunk1[x],ZT_CHUNKSIZE);
296 memcpy(rh->ec_chunk1[x],rh->chans[x].writechunk,ZT_CHUNKSIZE);
297 }
298
299 zt_receive(&rh->span);
300 }
301 ---------------------------------------------------------------------
302
303 **Solution 2:** Bob Conklin from Rhino has suggested this fix that
304 they have in SVN trunk:
305
306 ---------------------------------------------------------------------
307 static void r1t1_receiveprep(struct r1t1 *rh, int nextbuf)
308 {
309 if (!rh->dsp_up)
310 zt_ec_span(&rh->span);
311 zt_receive(&rh->span);
312 }
313 ---------------------------------------------------------------------
314
315 This version automatically falls back to software echo cancellation if
316 the DSP-based hardware echo cancellation is not present. Thanks
317 Bob!
318
319 [[status]]
320 Status
321 ------
322
323 Current status is considered *Stable*. As of 3 January 2008:
324
325 + Thousands of people (estimated) using Oslec on x86 platforms now.
326 Oslec is stable and works well. Oslec has been included in many
327 distributions, including Debian, Gentoo, Trixbox, Elastix, and
328 Callweaver.
329
330 + Oslec works well on many different types of hardware, from single
331 port $10 X100P cards to dual E1s.
332
333 + Oslec has been partially optimised for the embedded Blackfin
334 DSP/RISC CPU and now runs in real time on the link:ip04.html[IP04 Open
335 Hardware IP-PBX]. Running on several hundred IP04s now.
336
337 + Real time runs well on FXO/FXS lines where the other Zaptel echo
338 cancellers (including the latest MG2) struggle. No tweaks like
339 levels, fxotrain, or even opermode required so far. Hardware used for
340 tests was a TDM400 and X100P card.
341
342 + The simulation code passes many but not all of the G168 tests.
343 Some problems with high level signals near 0dBm0 and some of the G168
344 echo models. Passes maybe 90% of the tests attempted so far, however
345 not all of the tests and/or range of test conditions have been
346 attempted yet. The fails are close calls (like a few dB off), not
347 complete breakdowns of the algorithm.
348
349 + Oslec has been specifically developed to work with low cost line
350 interface hardware like the X100P. The X100P has problems with 60Hz
351 hum and DC offset in the rx signal, which interfere with the echo
352 canceller algorithm. However with the addition of some high pass
353 filters good results with X100P cards have been obtained using Oslec.
354 Line interfaces based on chips such as those from Silicon Labs
355 (e.g. the TDM400) have no DC offset or hum which is one reason they
356 tend to perform better.
357
358 + Oslec has been optimised to deal with specific problems encountered
359 with soft phone clients. Due to the high quality microphones and
360 sound blaster hardware used on PCs, more low frequency energy is
361 present compared to normal telephone signals. When this low frequency
362 energy is sent to a hybrid it can force the hybrid into a non linear
363 mode. Echo cancellers assume a linear hybrid so any non-linearities
364 make the echo canceller fall over. The solution is to high pass
365 filter energy sent to the hybrid to ensure excessive low frequency
366 energy is removed. This means inserting a HP filter in the tx path.
367
368 [[directories]]
369 Directories
370 -----------
371
372 The http://svn.astfin.org/software/oslec/trunk/[Oslec SVN repository]
373 combines several projects (mainly spandsp) used to develop, test, and
374 run oslec.
375
376 spandsp : A subset of spandsp to support testing and development of
377 Oslec. The echo canceller and G168 test suite source code
378 live in here.
379
380 user....: User mode apps, e.g. sampling of echo signals and a unit
381 test for measuring the execution speed of Oslec.
382
383 kernel..: Builds Oslec into a kernel module. Also contains patches for
384 Zaptel to allow the use of Oslec.
385
386 [[diagnostics]]
387 Run Time Information
388 --------------------
389
390 Set up a call that uses an analog port, then check out /proc/oslec for
391 real-time stats:
392
393 [root@homework kernel]# cat /proc/oslec/info
394 channels....: 1
395 mode........: [13] |ADAPTION|NLP|CNG|
396 Ltx.........: 0
397 Lrx.........: 211
398 Lclean......: 211
399 Lclean_bg...: 211
400 shift.......: 0
401 Double Talk.: 1
402 MIPs (last)....: 1
403 MIPs (worst)...: 7
404 MIPs (avergage): 1
405
406 You can turn the various mode switches off and on, for example:
407
408 echo 9 > /proc/oslec/mode
409
410 turns off comfort noise, but keeps ADAPT and NLP on. The mode
411 switches are listed in the
412 http://svn.astfin.org/software/oslec/trunk/spandsp-0.0.3/src/spandsp/echo.h[echo.h]
413 header file (#define ECHO_CAN_USE_*). The /proc interface only
414 monitors the first Zaptel call you bring up, see
415 http://svn.astfin.org/software/oslec/trunk/kernel/oslec_wrap.c[oslec_wrap.c]
416 for more information.
417
418 There is a GUI for run-time control of Oslec, called the Oslec Control
419 Panel. For example you can Enable and Disable the echo canceller in
420 real time, as you are speaking. If you Reset the echo canceller you
421 can hear how long it takes to converge again.
422
423 NOTE: The command line tool *dialog* must be installed on your system
424 to use the Oslec Control Panel.
425
426 $ cd kernel
427 $ ./oslec-ctrl-panel.sh
428
429 image::/images/echo/oslec_control_panel.png[Oslec Control Panel]
430
431 [[speed]]
432 Execution Speed and Optimisation
433 --------------------------------
434
435 In the user directory there is a
436 http://svn.astfin.org/software/oslec/trunk/user/speedtest.c[speedtest.c]
437 program that measures how many MIPs the echo canceller consumes and
438 estimates how many cancellers can run in real time. The current x86
439 code is vanilla C and could be greatly improved with MMX or SSE
440 optimisations, some of which are already coded in spandsp. There is
441 also much that can be done to improve execution speed on the Blackfin.
442
443 Steve's spandsp code includes some support for MMX and SSE2
444 optimisation. Define USE_MMX or USE_SSE2 in the Makefile to use this
445 option. At this stage only the fir.h filter code is optimised, oslec
446 would run much faster if lms_adapt_bg() in echo.c was also ported to
447 MMX/SSE2. With USE_MMX defined, the speedtest.c program dropped from
448 33 MIPs to 20 MIPs per channel for 256 taps/32ms. If using MMX in the
449 kernel (e.g. with zaptel) make sure you compile zaptel with
450 CONFIG_ZAPTEL_MMX to ensure the FPU state is saved in the right
451 places.
452
453 To enable MMX/SSE modify this line of oslec/kernel/Makefile:
454
455 ----------------------------------------------
456
457 all::
458 $(MAKE) -C $(KDIR) EXTRA_CFLAGS='$(KINCLUDE) \
459 -DUSE_MMX -DUSE_SSE2 -DEXPORT_SYMTAB -O6' \
460 SUBDIRS=$(PWD) modules
461
462 ----------------------------------------------
463
464 Thanks Nic Bellamy for help in testing MMX and Ming-Ching Tiew for
465 providing the correct command line for compiling with MMX/SSE.
466
467 Some notes on further optimisation:
468
469 1/ How do lots of MIPs in ISR affect total system performance? For
470 example if we are using 25% of MIP in ISR does * still run OK? Find the
471 CPU load knee different for user versus kernel mode cycles
472 consumption.
473
474 2/ Estimated Oslec MIPs are 5(N)(Fs), N is the filter size (number of
475 taps), Fs=8000 is the sampling rate. Factor of 5 is comprised of 1
476 for each FIR filter (forgeround and background), 2 for LMS, 1 for overhead.
477 This suggests that when optimised around 10 MIPs for a 32ms tail.
478
479 3/ There are some more notes on optimisation for the Blackfin in
480 http://svn.astfin.org/software/oslec/trunk/spandsp-0.0.3/src/echo.c[echo.c].
481
482 [[credits]]
483 Background and Credits
484 ----------------------
485
486 Oslec started life as a prototype echo canceller and G168 test
487 framework from Steve Underwood's http://www.soft-switch.org/[Spandsp]
488 library. Steve wrote much of the DSP code used in Asterisk, and the
489 Zaptel echo cancellation code is heavily based on his work.
490
491 Using the Spandsp G168 test framework, a high performance echo
492 canceller has been developed and carefully tested. Working together
493 with alpha testers the performance was brought to a beta state in June
494 2005. <<links,More>>. Since then many thousands of people have
495 installed Oslec.
496
497 Thanks to Steve Underwood, Jean-Marc Valin, and Ramakrishnan
498 Muthukrishnan for their suggestions and email discussions. Thanks
499 also to those people who collected echo samples for me such as Mark,
500 Pawel, and Pavel. Thanks Nic Bellamy for help with testing,
501 explanation of long path issues, and MMX support. Thanks Tzafrir for
502 testing and patches/enhancements and Dmitry for help with
503 multithreaded and locking issues.
504
505 Thanks Vieri for finding a circuit with a tail > 32ms, and Patrick for
506 submitting a Zaptel 1.2.18 patch. Thanks Dave Fullerton and Carlton
507 O'Riley for Zaptel 1.4.3/1.4.4 patches. Thanks Bill Salibrici for
508 finding a memory leak. Thanks Michael E. Kromer for submitting a
509 Zaptel 1.4.7.1 patch, and Tzafrir for the Zaptel 1.4.8 patch. Thanks
510 Russ Price for the Zaptel 1.2.24 patch. Thanks Chris Notley for the
511 1.4.11 patch.
512
513 Thanks to Peter Schlaile for porting Oslec to mISDN. Thanks also to
514 Kristijan Vrban for sending me some ISDN hardware so I can help with
515 the ISDN/Oslec testing!
516
517 Thanks to Tzafrir and Faidon for helping debug the muted audio
518 problems on 64 bit systems.
519
520 Thanks Rudolf E. Steiner for testing Oslec on SMP and multiple E1
521 systems.
522
523 [[sample]]
524 Sampling Zaptel Echo
525 --------------------
526
527 Introduction
528 ~~~~~~~~~~~~
529
530 I have developed a system for sampling echo on running Zaptel/Asterisk
531 systems. If you do experience any echo with Oslec, please use this
532 system to sample the echo, then email the sample files to me.
533
534 See the http://www.rowetel.com/blog/?p=18[Part 1 blog post] for more
535 information on sampling echo.
536
537 The nice thing about is that it doesn't interfere with your running
538 Asterisk system. If you hear echo at any time you can fire up a
539 console and run "sample" to capture real-time data from the Zaptel
540 port.
541
542 There are other ways to capture audio from a running Asterisk system,
543 for example using the built in Asterisk play and record applications.
544 However this system is designed to capture *exactly* the signals being
545 fed to & from the echo canceller - preserving the exact timing of the
546 signals and with no intermediate buffering. This is very important
547 for echo cancellation work - the algorithms depend on an exact timing
548 relationship between the transmit and receive signals.
549
550 The system simultaneously captures the receive signal both before
551 *and* after the echo canceller - something that is difficult to do
552 with the built in Asterisk functions due to the location of the echo
553 canceller deep in the Zaptel driver.
554
555 If you would like to help further develop Oslec, please
556 mailto:david_at_rowetel_dot_com[send me] your echo samples! I would
557 welcome any samples of your echo signals, for example where the echo
558 canceller isn't working well, and also cases where it does work
559 well. By comparing the two cases we can learn a lot about the
560 strengths and weaknesses of the algorithm.
561
562 Installing
563 ~~~~~~~~~~
564
565 1/ Install Oslec ("HowTo - Run OSLEC with Asterisk/Zaptel" section above).
566
567 2/ If you would like to use zaptap without oslec change the selected
568 echo canceller in zconfig.c and rebuild/install zaptel.
569
570 3/ Compile sample.c:
571
572 # cd user
573 # make
574
575 4/ Create a device node. I used major number 33 as it was
576 free on my PC:
577
578 # mknod -m 666 /dev/sample c 33 0
579
580 If 33 is not free choose a free major number and change the
581 #define SAMPLE_MAJOR in zaptel.c and recompile.
582
583 Note it is important to "insmod zaptel.o" from inside the zaptel
584 directory and don't forget the ".o" (.ko for Linux 2.6). Otherwise
585 insmod will use the previously installed version of zaptel and
586 "sample" won't work.
587
588 5/ Make the call to the Zaptel port you wish to sample. Run
589 sample while talking:
590
591 # ./sample test 1 5
592
593 this will create test_tx.raw, test_rx.raw & test_ec.raw. There
594 will be a few messages on the console as the driver does it's
595 thing, you can check these with dmesg.
596
597 6/ You can check your samples by playing them back through your
598 sound card, for example:
599
600 # play -f s -r 8000 -s w test_ec.raw
601
602 7/ To convert the raw files to wave files (this is more convenient for playing
603 and processing with the Oslec simulation):
604
605 # sox -t raw -r 8000 -s -w -c 1 test_ec.raw test_ec.wav
606 # play test_ec.wav
607
608 8/ There is an Octave script pl.m to help plot the samples:
609
610 # cp /your/test/samples ~/oslec/user
611 # cd ~/oslec/user
612 # octave
613 octave:1> pl("test")
614
615 Configuration
616 ~~~~~~~~~~~~~
617
618 + Zaptel/Asterisk 1.2.13, 1.4.0 or 1.4.1. However other versions should work
619 OK.
620 + Linux 2.4 or 2.6 Kernel
621 + Digium TDM400 hardware
622 + My zapata.conf for the FXO port under test is something like:
623
624 ---------------------------------------------------------------------
625 signalling=fxs_ks
626 echocancel=yes
627 ;echocancelwhenbridged=yes
628 ;echotraining=400
629 group=2;
630 conext=incoming
631 channel =>4
632 ---------------------------------------------------------------------
633
634 Note echo training is switched off, although this didn't make much
635 difference to the FXO Port when using the built-in Zaptel echo
636 cancellers. (helped the the FXS port though). Oslec does not support
637 echo training.
638
639 [[support]]
640 Support
641 -------
642
643 https://lists.sourceforge.net/lists/listinfo/freetel-oslec[Oslec
644 mailing list].
645
646 [[further]]
647 Further Work
648 ------------
649
650 Here are some ideas for further work.
651
652 1/ Make info screen on control panel update each second automatically.
653
654 2/ When e/c is reset during a call it converges faster than at start of
655 calls. This suggests e/c is wandering off into dumb states before
656 the call is connected. Perhaps disabling adaption until the call
657 is connected would help with faster convergence
658
659 3/ Preserving the state of the e/c between calls is also a very good
660 idea, current zaptel design destroys the e/c at the end of a call.
661
662 4/ Switch on and test SSE and MMX filter code for x86. Code LMS
663 update for x86 in SSE or MMX.
664
665 5/ Add a feature to /proc/oslec to extract the current estimated
666 impulse response. Use gnuplot or Octave to plot it in real time.
667
668 6/ Attempt to speed convergence.
669
670 7/ Set up test scripts for greater coverage of G168 tests.
671
672 8/ If necessary develop a sparse approach to handle 128ms tails.
673
674 [[Simulation]]
675 HowTo - OSLEC G168 Simulation
676 -----------------------------
677
678 The simulation form of Oslec is useful for Oslec development. It is
679 much easier to develop using a non-real time, user mode program than
680 saying 'Hello,...1,...2,....3" down a telephone line. The simulation
681 dumps internal states while it is running, which can be plotted and
682 analysed using Octave.
683
684 1. Read spandsp-0.0.3/README and make sure you have installed the
685 dependencies like libtiff-devel, libaudiofile-devel, fftw-devel.
686
687 2. Make, build, run a test:
688
689 $ cd spandsp-0.0.3;
690 $ ./configure --enable-tests
691 $ make
692 $ cd tests
693 $ ./echo_tests 2a
694
695 3. You can change the echo path model with -m [1..7] (default 1)
696
697 4. You can change the ERL with -erl [0..whatever] (default 10.0)
698
699 5. You can plot the internal states using Octave:
700
701 $ cd spandsp-0.0.3/echo_tests
702 $ octave
703 octave:1> echo_dump
704
705 The st= and en= statements at the top of echo_dump.m control which
706 part of the waveform is plotted.
707
708 6. There are some sequences of tests set up in the script files:
709
710 $ ./g168_quick.sh (useful for a quick sanity test)
711 $ ./g168_tests.sh (more comprehensive set of tests)
712
713 7. For more options:
714
715 $ ./echo_tests -h
716
717 8. Counting passes (say if u want to see how many tests pass after making
718 a change):
719
720 $ ./g168_tests.sh > lms16bit.txt
721 $ cat lms16bit.txt | grep PASS | wc -l
722
723 [[links]]
724 Further Reading
725 ---------------
726
727 + http://svn.astfin.org/software/oslec/trunk/spandsp-0.0.3/src/echo.c[echo.c]
728 is the heart of the Oslec echo canceller.
729
730 There are several blog posts documenting the development of Oslec:
731
732 + http://www.rowetel.com/blog/?p=18[Part 1 - Introduction] discusses the myth
733 of hardware echo cancellation and the concept of an echo canceller
734 developed using echo samples collected by a community.
735
736 + http://www.rowetel.com/blog/?p=21[Part 2 - How Echo Cancellers Work]
737 is an easy to read introduction to echo cancellation for C programmers.
738
739 + http://www.rowetel.com/blog/?p=22[Part 3 - Two Prototypes] discusses
740 two algorithms that were developed as candidates for Oslec. This is a
741 fairly "hard core" DSP post - some familiarity with echo cancellers is
742 assumed.
743
744 + http://www.rowetel.com/blog/?p=23[Part 4 - First Phone calls] talks
745 about the very first real-world phone calls made using Oslec.
746
747 + http://www.rowetel.com/blog/?p=33[Part 5 - Ready for Beta Testing].
748 Walks through some of the alpha testing bugs and how they were fixed,
749 discusses open development methods and the need for 128ms tails.
750
751 Some useful links:
752
753 + Ochiai, Areseki, and Ogihara, "Echo Canceller with Two Echo Path
754 Models", IEEE Transactions on communications, COM-25, No. 6, June 1977.
755 http://www.rowetel.com/images/echo/dual_path_paper.pdf[download].
756
757 + The classic, very useful paper that tells you how to actually build
758 a real world echo canceller: Messerschmitt, Hedberg, Cole, Haoui,
759 Winship, "Digital Voice Echo Canceller with a
760 TMS320020. http://www.rowetel.com/images/echo/spra129.pdf[download].
761
762 + A nice
763 http://en.wikipedia.org/wiki/Least_mean_squares_filter[introduction to
764 LMS filters].
765
766 + Good introduction to http://www.cisco.com/univercd/cc/td/doc/cisintwk/intsolns/voipsol/ea_isd.htm[echo on VOIP calls] from Cisco.
767

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