FreeCalypso > hg > freecalypso-tools
comparison doc/Audio-mode-config @ 847:6e137995c9c8
doc/Audio-mode-config: elaborate on AEC and FIR blocks
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 10 Aug 2021 01:50:41 +0000 |
parents | 6a0fcbca8ac7 |
children | 6c306705f503 |
comparison
equal
deleted
inserted
replaced
846:a2e17e0f9622 | 847:6e137995c9c8 |
---|---|
266 * If neither setting is given, a 164 byte file will be produced, with the 5 AEC | 266 * If neither setting is given, a 164 byte file will be produced, with the 5 AEC |
267 words of the old type being all zeros. Thanks to the modified audio mode | 267 words of the old type being all zeros. Thanks to the modified audio mode |
268 loading code in our firmwares, these 164 byte mode files can still be used | 268 loading code in our firmwares, these 164 byte mode files can still be used |
269 with current Tourmaline fw, with AEC set to its default disabled state. | 269 with current Tourmaline fw, with AEC set to its default disabled state. |
270 | 270 |
271 New AEC parameter words | |
272 ======================= | |
273 | |
274 The 12 words that configure AEC of the L1_NEW_AEC flavor (appearing on the | |
275 aec-new line in tiaud-compile input or in an fc-tmsh auw 12 command) map as | |
276 follows: | |
277 | |
278 Word 0: aec_enable | |
279 | |
280 This word must be set to 0 to disable AEC or 2 to enable it. This word is | |
281 translated to a single DSP control bit by the Audio Service layer, thus no | |
282 other values must be written into it. | |
283 | |
284 Word 1: continuous_filtering | |
285 | |
286 This word is written directly into the DSP, and we have no documentation for it | |
287 beyond "enable (1) or disable (0) continuous mode filtering". | |
288 | |
289 Word 2: granularity_attenuation | |
290 | |
291 This word is written directly into the DSP, and we have no documentation for it | |
292 beyond "granularity of the smoothed attenuation". | |
293 | |
294 Word 3: smoothing_coefficient | |
295 | |
296 This word is written directly into the DSP, and we have no documentation for it | |
297 beyond "smoothing coefficient". | |
298 | |
299 Word 4: max_echo_suppression_level | |
300 | |
301 This word is written directly into the DSP; it is described as "maximum | |
302 attenuation level", and the following constants are defined for it: | |
303 | |
304 #define AUDIO_MAX_ECHO_0dB (0x7FFF) | |
305 #define AUDIO_MAX_ECHO_2dB (0x65AA) | |
306 #define AUDIO_MAX_ECHO_3dB (0x59AD) | |
307 #define AUDIO_MAX_ECHO_6dB (0x4000) | |
308 #define AUDIO_MAX_ECHO_12dB (0x1FFF) | |
309 #define AUDIO_MAX_ECHO_18dB (0x0FFF) | |
310 #define AUDIO_MAX_ECHO_24dB (0x07FF) | |
311 | |
312 Word 5: vad_factor | |
313 | |
314 This word is written directly into the DSP, and we have no documentation for it | |
315 beyond "VAD factor relative to the current estimated energy". VAD must stand | |
316 for "voice activity detector", but our knowledge ends here. | |
317 | |
318 Word 6: absolute_threshold | |
319 | |
320 This word is written directly into the DSP, and we have no documentation for it | |
321 beyond "VAD absolute offset relative to the current estimated energy". | |
322 | |
323 Word 7: factor_asd_filtering | |
324 | |
325 This word is written directly into the DSP, and we have no documentation for it | |
326 beyond "modifying factor of d_far_end_noise for filtering decision". | |
327 | |
328 Word 8: factor_asd_muting | |
329 | |
330 This word is written directly into the DSP, and we have no documentation for it | |
331 beyond "modifying factor of d_far_end_noise for muting decision". | |
332 | |
333 Word 9: aec_visibility | |
334 | |
335 This word must be set to 0 for normal operation or 0x200 for "AEC visibility" | |
336 debug mode. This word is translated to a single L1 control bit by the Audio | |
337 Service layer, thus no other values must be written into it. | |
338 | |
339 Word 10: noise_suppression_enable | |
340 | |
341 This word must be set to 0 to disable SPENH algorithm or 4 to enable it. This | |
342 word is translated to a single DSP control bit by the Audio Service layer, thus | |
343 no other values must be written into it. We don't know what this "speech | |
344 enhancement" algorithm does, and whether or not it is the same as "noise | |
345 suppression". | |
346 | |
347 Word 11: noise_suppression_level | |
348 | |
349 This config word is mapped to just two bits in the actual DSP control word by | |
350 the Audio Service layer, thus there are only 4 possible valid values here: | |
351 | |
352 #define AUDIO_NOISE_NO_LIMITATION (0x0000) | |
353 #define AUDIO_NOISE_6dB (0x0020) | |
354 #define AUDIO_NOISE_12dB (0x0040) | |
355 #define AUDIO_NOISE_18dB (0x0060) | |
356 | |
357 Some known-good AEC configurations | |
358 ================================== | |
359 | |
360 The terse descriptions of parameter words given above unfortunately constitute | |
361 the total extent of our knowledge of the AEC block in our dear Calypso DSP and | |
362 its tuning parameters - we don't know anything more. However, we do have 3 | |
363 example configurations to look at: we have the default values of the tuning | |
364 parameters that appear to be initialized by the DSP itself on boot, and we have | |
365 two AEC-enabled configurations set by Pirelli DP-L10 firmware: one for handheld | |
366 and wired headset modes, the other for the hands-free loudspeaker mode. Here | |
367 are the 12 parameter words in the 3 available configurations: | |
368 | |
369 Parameter word Default Pirelli Pirelli | |
370 (AEC disabled) handheld hands-free | |
371 -------------------------------------------------------------------------- | |
372 aec_enable 0 (off) 2 (on) 2 (on) | |
373 continuous_filtering 0 (off) 1 (on) 1 (on) | |
374 granularity_attenuation 0x0001 0x0014 0x0014 | |
375 smoothing_coefficient 0x7FFF 0x0CCC 0x0CCC | |
376 max_echo_suppression_level 0x1FFF (12 dB) 0x59AD (3 dB) 0x0FFF (18 dB) | |
377 vad_factor 0x4000 0x4000 0x4000 | |
378 absolute_threshold 0x0032 0x0032 0x0032 | |
379 factor_asd_filtering 0x1000 0x1000 0x1000 | |
380 factor_asd_muting 0x1000 0x1000 0x1000 | |
381 aec_visibility 0 (off) 0 (off) 0 (off) | |
382 noise_suppression_enable 0 (off) 4 (on) 4 (on) | |
383 noise_suppression_level 0 (none) 0 (none) 0x0060 (18 dB) | |
384 | |
385 The following observations can be made: | |
386 | |
387 * The 4 parameters vad_factor, absolute_threshold, factor_asd_filtering and | |
388 factor_asd_muting remain unchanged between TI's DSP default and Pirelli's | |
389 production configs. On the basis of this observation, I (Mother Mychaela) | |
390 get the feeling that these four should be left alone. | |
391 | |
392 * Besides the obvious steps of enabling AEC and SPENH, Pirelli did change | |
393 continuous_filtering (from off to on), granularity_attenuation and | |
394 smoothing_coefficient. Unfortunately, unless we recover the source code for | |
395 our Calypso DSP ROM or some documents explaining this version of AEC in | |
396 detail, we have no way of understanding what these parameters do, let alone | |
397 evaluating the merits of Pirelli's change. | |
398 | |
399 * max_echo_suppression_level and noise_suppression_level seem to be the two | |
400 parameters most amenable to tuning. | |
401 | |
402 * It is interesting to note that Pirelli's fw enables AEC not only in the | |
403 loudspeaker mode, but also in the more basic handheld and wired headset | |
404 modes. The two AEC configs differ only in max_echo_suppression_level and | |
405 noise_suppression_level parameters, with the loudspeaker mode AEC config | |
406 being more aggressive. | |
407 | |
408 Prior to seeing what Pirelli's fw does, my (Mychaela's) own thinking was that | |
409 AEC is only needed in loudspeaker configurations, not handheld or headset. | |
410 After seeing Pirelli's AEC configs, I reason that enabling a less aggressive | |
411 AEC configuration in those less echo-prone modes probably doesn't hurt - thus | |
412 until and unless we recover more documentation or other knowledge, the plan for | |
413 our own FreeCalypso Libre Dumbphone handset is to do what Pirelli does: use a | |
414 less aggressive AEC config in handheld and headset modes, and a more aggressive | |
415 one in the hands-free loudspeaker mode. | |
416 | |
417 On our current FCDEV3B setup with a SparkFun COM-09151 loudspeaker and a CUI | |
418 CMC-9745-130T microphone, applying Pirelli's loudspeaker-mode AEC config | |
419 produces echo cancellation that sounds acceptable to our subjective human | |
420 evaluator on the far end of test calls. | |
421 | |
422 FIR filter details | |
423 ================== | |
424 | |
425 Calypso DSP has two FIR filters in the voice paths, one in the uplink path and | |
426 one in the downlink path. Aside from their placement, the two FIR filters are | |
427 identical. Each FIR block has 31 taps (making a 30th order filter), and each of | |
428 the 31 coefficients is a 16-bit fixed-point number. The fixed point format is | |
429 F2.14 aka Q14: to get the real coefficient from the physical 16 bits, treat the | |
430 16-bit datum as a two's complement signed integer, then divide by 16384. | |
431 Examples: 0x4000 means 1, 0x2000 means 0.5, 0xC000 means -1, 0xE000 means -0.5. | |
432 | |
433 In principle you can set all 31 coefficients to whatever you like, but in | |
434 practice only two possible configurations are used: | |
435 | |
436 * When the FIR filter is disabled (identity transform), coefficient 0 is set to | |
437 0x4000 (unity) and all other coefficients are set to 0. In this configuration | |
438 the FIR block does not introduce any extra delay: all delayed samples are | |
439 multiplied by 0 and thus produce no effect. | |
440 | |
441 * When some non-identity frequency response transformation is desired, a linear | |
442 phase filter is set up: coefficient #15 becomes the main tap (significantly | |
443 greater in absolute value than all others) and all other coefficients mirror | |
444 around it symmetrically: #0 equals #30, #1 equals #29 and so forth, until #14 | |
445 equals #16. This filter adds 1.875 ms of delay (15 sample times) to the voice | |
446 path in which it is active, and an equal amount of "pre-ringing". | |
447 | |
448 The presumed purpose of these two FIR filters (uplink and downlink) is to | |
449 flatten the frequency response of the speaker and microphone transducers, or | |
450 perhaps even more ambitiously, the frequency response of the modeled acoustic | |
451 environment. However, actually coming up with a good set of FIR filter | |
452 coefficients given a desired frequency response is a hard problem, one where | |
453 forward engineering is much more difficult than reverse. | |
454 | |
455 When it comes to reverse engineering of existing Calypso DSP FIR filters, a | |
456 total of 7 specimen have been captured out in the wild so far: one downlink FIR | |
457 filter from Openmoko's non-functional para0.cfg (no way of knowing which speaker | |
458 it was once designed for), and a set of 6 filters extracted from Pirelli DP-L10, | |
459 3 uplink and 3 downlink, corresponding to the 3 audio routing modes supported on | |
460 this phone model (handheld, hands-free and wired headset). All 7 are linear | |
461 phase filters as described above. Analyzing the frequency response of a given | |
462 already existing FIR filter is easy: just use the fir2freq program in our | |
463 freecalypso-reveng Hg repository. OTOH, coming up with a new set of FIR filter | |
464 coefficients for some desired frequency response (e.g., for a new phone handset | |
465 being designed) is a much harder problem, one which we will probably have to | |
466 outsource to a hired DSP/FIR expert. | |
467 | |
468 Calypso FIR support in FC host tools | |
469 ------------------------------------ | |
470 | |
471 Uplink and downlink FIR filter coefficients can be included in the input to | |
472 tiaud-compile. Each coefficient is given as the actual 16-bit word going into | |
473 the DSP (Q14 scaling included), and can be specified either in hex or as a | |
474 signed decimal integer. | |
475 | |
476 We also have a dedicated ASCII file format for a FIR filter coefficient set by | |
477 itself, like this example: | |
478 | |
479 fir-coeff-table | |
480 | |
481 0x0178 0x0AB5 0xF43D 0xFED5 0xFCA7 0x04D8 0x00B8 0x0371 | |
482 0x032F 0x0007 0x151C 0xF24C 0x19A6 0xE918 0xF7CD 0x7D0C | |
483 0xF7CD 0xE918 0x19A6 0xF24C 0x151C 0x0007 0x032F 0x0371 | |
484 0x00B8 0x04D8 0xFCA7 0xFED5 0xF43D 0x0AB5 0x0178 | |
485 | |
486 (This example is the FIR filter extracted from Openmoko's non-functional | |
487 para0.cfg.) This by-itself FIR filter coeff set format is accepted as input to | |
488 the auw-fir command in fc-tmsh (allowing experimental FIR filters to be uploaded | |
489 to a running Calypso device for testing) and to our fir2freq analysis program. | |
490 We will probably use the same format if and when we embark on a venture to | |
491 design our own FIR filters for our own handset hardware. | |
492 | |
271 fc-tmsync aur and aur-all addition | 493 fc-tmsync aur and aur-all addition |
272 ================================== | 494 ================================== |
273 | 495 |
274 New addition as of fc-host-tools-r16: our aur command which natively resides in | 496 New addition as of fc-host-tools-r16: our aur command which natively resides in |
275 fc-tmsh (audio mode full access read operation via ETM) has also been | 497 fc-tmsh (audio mode full access read operation via ETM) has also been |