DSP Group Truespeech

From MultimediaWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

This is the codec developed by DSP Group. It operates on 8000 Hz, 16-bit mono PCM and have some fixed bitrates, Windows version supports 15:1 compression (~1 Kbps) only.

This codec employs LPC (Linear Predictive Coding) as almost every speech codec does.

Bitstream format

Frame (240 samples) is divided into 4 subframes.

Packed frame data holds 8-order filter used in synthesis, 4x7 pulse positions and values, offset in previously decoded frame.

All data is stored in 32-bit little-endian words and bits are read from the LSB.

Frame format

 // 1st word
 1 bit - previous filter selection mode
 the rest are 8 filter coefficients with the next bit allocation: 5, 5, 4, 4, 4, 3, 3, 3
 
 // 2nd word
 4x7 bits - offset2 values 0-3
 4 bits - high 4 bits of offset1[0]
 
 // 3d word
 2x14 bits - pulse values 0 and 1
 4 bits - low 4 bits of offset1[1]
 
 // 4th word
 2x14 bits - pulse values 2 and 3
 4 bits - high 4 bits of offset1[1]
 
 // 5th word
 4 bits - pulse offset 0
 27 bits - pulse position 0
 1 bit - offset1[0] bit 0
 
 // 6th word
 4 bits - pulse offset 1
 27 bits - pulse position 1
 1 bit - offset1[0] bit 1
 
 // 7th word
 4 bits - pulse offset 2
 27 bits - pulse position 2
 1 bit - offset1[0] bit 2
 
 // 8th word
 4 bits - pulse offset 3
 27 bits - pulse position 3
 1 bit - offset1[0] bit 3

previous filter selection mode flag - when set to one, first subframe uses filter average 2/3*prev_filt[] + 1/3*cur_filt[] and 1/3*prev_filt[]+2/3*cur_filt[] for the second subframe, otherwise previous filter coefficients are used for both; the third and fourth subframes always use current filter.

Technical details (for standard scheme)

Decoding flow:

 unpack frame data
 reconstruct packed filter
 merge this filter with previous to create 4 filters for each subframe
 for each subframe {
   apply twopoint filter on some saved data
   place pulses (7 pulses for each subframe max)
   update saved filter
   apply main filter to subframe data (mostly pulses)
 }