modes.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:15k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* Copyright (C) 2002 Jean-Marc Valin 
  2.    File: modes.c
  3.    Describes the different modes of the codec
  4.    Redistribution and use in source and binary forms, with or without
  5.    modification, are permitted provided that the following conditions
  6.    are met:
  7.    
  8.    - Redistributions of source code must retain the above copyright
  9.    notice, this list of conditions and the following disclaimer.
  10.    
  11.    - Redistributions in binary form must reproduce the above copyright
  12.    notice, this list of conditions and the following disclaimer in the
  13.    documentation and/or other materials provided with the distribution.
  14.    
  15.    - Neither the name of the Xiph.org Foundation nor the names of its
  16.    contributors may be used to endorse or promote products derived from
  17.    this software without specific prior written permission.
  18.    
  19.    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20.    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21.    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22.    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
  23.    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  24.    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  25.    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  26.    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  27.    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  28.    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  29.    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. */
  31. #ifdef HAVE_CONFIG_H
  32. #include "config.h"
  33. #endif
  34. #include "modes.h"
  35. #include "ltp.h"
  36. #include "quant_lsp.h"
  37. #include "cb_search.h"
  38. #include "sb_celp.h"
  39. #include "nb_celp.h"
  40. #include "vbr.h"
  41. #include "misc.h"
  42. #include <math.h>
  43. #ifndef NULL
  44. #define NULL 0
  45. #endif
  46. #define MAX_IN_SAMPLES 640
  47. const SpeexMode * const speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode, &speex_uwb_mode};
  48. /* Extern declarations for all codebooks we use here */
  49. extern const signed char gain_cdbk_nb[];
  50. extern const signed char gain_cdbk_lbr[];
  51. extern const signed char hexc_table[];
  52. extern const signed char exc_5_256_table[];
  53. extern const signed char exc_5_64_table[];
  54. extern const signed char exc_8_128_table[];
  55. extern const signed char exc_10_32_table[];
  56. extern const signed char exc_10_16_table[];
  57. extern const signed char exc_20_32_table[];
  58. extern const signed char hexc_10_32_table[];
  59. /* Parameters for Long-Term Prediction (LTP)*/
  60. static const ltp_params ltp_params_nb = {
  61.    gain_cdbk_nb,
  62.    7,
  63.    7
  64. };
  65. /* Parameters for Long-Term Prediction (LTP)*/
  66. static const ltp_params ltp_params_vlbr = {
  67.    gain_cdbk_lbr,
  68.    5,
  69.    0
  70. };
  71. /* Parameters for Long-Term Prediction (LTP)*/
  72. static const ltp_params ltp_params_lbr = {
  73.    gain_cdbk_lbr,
  74.    5,
  75.    7
  76. };
  77. /* Parameters for Long-Term Prediction (LTP)*/
  78. static const ltp_params ltp_params_med = {
  79.    gain_cdbk_lbr,
  80.    5,
  81.    7
  82. };
  83. /* Split-VQ innovation parameters for very low bit-rate narrowband */
  84. static const split_cb_params split_cb_nb_vlbr = {
  85.    10,               /*subvect_size*/
  86.    4,               /*nb_subvect*/
  87.    exc_10_16_table, /*shape_cb*/
  88.    4,               /*shape_bits*/
  89.    0,
  90. };
  91. /* Split-VQ innovation parameters for very low bit-rate narrowband */
  92. static const split_cb_params split_cb_nb_ulbr = {
  93.    20,               /*subvect_size*/
  94.    2,               /*nb_subvect*/
  95.    exc_20_32_table, /*shape_cb*/
  96.    5,               /*shape_bits*/
  97.    0,
  98. };
  99. /* Split-VQ innovation parameters for low bit-rate narrowband */
  100. static const split_cb_params split_cb_nb_lbr = {
  101.    10,              /*subvect_size*/
  102.    4,               /*nb_subvect*/
  103.    exc_10_32_table, /*shape_cb*/
  104.    5,               /*shape_bits*/
  105.    0,
  106. };
  107. /* Split-VQ innovation parameters narrowband */
  108. static const split_cb_params split_cb_nb = {
  109.    5,               /*subvect_size*/
  110.    8,               /*nb_subvect*/
  111.    exc_5_64_table, /*shape_cb*/
  112.    6,               /*shape_bits*/
  113.    0,
  114. };
  115. /* Split-VQ innovation parameters narrowband */
  116. static const split_cb_params split_cb_nb_med = {
  117.    8,               /*subvect_size*/
  118.    5,               /*nb_subvect*/
  119.    exc_8_128_table, /*shape_cb*/
  120.    7,               /*shape_bits*/
  121.    0,
  122. };
  123. /* Split-VQ innovation for low-band wideband */
  124. static const split_cb_params split_cb_sb = {
  125.    5,               /*subvect_size*/
  126.    8,              /*nb_subvect*/
  127.    exc_5_256_table,    /*shape_cb*/
  128.    8,               /*shape_bits*/
  129.    0,
  130. };
  131. #ifndef DISABLE_WIDEBAND
  132. /* Split-VQ innovation for high-band wideband */
  133. static const split_cb_params split_cb_high = {
  134.    8,               /*subvect_size*/
  135.    5,               /*nb_subvect*/
  136.    hexc_table,       /*shape_cb*/
  137.    7,               /*shape_bits*/
  138.    1,
  139. };
  140. /* Split-VQ innovation for high-band wideband */
  141. static const split_cb_params split_cb_high_lbr = {
  142.    10,               /*subvect_size*/
  143.    4,               /*nb_subvect*/
  144.    hexc_10_32_table,       /*shape_cb*/
  145.    5,               /*shape_bits*/
  146.    0,
  147. };
  148. #endif
  149. /* 2150 bps "vocoder-like" mode for comfort noise */
  150. static const SpeexSubmode nb_submode1 = {
  151.    0,
  152.    1,
  153.    0,
  154.    0,
  155.    /* LSP quantization */
  156.    lsp_quant_lbr,
  157.    lsp_unquant_lbr,
  158.    /* No pitch quantization */
  159.    forced_pitch_quant,
  160.    forced_pitch_unquant,
  161.    NULL,
  162.    /* No innovation quantization (noise only) */
  163.    noise_codebook_quant,
  164.    noise_codebook_unquant,
  165.    NULL,
  166. #ifdef FIXED_POINT
  167.    22938, 22938, 0, -1,
  168. #else
  169.    .7, .7, 0, -1,
  170. #endif
  171.    43
  172. };
  173. /* 3.95 kbps very low bit-rate mode */
  174. static const SpeexSubmode nb_submode8 = {
  175.    0,
  176.    1,
  177.    0,
  178.    0,
  179.    /*LSP quantization*/
  180.    lsp_quant_lbr,
  181.    lsp_unquant_lbr,
  182.    /*No pitch quantization*/
  183.    forced_pitch_quant,
  184.    forced_pitch_unquant,
  185.    NULL,
  186.    /*Innovation quantization*/
  187.    split_cb_search_shape_sign,
  188.    split_cb_shape_sign_unquant,
  189.    &split_cb_nb_ulbr,
  190. #ifdef FIXED_POINT
  191.    22938, 16384, 11796, 21299,
  192. #else
  193.    0.7, 0.5, .36, .65,
  194. #endif
  195.    79
  196. };
  197. /* 5.95 kbps very low bit-rate mode */
  198. static const SpeexSubmode nb_submode2 = {
  199.    0,
  200.    0,
  201.    0,
  202.    0,
  203.    /*LSP quantization*/
  204.    lsp_quant_lbr,
  205.    lsp_unquant_lbr,
  206.    /*No pitch quantization*/
  207.    pitch_search_3tap,
  208.    pitch_unquant_3tap,
  209.    &ltp_params_vlbr,
  210.    /*Innovation quantization*/
  211.    split_cb_search_shape_sign,
  212.    split_cb_shape_sign_unquant,
  213.    &split_cb_nb_vlbr,
  214. #ifdef FIXED_POINT
  215.    22938, 16384, 11796, 18022,
  216. #else
  217.    0.7, 0.5, .36, .55,
  218. #endif
  219.    119
  220. };
  221. /* 8 kbps low bit-rate mode */
  222. static const SpeexSubmode nb_submode3 = {
  223.    -1,
  224.    0,
  225.    1,
  226.    0,
  227.    /*LSP quantization*/
  228.    lsp_quant_lbr,
  229.    lsp_unquant_lbr,
  230.    /*Pitch quantization*/
  231.    pitch_search_3tap,
  232.    pitch_unquant_3tap,
  233.    &ltp_params_lbr,
  234.    /*Innovation quantization*/
  235.    split_cb_search_shape_sign,
  236.    split_cb_shape_sign_unquant,
  237.    &split_cb_nb_lbr,
  238. #ifdef FIXED_POINT
  239.    22938, 18022, 9830, 14746,
  240. #else
  241.    0.7, 0.55, .30, .45,
  242. #endif
  243.    160
  244. };
  245. /* 11 kbps medium bit-rate mode */
  246. static const SpeexSubmode nb_submode4 = {
  247.    -1,
  248.    0,
  249.    1,
  250.    0,
  251.    /*LSP quantization*/
  252.    lsp_quant_lbr,
  253.    lsp_unquant_lbr,
  254.    /*Pitch quantization*/
  255.    pitch_search_3tap,
  256.    pitch_unquant_3tap,
  257.    &ltp_params_med,
  258.    /*Innovation quantization*/
  259.    split_cb_search_shape_sign,
  260.    split_cb_shape_sign_unquant,
  261.    &split_cb_nb_med,
  262. #ifdef FIXED_POINT
  263.    22938, 20644, 5243, 11469,
  264. #else
  265.    0.7, 0.63, .16, .35,
  266. #endif
  267.    220
  268. };
  269. /* 15 kbps high bit-rate mode */
  270. static const SpeexSubmode nb_submode5 = {
  271.    -1,
  272.    0,
  273.    3,
  274.    0,
  275.    /*LSP quantization*/
  276.    lsp_quant_nb,
  277.    lsp_unquant_nb,
  278.    /*Pitch quantization*/
  279.    pitch_search_3tap,
  280.    pitch_unquant_3tap,
  281.    &ltp_params_nb,
  282.    /*Innovation quantization*/
  283.    split_cb_search_shape_sign,
  284.    split_cb_shape_sign_unquant,
  285.    &split_cb_nb,
  286. #ifdef FIXED_POINT
  287.    22938, 21299, 3932, 8192,
  288. #else
  289.    0.7, 0.65, .12, .25,
  290. #endif
  291.    300
  292. };
  293. /* 18.2 high bit-rate mode */
  294. static const SpeexSubmode nb_submode6 = {
  295.    -1,
  296.    0,
  297.    3,
  298.    0,
  299.    /*LSP quantization*/
  300.    lsp_quant_nb,
  301.    lsp_unquant_nb,
  302.    /*Pitch quantization*/
  303.    pitch_search_3tap,
  304.    pitch_unquant_3tap,
  305.    &ltp_params_nb,
  306.    /*Innovation quantization*/
  307.    split_cb_search_shape_sign,
  308.    split_cb_shape_sign_unquant,
  309.    &split_cb_sb,
  310. #ifdef FIXED_POINT
  311.    22282, 21299, 2294, 3277,
  312. #else
  313.    0.68, 0.65, .07, .1,
  314. #endif
  315.    364
  316. };
  317. /* 24.6 kbps high bit-rate mode */
  318. static const SpeexSubmode nb_submode7 = {
  319.    -1,
  320.    0,
  321.    3,
  322.    1,
  323.    /*LSP quantization*/
  324.    lsp_quant_nb,
  325.    lsp_unquant_nb,
  326.    /*Pitch quantization*/
  327.    pitch_search_3tap,
  328.    pitch_unquant_3tap,
  329.    &ltp_params_nb,
  330.    /*Innovation quantization*/
  331.    split_cb_search_shape_sign,
  332.    split_cb_shape_sign_unquant,
  333.    &split_cb_nb,
  334. #ifdef FIXED_POINT
  335.    21299, 21299, 0, -1,
  336. #else
  337.    0.65, 0.65, .0, -1,
  338. #endif
  339.    492
  340. };
  341. /* Default mode for narrowband */
  342. static const SpeexNBMode nb_mode = {
  343.    160,    /*frameSize*/
  344.    40,     /*subframeSize*/
  345.    10,     /*lpcSize*/
  346.    17,     /*pitchStart*/
  347.    144,    /*pitchEnd*/
  348. #ifdef FIXED_POINT
  349.    29491, 19661, /* gamma1, gamma2 */
  350. #else
  351.    0.9, 0.6, /* gamma1, gamma2 */
  352. #endif
  353.    .012,   /*lag_factor*/
  354.    1.0002, /*lpc_floor*/
  355. #ifdef EPIC_48K
  356.    0,
  357. #endif
  358.    {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, &nb_submode7,
  359.    &nb_submode8, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
  360.    5,
  361.    {1, 8, 2, 3, 3, 4, 4, 5, 5, 6, 7}
  362. };
  363. /* Default mode for narrowband */
  364. const SpeexMode speex_nb_mode = {
  365.    &nb_mode,
  366.    nb_mode_query,
  367.    "narrowband",
  368.    0,
  369.    4,
  370.    &nb_encoder_init,
  371.    &nb_encoder_destroy,
  372.    &nb_encode,
  373.    &nb_decoder_init,
  374.    &nb_decoder_destroy,
  375.    &nb_decode,
  376.    &nb_encoder_ctl,
  377.    &nb_decoder_ctl,
  378. };
  379. /* Wideband part */
  380. static const SpeexSubmode wb_submode1 = {
  381.    0,
  382.    0,
  383.    1,
  384.    0,
  385.    /*LSP quantization*/
  386.    lsp_quant_high,
  387.    lsp_unquant_high,
  388.    /*Pitch quantization*/
  389.    NULL,
  390.    NULL,
  391.    NULL,
  392.    /*No innovation quantization*/
  393.    NULL,
  394.    NULL,
  395.    NULL,
  396. #ifdef FIXED_POINT
  397.    24576, 24576, 0, -1,
  398. #else
  399.    .75, .75, .0, -1,
  400. #endif
  401.    36
  402. };
  403. static const SpeexSubmode wb_submode2 = {
  404.    0,
  405.    0,
  406.    1,
  407.    0,
  408.    /*LSP quantization*/
  409.    lsp_quant_high,
  410.    lsp_unquant_high,
  411.    /*Pitch quantization*/
  412.    NULL,
  413.    NULL,
  414.    NULL,
  415.    /*Innovation quantization*/
  416.    split_cb_search_shape_sign,
  417.    split_cb_shape_sign_unquant,
  418. #ifdef DISABLE_WIDEBAND
  419.    NULL,
  420. #else
  421.    &split_cb_high_lbr,
  422. #endif
  423. #ifdef FIXED_POINT
  424.    27853, 19661, 8192, -1,
  425. #else
  426.    .85, .6, .25, -1,
  427. #endif
  428.    112
  429. };
  430. static const SpeexSubmode wb_submode3 = {
  431.    0,
  432.    0,
  433.    1,
  434.    0,
  435.    /*LSP quantization*/
  436.    lsp_quant_high,
  437.    lsp_unquant_high,
  438.    /*Pitch quantization*/
  439.    NULL,
  440.    NULL,
  441.    NULL,
  442.    /*Innovation quantization*/
  443.    split_cb_search_shape_sign,
  444.    split_cb_shape_sign_unquant,
  445. #ifdef DISABLE_WIDEBAND
  446.    NULL,
  447. #else
  448.    &split_cb_high,
  449. #endif
  450. #ifdef FIXED_POINT
  451.    24576, 22938, 1638, -1,
  452. #else
  453.    .75, .7, .05, -1,
  454. #endif
  455.    192
  456. };
  457. static const SpeexSubmode wb_submode4 = {
  458.    0,
  459.    0,
  460.    1,
  461.    1,
  462.    /*LSP quantization*/
  463.    lsp_quant_high,
  464.    lsp_unquant_high,
  465.    /*Pitch quantization*/
  466.    NULL,
  467.    NULL,
  468.    NULL,
  469.    /*Innovation quantization*/
  470.    split_cb_search_shape_sign,
  471.    split_cb_shape_sign_unquant,
  472. #ifdef DISABLE_WIDEBAND
  473.    NULL,
  474. #else
  475.    &split_cb_high,
  476. #endif
  477. #ifdef FIXED_POINT
  478.    24576, 24576, 0, -1,
  479. #else
  480.    .75, .75, .0, -1,
  481. #endif
  482.    352
  483. };
  484. /* Split-band wideband CELP mode*/
  485. static const SpeexSBMode sb_wb_mode = {
  486.    &speex_nb_mode,
  487.    160,    /*frameSize*/
  488.    40,     /*subframeSize*/
  489.    8,     /*lpcSize*/
  490.    640,    /*bufSize*/
  491. #ifdef FIXED_POINT
  492.    29491, 19661, /* gamma1, gamma2 */
  493. #else
  494.    0.9, 0.6, /* gamma1, gamma2 */
  495. #endif
  496.    .001,   /*lag_factor*/
  497.    1.0001, /*lpc_floor*/
  498.    0.9,
  499.    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL},
  500.    3,
  501.    {1, 8, 2, 3, 4, 5, 5, 6, 6, 7, 7},
  502.    {1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4},
  503.    vbr_hb_thresh,
  504.    5
  505. };
  506. const SpeexMode speex_wb_mode = {
  507.    &sb_wb_mode,
  508.    wb_mode_query,
  509.    "wideband (sub-band CELP)",
  510.    1,
  511.    4,
  512.    &sb_encoder_init,
  513.    &sb_encoder_destroy,
  514.    &sb_encode,
  515.    &sb_decoder_init,
  516.    &sb_decoder_destroy,
  517.    &sb_decode,
  518.    &sb_encoder_ctl,
  519.    &sb_decoder_ctl,
  520. };
  521. /* "Ultra-wideband" mode stuff */
  522. /* Split-band "ultra-wideband" (32 kbps) CELP mode*/
  523. static const SpeexSBMode sb_uwb_mode = {
  524.    &speex_wb_mode,
  525.    320,    /*frameSize*/
  526.    80,     /*subframeSize*/
  527.    8,     /*lpcSize*/
  528.    1280,    /*bufSize*/
  529. #ifdef FIXED_POINT
  530.    29491, 19661, /* gamma1, gamma2 */
  531. #else
  532.    0.9, 0.6, /* gamma1, gamma2 */
  533. #endif
  534.    .002,   /*lag_factor*/
  535.    1.0001, /*lpc_floor*/
  536.    0.7,
  537.    {NULL, &wb_submode1, NULL, NULL, NULL, NULL, NULL, NULL},
  538.    1,
  539.    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
  540.    {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  541.    vbr_uhb_thresh,
  542.    2
  543. };
  544. const SpeexMode speex_uwb_mode = {
  545.    &sb_uwb_mode,
  546.    wb_mode_query,
  547.    "ultra-wideband (sub-band CELP)",
  548.    2,
  549.    4,
  550.    &sb_encoder_init,
  551.    &sb_encoder_destroy,
  552.    &sb_encode,
  553.    &sb_decoder_init,
  554.    &sb_decoder_destroy,
  555.    &sb_decode,
  556.    &sb_encoder_ctl,
  557.    &sb_decoder_ctl,
  558. };
  559. #ifdef EPIC_48K
  560. extern const signed char gain_cdbk_ulbr[];
  561. extern const signed char exc_12_32_table[];
  562. /* Parameters for Long-Term Prediction (LTP)*/
  563. static const ltp_params ltp_params_48k = {
  564.    gain_cdbk_ulbr,
  565.    3,
  566.    0
  567. };
  568. static const split_cb_params split_cb_nb_48k = {
  569.    12,               /*subvect_size*/
  570.    4,               /*nb_subvect*/
  571.    exc_12_32_table, /*shape_cb*/
  572.    5,               /*shape_bits*/
  573.    0,
  574. };
  575. /* 4.8 kbps very low bit-rate mode */
  576. static const SpeexSubmode nb_48k_submode = {
  577.    0,
  578.    0,
  579.    0,
  580.    0,
  581.    /*LSP quantization*/
  582.    lsp_quant_48k,
  583.    lsp_unquant_48k,
  584.    /*No pitch quantization*/
  585.    pitch_search_3tap,
  586.    pitch_unquant_3tap,
  587.    &ltp_params_48k,
  588.    /*Innovation quantization*/
  589.    split_cb_search_shape_sign,
  590.    split_cb_shape_sign_unquant,
  591.    &split_cb_nb_48k,
  592. #ifdef FIXED_POINT
  593.    22938, 16384, 11796, 18022,
  594. #else
  595.    0.7, 0.5, .36, .55,
  596. #endif
  597.    144
  598. };
  599. /* Special, non-standard 4.8 kbps mode */
  600. static const SpeexNBMode nb_48k_mode = {
  601.    240,    /*frameSize*/
  602.    48,     /*subframeSize*/
  603.    10,     /*lpcSize*/
  604.    640,    /*bufSize*/
  605.    17,     /*pitchStart*/
  606.    144,    /*pitchEnd*/
  607.    0.9,    /*gamma1*/
  608.    0.6,    /*gamma2*/
  609.    .01,   /*lag_factor*/
  610.    1.0003, /*lpc_floor*/
  611.    1,
  612.    {NULL, NULL, &nb_48k_submode, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
  613.    2,
  614.    {2,2,2,2,2,2,2,2,2,2,2}
  615. };
  616. /* Default mode for narrowband */
  617. const SpeexMode speex_nb_48k_mode = {
  618.    &nb_48k_mode,
  619.    nb_mode_query,
  620.    "narrowband 4.8 kbps",
  621.    1000,
  622.    4,
  623.    &nb_encoder_init,
  624.    &nb_encoder_destroy,
  625.    &nb_encode,
  626.    &nb_decoder_init,
  627.    &nb_decoder_destroy,
  628.    &nb_decode,
  629.    &nb_encoder_ctl,
  630.    &nb_decoder_ctl,
  631. };
  632. #endif
  633. int speex_mode_query(const SpeexMode *mode, int request, void *ptr)
  634. {
  635.    return mode->query(mode->mode, request, ptr);
  636. }
  637. const SpeexMode * speex_lib_get_mode (int mode)
  638. {
  639. #ifdef EPIC_48K
  640.   if (mode == SPEEX_MODEID_NB_48K) return &speex_nb_48k_mode;
  641. #endif
  642.   if (mode < 0 || mode > SPEEX_NB_MODES) return NULL;
  643.   return speex_mode_list[mode];
  644. }