A draft of the TIB is included with the CELP software release in celp_3.2a/doc/celp.tib.sea.hqx for the Macintosh in a self-extracting archive in BinHex format. This archive contains Microsoft's Word 5.1a documents and Deneba's Canvas 3.0.4 drawings. A PC approximation of this draft, celp-tib.zip, is available here for downloading. I hope it encourages you to obtain the final and official TIB as described above.Joe Campbell May 23, 1991 (Revised April 2, 1999) Some of the following changes are incorporated in CELP 3.3b (note: refer to the CELP 3.2 release for speech I/O test files and a fast PC to quantized LSP converter). 1) Rather than "1alt)", completely rewrite cgain for an autocorrelation domain search. Refer to the papers by Trancoso*, et al. and Xydeas, et al. Or, rewrite cgain using a matrix transform of the code book. J-P. Adoul of the University of Sherbrook, R. Salami of University of Southhampton, and J. Baras+ of University of Maryland are researching transformations of our code book into a space that allows rapid search. >>These have the potential for a major computational savings!<< * I. Trancoso and B. Atal (1990), Efficient Search Procedures for Selecting the Optimum Innovation in Stochastic Coders. IEEE Trans. ASSP 38, 385-396. + Y. Kao and J. Baras (1993), A Deterministic Codebook Structure for CELP Speech Coding. Proc IEEE Int Conf on Information Theory. W. B. Kleijn, D. J. Krasinski, and R. H. Ketchum (1990), "Fast Methods for the CELP Speech Coding Algorithm." IEEE Trans. ASSP 38, no. 8 (Aug 1990): 1330 - 1342. 1alt) If "1)" is too hard, at least write cgain using a different representation of the code book. In the present version, each code book sample in the convolution and energy computations is tested for -1, 0, or +1. This is silly because we know a prioi what the values are. Perhaps, the ternary code book should be represented by the new pair of ternary samples in each codeword and the impulse response and its shift accessed by pointers. 2) Integrate Wolovitz's fast PCtoLSP into our coder to replace both of our pctolsp2.f and lsp34.f routines. (This is complete in our C code.) 3) Rewrite PGain and PSearch to eliminate the divide by using a cross multiply. (Note that if independent gain and index selection are done, it's not necessary to calculate the actual gain.). Unfortunately, the submultiple delay testing complicates this. I suggest keeping arrays of numerators (squared correlations) and denominators (energies) to use in the cross multiplies for the submultiples. 4) For modified excitation, optimum stochastic codeword selection, regardless of gain (i.e., open loop gain) makes sense. The stochastic code book search could be reprogrammed to exploit this by replacing division in the search with cross multiplication. This will outweigh the added computation imposed by the modified excitation calculations. 5) The pole filter "polefilt" is usually called for 10th order and its general order slows it down considerably (because the 'C30 can't do nested repeat blocks). Therefore, I propose a 10th order only version "pole10" that unrolls the inner loop (by 10) and uses a repeat block for the outer loop. (Note: This may be unnecessary if SPOX filters are fast.) 6) Code the LSPs to ensure a minimum spacing (e.g., 40 Hz). 7) Fix a bug in the adaptive code book search (ask Tina)? Small Improvements ------------------ A) If using a TI TLC32044 codec, or equivalent, remove the high pass filter in celp.F and use the codec's HPF instead. Beware of a few factors when using the '44 codec. There have been problems with dc bias, noise, 60 Hz notching (this reduces the quality of particular DAM test males). B) Limit the delta delay search so that maximum search range is 32 integer delta delays, even though they can be coded (this only occurs for long delays in the previous subframe). C) Replace autohf with a simple Durbin's recursion since we're not using high frequency correction (i.e., lambda=0). (This is available in the alternate code directory from DSP Software Engineering.) D) Try "faster" autocorrelation techniques than the direct multiplication method used in cor.f, for example Blakenship's method on p. 162, Eq. A2 of Rabiner and Schafer's Digital Processing of Speech Signals. E) Don't keep Sungraph buffers. For example, in both code book searches, we save the entire gain and match score arrays. All we care about (except for submultiple pitch delay testing) is choosing the largest match score, so we only need to save the current winner instead of the entire array. F) Remove the redundant bandwidth expansion call (bwexp). The same filter coefficients are expanded by 0.8 twice (once for psearch and again for cbsearch)! Also, rewrite bwexp.f to use a carry around scalar instead of raising the expansion factor to the loop index power. G) Reprogram delay.f so that when k=6 the buffer is copied directly instead of multiplied by the window 0,0,0,1,0,0,0. H) Similar to 4, replace many of the conversion routines with more efficient ones (e.g., PCtoRC and RCtoPC). Refer to LPC-10e, but beware of different predictor coefficient conventions. I) Remove obsolete references and calculations. For example, the variable "TWOERROR" is left over from a double error detecting code. As another example, in intsynth.f we are currently not using: predgain real o prediction predgain delta real o delta from last frame pred. predgain avg real o average predition predgain mini real o minimum lsp separation There are probably other cases of this in the code. J) Memory requirements could be reduced by eliminating the pitch submultiple table and calculating it on the fly (see pdelay.f). Investigations -------------- a) Investigate end-point corrections for noninteger pitch delays. >>This has the potential for a major computational savings!<< (Note: I highly recommend using noninteger delays at the expense of fewer codewords in the stochastic code book search.) b) Reinvestigate a postfilter without square roots (e.g., absolute value). c) Improve resolution of smoothers. At present, they are either ON or OFF. As suggested in the code comments, the smoothers could employ varying degrees of smoothing as a function of the estimated error rate. d) Reinvestigate use of joint pitch gain and index selection. The present code supports both. Independent selection is used and joint is commented out. Note that joint selection would change "3)". (I don't understand how independent selection could work as well as joint selection, however, my small listening test favored independent selection for the pitch search.) e) For floating point DSP's, investigate use of our clip.f detector to squelch the receiver. f) Implement within-frame delayed-decision coding of both code book searches for both gains and indicies. For example, if we pruned to a branching factor of 2 most promising ACB and SCB indicies and gains at each frame, we'd have: (view this in fixed width, e.g., courier font) subframe 1 subframe 2 subframe 3 subframe 4 C141 C131 /--------- /------------- < C121 | /-------------< C142 | | C231 /--------- | \--------------< C110 | -------------< C143 | C132 /--------- | /--------------< | C221 | \-------------< C144 | C232 /--------- \--------------< C145 C133 /--------- /------------- < C122 | /-------------< C146 | | C233 /--------- | \--------------< C210 | -------------< C147 | C134 /--------- | /--------------< | C222 | \-------------< C148 | C234 /--------- \--------------< where Cijk is the ith scoring choice of ACB and SCB indicies and gains in the jth subframe given parent k (numbered sequentially down the subframe columns). Of course our current FS-1016 software does the equivalent of the top branch decisions {C110, C121, C131, C141} despite the possibility of another branch having a better accumulated match score. Unfortunately, even for this modest branching factor of 2, the computation has gone from 4 to 22 searches of the ACB and SCB. Integerization (no worry for 'C30) ---------------------------------- Beware of large dynamic range (10^10) of the match score in the code book searches. Our final FS-1016 CELP paper ---------------------------- Campbell, J. P., Jr., T. E. Tremain, and V. C. Welch. "The Federal Standard 1016 4800 bps CELP Voice Coder." Digital Signal Processing 1, no. 3 (1991): 145 - 155. (This journal is published by Academic Press.) Or, in Refer Export format: %0 Journal Article %A Campbell, J. P., Jr. %A Tremain, T. E. %A Welch, V. C. %D 1991 %T The Federal Standard 1016 4800 bps CELP Voice Coder %B Digital Signal Processing %V 1 %N 3 %P 145 - 155 %O Academic Press You may also find the Federal Standard and the Technical Information Bulletin (that includes a block diagram of the CELP 3.2 software) very helpful. The Technical Information Bulletin (TIB), is: "Details to Assist in Implementation of Federal Standard 1016 CELP." The official standard is: "Federal Standard 1016, Telecommunications: Analog to Digital Conversion of Radio Voice by 4,800 bit/second Code Excited Linear Prediction (CELP)." These documents are available to the public through the National Technical Information Service and to the US DoD through DTIC: NTIS U.S. Department of Commerce 5285 Port Royal Road, Springfield, VA 22161 USA The "AD" ordering number for the CELP software is AD M000 118 (US$ 90.00) and for the TIB it's AD A256 629 (US$ 17.50). The LPC-10 standard, described below, is FIPS Pub 137 (US$ 12.50). There is a $3.00 shipping charge on all U.S. orders. The telephone number for their automated system is 703-487-4650, or 703-487-4600 if you'd prefer to talk with a real person. U.S. DoD personnel and contractors can receive the package from the Defense Technical Information Center: DTIC, Building 5, Cameron Station, Alexandria, VA 22304-6145. Their telephone number is 703-274-7633.
This page is dedicated to the fond memory of Tom Tremain.