gainquant.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /******************************************************************
  2. iLBC Speech Coder ANSI-C Source Code
  3. gainquant.c
  4. Copyright (c) 2001,
  5. Global IP Sound AB.
  6. All rights reserved.
  7. ******************************************************************/
  8. #include <string.h>
  9. #include <math.h>
  10. #include "constants.h"
  11. #include "filter.h"
  12. #include "gainquant.h"
  13. /*----------------------------------------------------------------*
  14. * quantizer for the gain in the gain-shape coding of residual
  15. *---------------------------------------------------------------*/
  16. float gainquant(/* (o) quantized gain value */
  17. float in, /* (i) gain value */
  18. float maxIn,/* (i) maximum of gain value */
  19. int cblen, /* (i) number of quantization indices */
  20. int *index /* (o) quantization index */
  21. ){
  22. int i, tindex;
  23. float minmeasure,measure, *cb, scale;
  24. /* ensure a lower bound on the scaling factor */
  25. scale=maxIn;
  26. if (scale<0.1) {
  27. scale=(float)0.1;
  28. }
  29. /* select the quantization table */
  30. if (cblen == 8) {
  31. cb = gain_sq3Tbl;
  32. } else if (cblen == 16) {
  33. cb = gain_sq4Tbl;
  34. } else {
  35. cb = gain_sq5Tbl;
  36. }
  37. /* select the best index in the quantization table */
  38. minmeasure=10000000.0;
  39. tindex=0;
  40. for (i=0;i<cblen;i++) {
  41. measure=(in-scale*cb[i])*(in-scale*cb[i]);
  42. if (measure<minmeasure) {
  43. tindex=i;
  44. minmeasure=measure;
  45. }
  46. }
  47. *index=tindex;
  48. /* return the quantized value */
  49. return scale*cb[tindex];
  50. }
  51. /*----------------------------------------------------------------*
  52. * decoder for quantized gains in the gain-shape coding of
  53. * residual
  54. *---------------------------------------------------------------*/
  55. float gaindequant( /* (o) quantized gain value */
  56. int index, /* (i) quantization index */
  57. float maxIn,/* (i) maximum of unquantized gain */
  58. int cblen /* (i) number of quantization indices */
  59. ){
  60. float scale;
  61. /* obtain correct scale factor */
  62. scale=(float)fabs(maxIn);
  63. if (scale<0.1) {
  64. scale=(float)0.1;
  65. }
  66. /* select the quantization table and return the decoded value */
  67. if (cblen==8) {
  68. return scale*gain_sq3Tbl[index];
  69. } else if (cblen==16) {
  70. return scale*gain_sq4Tbl[index];
  71. }
  72. else if (cblen==32) {
  73. return scale*gain_sq5Tbl[index];
  74. }
  75. return 0.0;
  76. }