G.729 Voice Compression Algorithm
G.729 8 kbit/s CS-ACELP Speech Codec
G.729, G.729A, G.729AB, G.729D – G.729 (ANNEXES AND APPENDICES)
Features List
- Functions are C-callable.
- Multi-channel capable.
- The encoder and decoder meet all ITU G.729 compliance and interoperability requirements.
- Can be integrated with echo cancellers.
- Capable of in-band synchronization.
- Available as part of Adaptive Digital’s G.PAK turnkey DSP software packages
Availability
Platforms |
Arm ® Devices Armv9-A || Armv7-A || Armv7-M / Armv8-M | Legacy Cortex-M3, ARM9E/11 |
Texas Instruments – TI TMS320C7000 C7x, TI TMS320C6000 C64x/C64x+/C66x, C674x, TMS320C5000 C55x / C54x |
Windows DLL x86 |
Linux x86 |
A standard G.729 packet contains 80 bits of compressed data representing a 10 millisecond frame of speech. The 8 kbps rate comes from: 8000 bits/second = 80 bits / 0.01 seconds.
Platform Sampling:
Platform | G.729 | G.729A | G.729B | G.729AB | G.729D | G.729F | G.729I/E |
Arm Cortex-A53 | Available | Available | |||||
ARM Cortex-A8 | Available | Available | Available | Available | Available | Available | Available |
ARM Cortex-A9 | Available | Available | Available | Available | Available | Available | Available |
ARM Cortex-A15 | Available | Available | Available | Available | Available | Available | Available |
ARM Cortex-M3 | Available | Available | |||||
ARM Cortex-M4 | Available | Available | Available | ||||
ARM Cortex-M7 | Available | ||||||
ARM Cortex-M33 | Available | Available | Available | ||||
ARM9E | Available | ||||||
ARM11 | Available | ||||||
TI TMS320C64x+ / C66x | Available | Available | Available | Available | Available | Available | |
TI TMS320C67/674x | Available | Available | Available | Available | Available | Available | Available |
TI TMS320C64x | Available | Available | Available | Available | Available | Available | |
TI TMS320C62x | Available | ||||||
TI TMS320C55x | Available | Available | Available | Available | Available | ||
TI TMS320C54x | Available | Available | Available | Available | Available | ||
Win32 Static** | Available | Available | |||||
Win32 DLL** | Available | Available | Available |
** WINDOWS 32 DLL – CONTACT SALES FOR SPECIFICATIONS
ADT G.729 is available on the above Platforms: Other configurations are available upon request.
Specifications
NOTE: We specify MIPS (Millions of Instructions Per Second) as MCPS (Millions of Instruction Cycles Per Second). Unless otherwise specified, peak MIPS are indicated.
↓ Click on links below to view specification tables.
G.729 Armv9-A Neoverse N2
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of byte.
The ARM Neoverse is a group of 64-bit ARM processor cores.
Annex AB | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729 AB | Encode | 4.68 | — | — | 2656 | 2148 |
Decode | 1.26 | — | — | 800 | 2200 | |
Encode/Decode | 6 | 91 K | 6092 | 3456 | 4348 |
G.729 ARMv8 Cortex-A53
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of byte.
Annex AB | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729 AB | Encode | 12.1 | — | — | 2656 | 2148 |
Decode | 3.2 | — | — | 800 | 2200 | |
Enc/Decode | 15.3 | 91 K | 6092 | 3456 | 4348 |
All Memory usage is given in units of byte.
Annex A | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729 A | Encode | 10.1 | — | — | 2656 | 2148 |
Decode | 2.4 | — | — | 800 | 2200 | |
Enc/Decode | 12.5 | 91 K | 6092 | 3456 | 4348 |
Note: G.729 A, AB arm Cortex-A53 specification numbers measured on ARTIK 710 board (64-bit ARM® Cortex® A-53 processor)
G.729 ARMv7 Cortex-A8/A9/A15
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of byte.
Annex AB/A | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729 AB G.729 A Optimized | Encode | 12.1 | — | — | 2656 | 2148 |
Decode | 3.9 | — | — | 800 | 2200 | |
Enc/Decode | 16 | 86.8 K | 6080 | 3456 | 4348 |
Annex B | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729 B Cortex- A8 | Encode | 80.4 (8kbps) | — | — | — | 3712 |
Decode | 19.0 (8kbps) | — | — | — | 2560 | |
Enc/Decode | 99.4 (8kbps) | 253408 | 7792 | 8192 | 6272 |
Annex H/I | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729 H / I Cortex-A8 | Encode | 80.4 (8kbps) | — | — | — | 3712 |
66.2 (6.4kbps) | ||||||
95.7 (11.8kbps) | ||||||
Decode | 19.0 (8kbps) | — | — | — | 2560 | |
19.8 (6.4kbps) | ||||||
29.9 (11.8kbps) | ||||||
Enc/Decode | 99.4 (8kbps) | 253408 | 7792 | 8192 | 6272 | |
86.0 (6.4kbps) | ||||||
125.6 (11.8kbps) |
Annex D/F | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729 D / F Cortex-A8 | Encode | 80.4 (8kbps) | — | — | — | 3712 |
66.2 (6.4kbps) | ||||||
Decode | 19.0 (8kbps) | — | — | — | 2560 | |
19.8 (6.4kbps) | ||||||
Enc/Decode | 99.4 (8kbps) | 253408 | 7792 | 8192 | 6272 | |
86.0 (6.4kbps) |
Annex E/G | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729 E / G Cortex-A8 | Encode | 80.4 (8kbps) | — | — | — | 3712 |
95.7 (11.8kbps) | ||||||
Decode | 19.0 (8kbps) | — | — | — | 2560 | |
29.9 (11.8kbps) | ||||||
Enc/Decode | 99.4 (8kbps) | 253408 | 7792 | 8192 | 6272 | |
125.6 (11.8kbps) |
G.729 ARM Cortex-M7
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of byte.
G.729 | Function | MIPS Ave | Max | Program Memory | Data Memory | Scratch | Per-Channel |
G.729 Cortex-M7 | Encode | 33.4 | 36.8 | — | — | 4960 | 1960 |
Decode | 6.9 | 7.5 | — | — | 1024 | 1400 | |
Enc/Decode | 40.3 | 44.3 | 49 kbytes | 6100 | 5984 | 3360 |
G.729 ARM Cortex-M33/M35
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of byte.
G.729A | Function | MIPS |
G.729A Cortex-M33 | Encode | 46.7 |
Decode | 8.2 | |
Enc/Decode | 54.9 |
G.729 ARM Cortex-M4
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of byte.
G.729 | Function | MIPS | Program Memory | Data Memory | Per-Channel |
G.729 Cortex-M4 | Encode | 46 | — | — | 2148 |
Decode | 10 | — | — | 2200 | |
Enc/Decode | 56 | 59 kbytes | 10 kbytes | 3.3 kbytes |
Annex AB | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729 AB Cortex-M4 | Encode | 33.5 | — | — | 2656 | 2184 |
Decode | 12.5 | — | — | 800 | 2200 | |
Enc/Decode | 46 | 9970 | 4856 | 3456 | 4384 |
G.729 ARM9E / ARM11
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of byte.
Annex AB/A | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729AB, G.729A | Enc | 27.3 | — | — | 2400 | 2148 |
Dec | 10.9 | — | — | 800 | 2200 | |
Enc/Dec | 38.2 | 142.2k | 6016 | 3200 | 4348 |
G.729 C64x, C64x+ / C66x
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of byte.
Annex AB | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729 AB C64x | Enc | 5.2 | — | — | 2400 | 2148 |
Dec | 1.2 | — | — | 800 | 2200 | |
Enc/Dec | 6.3 | 63k | 6.7k | 3200 | 4344 | |
G.729 AB C64x+ / C66x | Enc | 4.8 | — | — | 2400 | 2148 |
Dec | 1.2 | — | — | 800 | 2200 | |
Enc/Dec | 6 | 57k | 6.7k | 3200 | 4344 |
Annex B/F | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729B / G.729F C64x | Enc | 20.4 | — | — | 8192 | 2388 |
Dec | 4.7 | — | — | 0 | 1568 | |
Enc Dec | 25.7 | 119k | 7.2K | 8192 | 3956 | |
G.729 B / G.729 F C64x + / C66x | Enc | 19.6 | — | — | 8192 | 2388 |
Dec | 5.1 | — | — | 0 | 1568 | |
Enc Dec | 24.7 | 84k | 7.2K | 8192 | 3956 |
Annex E | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729E | Enc | 42 | — | — | — | 3776 |
Dec | 18 | — | — | — | 2560 |
G.729 C674x
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of byte.
Annex I | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729I | Enc | 33 | — | — | — | 3776 |
Dec | 12 | — | — | — | 2560 |
G.729AB – C6x
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of byte.
Annex AB | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729AB C62x/67x | Enc | 5.2 | — | — | 2400 | 2148 |
Dec | 1.3 | — | — | 800 | 2200 |
G.729D C55x
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of 16-bit word.
Annex D | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729D | Enc | 32.2 (8 kbps) | 24780 | 6570 | 4960 | 1980 |
20.5 (6.4 kbps) | ||||||
Dec | 5.9 (8 kbps) | 12607 | 6574 | 1024 | 1416 | |
6.4 (6.4 kbps) | ||||||
G.729D | Enc/Dec | 38.1 (8 kbps) | 28040 | 6630 | 4960 | 3396 |
26.9 (6.4 kbps) |
G.729 C54x
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of 16-bit word.
C54x | Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel |
G.729 | Enc | 18.07 | 2086 | 6191 | 194 | 3100 |
Dec | 3 | 2086 | 2908 | 113 | 3100 | |
G.729 A | Enc | 9.7 | 2162 | 6215 | 194 | 2899 |
Dec | 1.8 | 2162 | 1989 | 113 | 2899 | |
G.729 B | Enc | 18.9 | 4223 | 8571 | 194 | 3401 |
Dec | 3.2 | 4223 | 3552 | 113 | 3401 | |
G.729 AB | Enc | 10 | 4236 | 8567 | 246 | 3200 |
Dec | 2.2 | 4236 | 2625 | 113 | 3200 |
Description
The Adaptive Digital Technologies’ G.729 voice coder software is an implementation of ITU Recommendation
G.729 8 kbit/s CS-ACELP Speech Codec.
G.729 is an umbrella of vocoder standards. The G.729 vocoders perform voice compression at bit rates that vary between 6.4 and 12.4 kbps.
The figure below shows an example of the G.729 vocoder connected to a digital communication channel. The input speech is fed into the G.729 encoder as a stream of16-bit PCM samples, sampled at a rate of 8000 samples/second. The G.729 encoder compresses the data into the Encode Stream. The encoder also outputs the DTX status, which is discussed later in this data sheet.
The digital channel carries the data stream and DTX status to the decoder, which regenerates a representation of the original speech, and outputs it as the output speech – again as 16-bit PCM at a sampling rate of 8000 samples/second. Since G.729 is a uses lossy compression, the output speech is not identical to the input speech.
The decoder is also fed a frame erase flag, which is an indication that the decode stream has temporarily been corrupted. The decoder is able to “smooth over” the output , doing its best to conceal the loss of data and minimize the loss in voice quality. This process is known as packet loss concealment (PLC). It works surprisingly well even under high packet loss rates.
Adaptive Digital’s G.729AB voice compression algorithm is a highly optimized version of the G.729 ITU Annex A and Annex B standard. G.729 AB offers toll quality speech at a reasonably low bit rate of 8Kbps. The G.729 AB codec uses Discontinuous Transmission (DTX), Voice Activity Detection (VAD), and Comfort Noise Generation (CNG) to reduce bandwidth usage. G.729AB is used in wireless voice, voice-over-packet-networks, multimedia, and voice circuit multiplexing applications.
Standard / Annex Description Bit Rate
(kbps)DTX Annex MOS G.729 G.729 main body (original) 8 Annex B 3.9 G.729 /A Lower Complexity G.729 8 Annex B 3.7 G.729 / C G.729 floating point 8 — 3.7 G.729 / C+ Floating Point, with DTX and multiple bit rates 6.4/8/12.4 Annex B 6.4 kbps: 3.6
8 kbps: 3.9
12.4 kbps: 4.1G.729 / D Multiple bit rates 6.4 / 8 Annex F 6.4 kbps: 3.6
8 kbps: 3.9G.729 / E Higher Quality Vocoder 12.4 Annex G 4.2
The first column in the table lists the ITU standard and applicable DTX Annex. The last column in thetable lists the G.729 MOS (Mean Opinion Score) for the various flavors. MOS is a subjective rating given to vocoders. MOS runs a scale from 1 to 5, with 1 being the worst and 5 being the best.
A score of 4 and above is considered to be “toll quality” speech.
Note the column labeled DTX annex. Although the G.729 family of vocoders does an excellent job of compressing speech, it does even better when using Discontinuous Transmission or DTX. DTX is the process by which the encoder determines on a frame-by-frame basis whether there is voice activity or not. If there is no voice activity, the encoder produces either a reduced bit rate (DTX) frame of compressed data representing the background noise characteristics, or it produces no data at all. If the decoder receives a full voice packet, it regenerates speech. If it receives a DTX frame, it generates noise that is representative of the background noise. If it receives no frame at all, it continues to generate background noise according to the specifications from the most recent DTX frame. (If the decoder was expecting a speech frame but received nothing, it will perform its packet loss concealment instead.)
That all said , the DTX annex column in the table above lists the annex letter to the G.729 specification that describes how DTX is to be performed in conjunction with the associated base annex. Let’s take the first row in the table, for example – G.729 (main body). G.729 compresses speech, with a compressed bit rate of 8 kbps. If DTX is be used, it will be specified by G.729 Annex B. When G.729 is combined with it’s Annex B DTX feature, the combined vocoder is often referred to as G.729B. Similarly, when G.729 D is combined with its DTX feature, the combined vocoder is often referred to as G.729D/F.
A standard G.729 packet contains 80 bits of compressed data representing a 10 millisecond frame of speech. The 8 kbps rate comes from: 8000 bits/second = 80 bits / 0.01 seconds. A G.729 Annex B DTX packet contains 16 bits, resulting in a bit rate of 1600 bps. Of course, a real conversation will not operate at 1600 bps unless there is only background noise present. The actual bit rate when using DTX lies somewhere between 1600 bps and 8000 bps. Typically, DTX can save approximately half the channel bandwidth on average. This comes about because telephone calls tend to be half-duplex. Only one person speaks at a time. You could argue therefore that, on average, each person speaks less than half the time.
The other DTX annexes (F and G), offer similar bandwidth savings when combined with their respective base annexes (D and E).
There are a few more annexes of interest. Annex H is a reference implementation of switching between annexes D and E. Annex I is a reference implementation that integrates the G.729 main body with annexes B, D, and E. Annex J is G.729’s answer to audio coding. G.729J increases the audio bandwidth from 3.3 kHz to 7 kHz. Annex J is a variable bit rate codec with bit rates between 8 and 32 kbps. Annex J has been published as a separate standard – G.729.1.
Let’s get back to the G.729 appendices. Appendix 1 discusses the external reset performance for G.729 codecs in systems that use an external DTX.
Appendices 2 and 3 are workarounds that have been devised to eradicate a deficiency that has been identified in the Annex B voice activity detector.
In the VoIP space, which is our primary interest, G.729 (main body) has been deemed by most designers to be too complex. In nuts and bolts terms, that means that it requires lots of DSP horsepower and hence reduces the number of channels of the vocoder that can be run on a given DSP. But people do like the voice quality / bit rate combination afforded by G.729 (main body). As a result, many users opt for G.729A, which yields almost the same voice quality as G.729 at the same bit rate of 8 kbps, but at around half the complexity. Many users also opt for the DTX, making G.729AB the most popular.
G.729E requires more bandwidth (12.4 kbps) than G.729A (8 kbps) or G.729D (6.4 kbps), but G.729E offers somewhat better voice quality than G.729A (4.2 vs. 3.7) and significantly better quality when passing music-on-hold. G.729E by no means compares with audio or music codecs. After all, G.729E starts with a sampling rate if 8 kHz and is therefore restricted to the telecom bandwidth of 300-3300 Hz, which is nowhere what is necessary for high fidelity (or medium fidelity) music. But, G.729/A and G.729D are absolutely lousy when it comes to music-on-hold.
Low bit rate vocoders look at their input signals and try to model them using a human vocal tract model. That model limits the tools available to the vocoder. So if the input signal is speech, the low bit rate vocoder does a reasonably good job at modeling and therefore compressing the speech without losing too much fidelity. By increasing the bit rate to 12.4 kbps and by adding tools, G.729E performs better than its lower bit rate counterparts while maintaining its voice tools. But it is no substitute to audio and music codecs.
Another aspect to G.729 that is of interest is its ability (or lack thereof) to pass DTMF signals and modem signals reliably. In the case of DTMF signals, G.729 can pass the tones to some extent, and under the right conditions a DTMF detector can detect the resulting synthesized tones. But “under the right conditions” is usually not good enough for telecom systems. Telecom systems are expected to be able to pass DTMF tones that can be detected reliably under a wide range of specified conditions, some of which are not so good. In order to achieve reliable DTMF handling when using a low bit rate vocoder such as G.729, it is necessary to employ a tone relay function.
Function APIs
API function call summary
G729_ADT_encodeInit(. . .) Initializes the G.729 encoder software
G729_ADT_decodeInit(. . .) Initializes the G.729 encoder software
G729_ADT_encode(. . .) Executes the G.729 encoder
G729_ADT_decode(. . .) Executes the G.729 decoder
G729_ADT_Annex_(A. . .I)_encoderInit(. . .) Initializes the G.729 (A. . .I)_ encoder software
G729_ADT_Annex_(A. . .I)_decoderInit(. . .) Initializes the G.729 (A. . .I)_ encoder software
G729_ADT_Annex_(A. . .I)_encode(. . .) Executes the G.729 (A. . .I)_ encoder
G729_ADT_Annex_(A. . .I)_decode(. . .) Executes the G.729 (A. . .I)_ decoder