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)
Platforms
Availability
| Platforms |
| Arm ® Devices Armv9-A || Armv7-A || Armv7-M / Armv8-A / 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 | Available | 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 | ||
| Windows .DLL | Available | Available | Available |
ADT G.729 is available on the above Platforms: Other configurations are available upon request.
Features
- 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
Description
G.729 Voice Codec Software
Adaptive Digital Technologies’ G.729 Voice Codec Software is a high-performance implementation of the ITU-T G.729 recommendation, delivering efficient voice compression for bandwidth-sensitive communication systems. Designed for VoIP, wireless communications, multimedia platforms, and packet-based networks, the codec provides reliable, toll-quality speech at low bit rates.
G.729 is a family of speech coding standards that compress voice signals at bit rates ranging from 6.4 kbps to 12.4 kbps. The codec operates by receiving 16-bit PCM audio sampled at 8 kHz, compressing the speech into a compact encoded bitstream for transmission across digital communication networks. At the receiving end, the decoder reconstructs the audio and outputs 16-bit PCM speech at the original 8 kHz sampling rate. Because G.729 uses advanced lossy compression techniques, the reconstructed speech closely resembles the original audio while significantly reducing bandwidth requirements.
Adaptive Digital’s G.729AB implementation is highly optimized and fully compliant with ITU-T G.729 Annex A and Annex B specifications. The codec delivers excellent voice quality at just 8 kbps, making it an ideal choice for applications where bandwidth efficiency and voice clarity are critical.
To maximize network efficiency, G.729AB incorporates several advanced features:
- Voice Activity Detection (VAD) to identify active speech periods.
- Discontinuous Transmission (DTX) to reduce transmission during silence.
- Comfort Noise Generation (CNG) to create natural background audio during inactive periods.
- Packet Loss Concealment (PLC) to minimize the impact of lost or corrupted packets and maintain call quality even in challenging network conditions.
The decoder can detect frame erasures or corrupted data streams and intelligently conceal missing audio information. This Packet Loss Concealment capability helps ensure smooth, intelligible conversations and can significantly reduce perceived degradation during packet loss events.
Key Benefits
- ITU-T G.729, Annex A, and Annex B compliant
- Toll-quality voice at low bit rates
- Optimized for VoIP and packet-based communication systems
- Reduced bandwidth consumption through VAD, DTX, and CNG
- Advanced packet loss concealment for improved voice reliability
- Supports 16-bit PCM audio at 8 kHz sampling
- Ideal for wireless voice, multimedia, voice-over-IP, and voice circuit multiplexing applications
Adaptive Digital’s G.729AB codec enables network operators, equipment manufacturers, and application developers to deliver high-quality voice communications while maximizing bandwidth efficiency and overall system performance.
MORE: DECIPHERING THE MANY ANNEXES & APPENDICES of G.729
| 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.1 |
| G.729 / D | Multiple bit rates | 6.4 / 8 | Annex F | 6.4 kbps: 3.6 8 kbps: 3.9 |
| G.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 the table 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.
Specification Tables
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.
ARM Devices
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 Cortex-A53 *Complex version
CPU UTILIZATION & MEMORY REQUIREMENTSAll Memory usage is given in units of byte.
| Function | MIPS | Program Memory | Data Memory | Scratch | Per-Channel | |
| G.729 | Encode | 45.806156* | — | — | 2656 | 2148 |
| Decode | 10.494561* | — | — | 800 | 2200 | |
| Encode/Decode | — | 91K | 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 |
| 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 |
TI Processors
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 |
API Functions
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