RFC3951 日本語訳

3951 Internet Low Bit Rate Codec (iLBC). S. Andersen, A. Duric, H.Astrom, R. Hagen, W. Kleijn, J. Linden. December 2004. (Format: TXT=373442 bytes) (Status: EXPERIMENTAL)
プログラムでの自動翻訳です。
RFC一覧
英語原文

Network Working Group                                        S. Andersen
Request for Comments: 3951                            Aalborg University
Category: Experimental                                          A. Duric
                                                                   Telio
                                                               H. Astrom
                                                                R. Hagen
                                                               W. Kleijn
                                                               J. Linden
                                                         Global IP Sound
                                                           December 2004

コメントを求めるワーキンググループS.アンダーセン要求をネットワークでつないでください: 3951年のオールボア大学カテゴリ: 健全なIP2004年12月にグローバルな実験的なA.のR.ハーゲンW.Kleijn J.Duric Telio H.Astromリンデン

                   Internet Low Bit Rate Codec (iLBC)

インターネットの低いビット伝送速度コーデック(iLBC)

Status of this Memo

このMemoの状態

   This memo defines an Experimental Protocol for the Internet
   community.  It does not specify an Internet standard of any kind.
   Discussion and suggestions for improvement are requested.
   Distribution of this memo is unlimited.

このメモはインターネットコミュニティのためにExperimentalプロトコルを定義します。 それはどんな種類のインターネット標準も指定しません。 議論と改善提案は要求されています。 このメモの分配は無制限です。

Copyright Notice

版権情報

   Copyright (C) The Internet Society (2004).

Copyright(C)インターネット協会(2004)。

Abstract

要約

   This document specifies a speech codec suitable for robust voice
   communication over IP.  The codec is developed by Global IP Sound
   (GIPS).  It is designed for narrow band speech and results in a
   payload bit rate of 13.33 kbit/s for 30 ms frames and 15.20 kbit/s
   for 20 ms frames.  The codec enables graceful speech quality
   degradation in the case of lost frames, which occurs in connection
   with lost or delayed IP packets.

このドキュメントはIPの上で強健な声のコミュニケーションに適したスピーチコーデックを指定します。 コーデックはGlobal IP Sound(GIPS)によって開発されます。 それは30個のmsフレームへの13.33kbit/sと20個のmsフレームへの15.20kbit/sのペイロードビット伝送速度における狭周波数帯スピーチと結果のために設計されています。 コーデックは無くなっているフレームの場合で優雅なスピーチ品質劣化を可能にします。(それは、無くなっているか遅れたIPパケットに関して現れます)。

Andersen, et al.              Experimental                      [Page 1]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[1ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

Table of Contents

目次

   1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  4
   2.  Outline of the Codec . . . . . . . . . . . . . . . . . . . . .  5
       2.1.  Encoder. . . . . . . . . . . . . . . . . . . . . . . . .  5
       2.2.  Decoder. . . . . . . . . . . . . . . . . . . . . . . . .  7
   3.  Encoder Principles . . . . . . . . . . . . . . . . . . . . . .  7
       3.1.  Pre-processing . . . . . . . . . . . . . . . . . . . . .  9
       3.2.  LPC Analysis and Quantization. . . . . . . . . . . . . .  9
             3.2.1.  Computation of Autocorrelation Coefficients. . . 10
             3.2.2.  Computation of LPC Coefficients. . . . . . . . . 11
             3.2.3.  Computation of LSF Coefficients from LPC
                     Coefficients . . . . . . . . . . . . . . . . . . 11
             3.2.4.  Quantization of LSF Coefficients . . . . . . . . 12
             3.2.5.  Stability Check of LSF Coefficients. . . . . . . 13
             3.2.6.  Interpolation of LSF Coefficients. . . . . . . . 13
             3.2.7.  LPC Analysis and Quantization for 20 ms Frames . 14
       3.3.  Calculation of the Residual. . . . . . . . . . . . . . . 15
       3.4.  Perceptual Weighting Filter. . . . . . . . . . . . . . . 15
       3.5.  Start State Encoder. . . . . . . . . . . . . . . . . . . 15
             3.5.1.  Start State Estimation . . . . . . . . . . . . . 16
             3.5.2.  All-Pass Filtering and Scale Quantization. . . . 17
             3.5.3.  Scalar Quantization. . . . . . . . . . . . . . . 18
       3.6.  Encoding the Remaining Samples . . . . . . . . . . . . . 19
             3.6.1.  Codebook Memory. . . . . . . . . . . . . . . . . 20
             3.6.2.  Perceptual Weighting of Codebook Memory
                     and Target . . . . . . . . . . . . . . . . . . . 22
             3.6.3.  Codebook Creation. . . . . . . . . . . . . . . . 23
                     3.6.3.1. Creation of a Base Codebook . . . . . . 23
                     3.6.3.2. Codebook Expansion. . . . . . . . . . . 24
                     3.6.3.3. Codebook Augmentation . . . . . . . . . 24
             3.6.4.  Codebook Search. . . . . . . . . . . . . . . . . 26
                     3.6.4.1. Codebook Search at Each Stage . . . . . 26
                     3.6.4.2. Gain Quantization at Each Stage . . . . 27
                     3.6.4.3. Preparation of Target for Next Stage. . 28
       3.7.  Gain Correction Encoding . . . . . . . . . . . . . . . . 28
       3.8.  Bitstream Definition . . . . . . . . . . . . . . . . . . 29
   4.  Decoder Principles . . . . . . . . . . . . . . . . . . . . . . 32
       4.1.  LPC Filter Reconstruction. . . . . . . . . . . . . . . . 33
       4.2.  Start State Reconstruction . . . . . . . . . . . . . . . 33
       4.3.  Excitation Decoding Loop . . . . . . . . . . . . . . . . 34
       4.4.  Multistage Adaptive Codebook Decoding. . . . . . . . . . 35
             4.4.1.  Construction of the Decoded Excitation Signal. . 35
       4.5.  Packet Loss Concealment. . . . . . . . . . . . . . . . . 35
             4.5.1.  Block Received Correctly and Previous Block
                     Also Received. . . . . . . . . . . . . . . . . . 35
             4.5.2.  Block Not Received . . . . . . . . . . . . . . . 36

1. 序論. . . . . . . . . . . . . . . . . . . . . . . . . 4 2。 コーデック. . . . . . . . . . . . . . . . . . . . . 5 2.1のアウトライン。 エンコーダ。 . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2. デコーダ。 . . . . . . . . . . . . . . . . . . . . . . . . 7 3. エンコーダ原則. . . . . . . . . . . . . . . . . . . . . . 7 3.1。 前処理. . . . . . . . . . . . . . . . . . . . . 9 3.2。 LPC分析と量子化。 . . . . . . . . . . . . . 9 3.2.1. 自己相関係数の計算。 . . 10 3.2.2. LPC係数の計算。 . . . . . . . . 11 3.2.3. LPC係数. . . . . . . . . . . . . . . . . . 11 3.2.4からのLSF係数の計算。 LSF係数. . . . . . . . 12 3.2.5の量子化。 LSF係数の安定性チェック。 . . . . . . 13 3.2.6. LSF係数の挿入。 . . . . . . . 13 3.2.7. 20ms Frames. 14 3.3のためのLPC AnalysisとQuantization。 残差の計算。 . . . . . . . . . . . . . . 15 3.4. 知覚の重さのフィルタ。 . . . . . . . . . . . . . . 15 3.5. 州のエンコーダを始動してください。 . . . . . . . . . . . . . . . . . . 15 3.5.1. 州の見積り. . . . . . . . . . . . . 16 3.5.2を始めてください。 オールフィルタリングとスケール量子化を通過してください。 . . . 17 3.5.3. スカラの量子化。 . . . . . . . . . . . . . . 18 3.6. 残っているサンプル. . . . . . . . . . . . . 19 3.6.1をコード化します。 符号表メモリ。 . . . . . . . . . . . . . . . . 20 3.6.2. 符号表メモリと目標. . . . . . . . . . . . . . . . . . . 22 3.6.3の知覚の重さ。 符号表創造。 . . . . . . . . . . . . . . . 23 3.6.3.1. 基地符号表. . . . . . 23 3.6.3の.2の創造。 符号表拡大。 . . . . . . . . . . 24 3.6.3.3. 符号表増大. . . . . . . . . 24 3.6.4。 符号表検索。 . . . . . . . . . . . . . . . . 26 3.6.4.1. 符号表はそれぞれのステージ. . . . . 26 3.6.4で.2を捜します。 それぞれのステージ. . . . 27 3.6.4で.3に量子化を獲得してください。 次のステージのための目標の準備。 . 28 3.7. 修正コード化. . . . . . . . . . . . . . . . 28 3.8を獲得してください。 Bitstream定義. . . . . . . . . . . . . . . . . . 29 4。 デコーダ原則. . . . . . . . . . . . . . . . . . . . . . 32 4.1。 LPCは再建をフィルターにかけます。 . . . . . . . . . . . . . . . 33 4.2. 州の再建. . . . . . . . . . . . . . . 33 4.3を始めてください。 輪. . . . . . . . . . . . . . . . 34 4.4を解読する励振。 多段式の適応型の符号表解読。 . . . . . . . . . 35 4.4.1. 解読された励磁信号の構造。 . 35 4.5. パケット損失隠すこと。 . . . . . . . . . . . . . . . . 35 4.5.1. ブロックは正しく受信されました、そして、また、前のブロックは受信されました。 . . . . . . . . . . . . . . . . . 35 4.5.2. ブロックは.36を受け取りませんでした。

Andersen, et al.              Experimental                      [Page 2]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[2ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

             4.5.3.  Block Received Correctly When Previous Block
                     Not Received . . . . . . . . . . . . . . . . . . 36
       4.6.  Enhancement. . . . . . . . . . . . . . . . . . . . . . . 37
             4.6.1.  Estimating the Pitch . . . . . . . . . . . . . . 39
             4.6.2.  Determination of the Pitch-Synchronous
                     Sequences. . . . . . . . . . . . . . . . . . . . 39
             4.6.3.  Calculation of the Smoothed Excitation . . . . . 41
             4.6.4.  Enhancer Criterion . . . . . . . . . . . . . . . 41
             4.6.5.  Enhancing the Excitation . . . . . . . . . . . . 42
       4.7.  Synthesis Filtering. . . . . . . . . . . . . . . . . . . 43
       4.8.  Post Filtering . . . . . . . . . . . . . . . . . . . . . 43
   5.  Security Considerations. . . . . . . . . . . . . . . . . . . . 43
   6.  Evaluation of the iLBC Implementations . . . . . . . . . . . . 43
   7.  References . . . . . . . . . . . . . . . . . . . . . . . . . . 43
       7.1.  Normative References . . . . . . . . . . . . . . . . . . 43
       7.2.  Informative References . . . . . . . . . . . . . . . . . 44
   8.  ACKNOWLEDGEMENTS . . . . . . . . . . . . . . . . . . . . . . . 44
   APPENDIX A: Reference Implementation . . . . . . . . . . . . . . . 45
       A.1.  iLBC_test.c. . . . . . . . . . . . . . . . . . . . . . . 46
       A.2   iLBC_encode.h. . . . . . . . . . . . . . . . . . . . . . 52
       A.3.  iLBC_encode.c. . . . . . . . . . . . . . . . . . . . . . 53
       A.4.  iLBC_decode.h. . . . . . . . . . . . . . . . . . . . . . 63
       A.5.  iLBC_decode.c. . . . . . . . . . . . . . . . . . . . . . 64
       A.6.  iLBC_define.h. . . . . . . . . . . . . . . . . . . . . . 76
       A.7.  constants.h. . . . . . . . . . . . . . . . . . . . . . . 80
       A.8.  constants.c. . . . . . . . . . . . . . . . . . . . . . . 82
       A.9.  anaFilter.h. . . . . . . . . . . . . . . . . . . . . . . 96
       A.10. anaFilter.c. . . . . . . . . . . . . . . . . . . . . . . 97
       A.11. createCB.h . . . . . . . . . . . . . . . . . . . . . . . 98
       A.12. createCB.c . . . . . . . . . . . . . . . . . . . . . . . 99
       A.13. doCPLC.h . . . . . . . . . . . . . . . . . . . . . . . .104
       A.14. doCPLC.c . . . . . . . . . . . . . . . . . . . . . . . .104
       A.15. enhancer.h . . . . . . . . . . . . . . . . . . . . . . .109
       A.16. enhancer.c . . . . . . . . . . . . . . . . . . . . . . .110
       A.17. filter.h . . . . . . . . . . . . . . . . . . . . . . . .123
       A.18. filter.c . . . . . . . . . . . . . . . . . . . . . . . .125
       A.19. FrameClassify.h. . . . . . . . . . . . . . . . . . . . .128
       A.20. FrameClassify.c. . . . . . . . . . . . . . . . . . . . .129
       A.21. gainquant.h. . . . . . . . . . . . . . . . . . . . . . .131
       A.22. gainquant.c. . . . . . . . . . . . . . . . . . . . . . .131
       A.23. getCBvec.h . . . . . . . . . . . . . . . . . . . . . . .134
       A.24. getCBvec.c . . . . . . . . . . . . . . . . . . . . . . .134
       A.25. helpfun.h. . . . . . . . . . . . . . . . . . . . . . . .138
       A.26. helpfun.c. . . . . . . . . . . . . . . . . . . . . . . .140
       A.27. hpInput.h. . . . . . . . . . . . . . . . . . . . . . . .146
       A.28. hpInput.c. . . . . . . . . . . . . . . . . . . . . . . .146
       A.29. hpOutput.h . . . . . . . . . . . . . . . . . . . . . . .148
       A.30. hpOutput.c . . . . . . . . . . . . . . . . . . . . . . .148

4.5.3. 前のブロックが.364.6を受け取らなかったとき、ブロックは正しく受信されました。 増進。 . . . . . . . . . . . . . . . . . . . . . . 37 4.6.1. ピッチ. . . . . . . . . . . . . . 39 4.6が.2であると見積もっています。 ピッチ同期の系列の決断。 . . . . . . . . . . . . . . . . . . . 39 4.6.3. 平坦な励振. . . . . 41 4.6.4のものの計算。 エンハンサ評価基準. . . . . . . . . . . . . . . 41 4.6.5。 励振. . . . . . . . . . . . 42 4.7を機能アップします。 統合フィルタリング。 . . . . . . . . . . . . . . . . . . 43 4.8. フィルタリング. . . . . . . . . . . . . . . . . . . . . 43 5を掲示してください。 セキュリティ問題。 . . . . . . . . . . . . . . . . . . . 43 6. iLBC実現. . . . . . . . . . . . 43 7の評価。 参照. . . . . . . . . . . . . . . . . . . . . . . . . . 43 7.1。 引用規格. . . . . . . . . . . . . . . . . . 43 7.2。 有益な参照. . . . . . . . . . . . . . . . . 44 8。 承認. . . . . . . . . . . . . . . . . . . . . . . 44付録A: リファレンスインプリメンテーション. . . . . . . . . . . . . . . 45A.1iLBC_test.c。 . . . . . . . . . . . . . . . . . . . . . . 46 A.2 iLBC_encode.h。 . . . . . . . . . . . . . . . . . . . . . 52 A.3iLBC_encode.c。 . . . . . . . . . . . . . . . . . . . . . 53 A.4iLBC_decode.h。 . . . . . . . . . . . . . . . . . . . . . 63 A.5iLBC_decode.c。 . . . . . . . . . . . . . . . . . . . . . 64 A.6iLBC_define.h。 . . . . . . . . . . . . . . . . . . . . . 76 A.7constants.h。 . . . . . . . . . . . . . . . . . . . . . . 80 A.8constants.c。 . . . . . . . . . . . . . . . . . . . . . . 82 A.9anaFilter.h。 . . . . . . . . . . . . . . . . . . . . . . 96 A.10anaFilter.c。 . . . . . . . . . . . . . . . . . . . . . . 97 A.11createCB.h. . . . . . . . . . . . . . . . . . . . . . . 98A.12createCB.c. . . . . . . . . . . . . . . . . . . . . . . 99A.13doCPLC.h. . . . . . . . . . . . . . . . . . . . . . . .104A.14doCPLC.c. . . . . . . . . . . . . . . . . . . . . . . .104A; 15. enhancer.h………………… . .109A.16enhancer.c………………… . .110A.17filter.h.123A.18filter.c.125A.19。 FrameClassify.h。 . . . . . . . . . . . . . . . . . . . .128 A.20。 FrameClassify.c。 . . . . . . . . . . . . . . . . . . . .129 A.21gainquant.h。 . . . . . . . . . . . . . . . . . . . . . .131 A.22gainquant.c。 . . . . . . . . . . . . . . . . . . . . . .131 A.23getCBvec.h… .134A.24getCBvec.c… .134A.25helpfun.h。 . . . . . . . . . . . . . . . . . . . . . . .138 A.26helpfun.c。 . . . . . . . . . . . . . . . . . . . . . . .140 A.27hpInput.h。 . . . . . . . . . . . . . . . . . . . . . . .146 A.28hpInput.c。 . . . . . . . . . . . . . . . . . . . . . . .146A.29hpOutput.h………………… . .148A.30hpOutput.c………………… . .148

Andersen, et al.              Experimental                      [Page 3]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[3ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       A.31. iCBConstruct.h . . . . . . . . . . . . . . . . . . . . .149
       A.32. iCBConstruct.c . . . . . . . . . . . . . . . . . . . . .150
       A.33. iCBSearch.h. . . . . . . . . . . . . . . . . . . . . . .152
       A.34. iCBSearch.c. . . . . . . . . . . . . . . . . . . . . . .153
       A.35. LPCdecode.h. . . . . . . . . . . . . . . . . . . . . . .163
       A.36. LPCdecode.c. . . . . . . . . . . . . . . . . . . . . . .164
       A.37. LPCencode.h. . . . . . . . . . . . . . . . . . . . . . .167
       A.38. LPCencode.c. . . . . . . . . . . . . . . . . . . . . . .167
       A.39. lsf.h. . . . . . . . . . . . . . . . . . . . . . . . . .172
       A.40. lsf.c. . . . . . . . . . . . . . . . . . . . . . . . . .172
       A.41. packing.h. . . . . . . . . . . . . . . . . . . . . . . .178
       A.42. packing.c. . . . . . . . . . . . . . . . . . . . . . . .179
       A.43. StateConstructW.h. . . . . . . . . . . . . . . . . . . .182
       A.44. StateConstructW.c. . . . . . . . . . . . . . . . . . . .183
       A.45. StateSearchW.h . . . . . . . . . . . . . . . . . . . . .185
       A.46. StateSearchW.c . . . . . . . . . . . . . . . . . . . . .186
       A.47. syntFilter.h . . . . . . . . . . . . . . . . . . . . . .190
       A.48. syntFilter.c . . . . . . . . . . . . . . . . . . . . . .190
   Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . .192
   Full Copyright Statement . . . . . . . . . . . . . . . . . . . . .194

A.31iCBConstruct.h. . . . . . . . . . . . . . . . . . . . .149A.32iCBConstruct.c. . . . . . . . . . . . . . . . . . . . .150A.33iCBSearch.h。 . . . . . . . . . . . . . . . . . . . . . .152 A.34iCBSearch.c。 . . . . . . . . . . . . . . . . . . . . . .153 A.35。 LPCdecode.h。 . . . . . . . . . . . . . . . . . . . . . .163 A.36。 LPCdecode.c。 . . . . . . . . . . . . . . . . . . . . . .164 A.37。 LPCencode.h。 . . . . . . . . . . . . . . . . . . . . . .167 A.38。 LPCencode.c。 . . . . . . . . . . . . . . . . . . . . . .167 A.39lsf.h。 . . . . . . . . . . . . . . . . . . . . . . . . .172 A.40lsf.c。 . . . . . . . . . . . . . . . . . . . . . . . . .172 A.41packing.h。 . . . . . . . . . . . . . . . . . . . . . . .178 A.42packing.c。 . . . . . . . . . . . . . . . . . . . . . . .179 A.43。 StateConstructW.h。 . . . . . . . . . . . . . . . . . . .182 A.44。 StateConstructW.c。 . . . . . . . . . . . . . . . . . . .183 A.45。 StateSearchW.h. . . . . . . . . . . . . . . . . . . . .185A.46。 StateSearchW.c.186A.47syntFilter.h………………….190A.48syntFilter.c.190…………………作者のアドレス. . . . . . . . . . . . . . . . . . . . . . . .192の完全な著作権宣言文. . . . . . . . . . . . . . . . . . . . .194

1.  Introduction

1. 序論

   This document contains the description of an algorithm for the coding
   of speech signals sampled at 8 kHz.  The algorithm, called iLBC, uses
   a block-independent linear-predictive coding (LPC) algorithm and has
   support for two basic frame lengths: 20 ms at 15.2 kbit/s and 30 ms
   at 13.33 kbit/s.  When the codec operates at block lengths of 20 ms,
   it produces 304 bits per block, which SHOULD be packetized as in [1].
   Similarly, for block lengths of 30 ms it produces 400 bits per block,
   which SHOULD be packetized as in [1].  The two modes for the
   different frame sizes operate in a very similar way.  When they
   differ it is explicitly stated in the text, usually with the notation
   x/y, where x refers to the 20 ms mode and y refers to the 30 ms mode.

このドキュメントは8kHzで抽出されたスピーチ信号のコード化のためのアルゴリズムの記述を含んでいます。 iLBCと呼ばれるアルゴリズムは、ブロックから独立している線形予測コーディング(LPC)アルゴリズムを使用して、2つの基本枠の長さのサポートを持っています: 15.2kbit/sの20msと13.33kbit/sの30ms。 コーデックが20msのブロック長で作動すると、それは1ブロックあたり304ビット、どのSHOULDを生産するか。[1]のように、packetizedされます。 30msのブロック長のために、同様に、それは1ブロックあたり400ビット、どのSHOULDを生産するか。[1]のように、packetizedされます。 異なったフレーム・サイズのための2つのモードが非常に同様の方法で作動します。 彼らが異なるとき、それはテキストに明らかに述べられます、通常記法x/yで。そこでは、xが20msモードを示して、yは30msモードを示します。

   The described algorithm results in a speech coding system with a
   controlled response to packet losses similar to what is known from
   pulse code modulation (PCM) with packet loss concealment (PLC), such
   as the ITU-T G.711 standard [4], which operates at a fixed bit rate
   of 64 kbit/s.  At the same time, the described algorithm enables
   fixed bit rate coding with a quality-versus-bit rate tradeoff close
   to state-of-the-art.  A suitable RTP payload format for the iLBC
   codec is specified in [1].

説明されたアルゴリズムはパルス符号変調(PCM)から知られていることと同様のパケット損失へのパケット損失隠すこと(PLC)による制御応答でスピーチ記号化体系をもたらします、ITU-T G.711規格[4]などのように。(それは、64kbit/sの固定ビット伝送速度で作動します)。 同時に、説明されたアルゴリズムは到達技術水準の近くでビット伝送速度に従った品質見返りがある固定ビット伝送速度コード化を可能にします。 iLBCコーデックのための適当なRTPペイロード形式は[1]で指定されます。

   Some of the applications for which this coder is suitable are real
   time communications such as telephony and videoconferencing,
   streaming audio, archival, and messaging.

この符号化器が適しているアプリケーションのいくつかが、電話やテレビ会議などのリアルタイムのコミュニケーションであり、オーディオであって、記録保管所で流れて、通信しています。

Andersen, et al.              Experimental                      [Page 4]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[4ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   Cable Television Laboratories (CableLabs(R)) has adopted iLBC as a
   mandatory PacketCable(TM) audio codec standard for VoIP over Cable
   applications [3].

Television研究所に電報を打ってください。(CableLabs(R))はVoIPにおける、Cableアプリケーション[3]の上の標準の義務的なPacketCable(TM)オーディオコーデックとしてiLBCを採用しました。

   This document is organized as follows.  Section 2 gives a brief
   outline of the codec.  The specific encoder and decoder algorithms
   are explained in sections 3 and 4, respectively.  Appendix A provides
   a c-code reference implementation.

このドキュメントは以下の通りまとめられます。 セクション2はコーデックの簡潔なアウトラインをします。特定のエンコーダとデコーダアルゴリズムはセクション3と4でそれぞれ説明されます。 付録Aはc-コード参照実現を提供します。

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
   document are to be interpreted as described in BCP 14, RFC 2119 [2].

キーワード“MUST"、「必須NOT」が「必要です」、“SHALL"、「」、“SHOULD"、「「推薦され」て、「5月」の、そして、「任意」のNOTはBCP14(RFC2119[2])で説明されるように本書では解釈されることであるべきです。

2.  Outline of the Codec

2. コーデックのアウトライン

   The codec consists of an encoder and a decoder as described in
   sections 2.1 and 2.2, respectively.

コーデックはセクション2.1と2.2でそれぞれ説明されるようにエンコーダとデコーダから成ります。

   The essence of the codec is LPC and block-based coding of the LPC
   residual signal.  For each 160/240 (20 ms/30 ms) sample block, the
   following major steps are performed: A set of LPC filters are
   computed, and the speech signal is filtered through them to produce
   the residual signal.  The codec uses scalar quantization of the
   dominant part, in terms of energy, of the residual signal for the
   block.  The dominant state is of length 57/58 (20 ms/30 ms) samples
   and forms a start state for dynamic codebooks constructed from the
   already coded parts of the residual signal.  These dynamic codebooks
   are used to code the remaining parts of the residual signal.  By this
   method, coding independence between blocks is achieved, resulting in
   elimination of propagation of perceptual degradations due to packet
   loss.  The method facilitates high-quality packet loss concealment
   (PLC).

コーデックの本質は、LPCの残りの信号のLPCとブロックベースのコード化です。 各160/240(20ms/30ms)サンプルブロックに関しては、以下の主要なステップは実行されます: 1セットのLPCフィルタは計算されます、そして、スピーチ信号は、残りの信号を作り出すためにそれらを通してフィルターにかけられます。 コーデックはブロックで残りの信号のエネルギーに関して主要な地域のスカラの量子化を使用します。 優位な州は、長さ57/58(20ms/30ms)のサンプルがあって、残りの信号の既にコード化された部分から構成されたダイナミックな符号表のためにスタート状態を形成します。 これらのダイナミックな符号表は、残りの信号の残存部分をコード化するのに使用されます。 この方法で、ブロックの間のコード化独立は達成されます、パケット損失による知覚の転落の伝播の除去をもたらして。 方法は高品質なパケット損失隠すこと(PLC)を容易にします。

2.1.  Encoder

2.1. エンコーダ

   The input to the encoder SHOULD be 16 bit uniform PCM sampled at 8
   kHz.  It SHOULD be partitioned into blocks of BLOCKL=160/240 samples
   for the 20/30 ms frame size.  Each block is divided into NSUB=4/6
   consecutive sub-blocks of SUBL=40 samples each.  For 30 ms frame
   size, the encoder performs two LPC_FILTERORDER=10 linear-predictive
   coding (LPC) analyses.  The first analysis applies a smooth window
   centered over the second sub-block and extending to the middle of the
   fifth sub-block.  The second LPC analysis applies a smooth asymmetric
   window centered over the fifth sub-block and extending to the end of
   the sixth sub-block.  For 20 ms frame size, one LPC_FILTERORDER=10
   linear-predictive coding (LPC) analysis is performed with a smooth
   window centered over the third sub-frame.

16が一定のPCMが8kHzで抽出したビットであったならSHOULDをエンコーダに入力してください。 それ、SHOULD、20/30msフレーム・サイズのためのブロックのBLOCKL=160/240のサンプルに仕切られてください。 各ブロックはそれぞれNSUB=4/6連続したサブブロックのSUBL=40のサンプルに分割されます。 30msフレーム・サイズのために、エンコーダは2LPC_FILTERORDER=10線形予測コーディング(LPC)分析を実行します。 最初の分析は、2番目のサブブロックにわたって中心に置かれて、5番目のサブブロックの中央に達しながら、滑らかな窓を当てはまります。 2番目のLPC分析は、5番目のサブブロックにわたって中心に置かれて、6番目のサブブロックの端に達しながら、滑らかな非対称の窓を当てはまります。 20msフレーム・サイズにおいて、滑らかな窓が3番目のサブフレームの上の中心に置かれている状態で、1つのLPC_FILTERORDER=10線形予測コーディング(LPC)分析は実行されます。

Andersen, et al.              Experimental                      [Page 5]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[5ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   For each of the LPC analyses, a set of line-spectral frequencies
   (LSFs) are obtained, quantized, and interpolated to obtain LSF
   coefficients for each sub-block.  Subsequently, the LPC residual is
   computed by using the quantized and interpolated LPC analysis
   filters.

それぞれのLPC分析において、1セットの線スペクトルの頻度(LSFs)は、それぞれのサブブロック単位のLSF係数を得るために得られて、量子化されて、補間されます。 次に、LPC残差は、量子化されて補間されたLPC分析フィルタを使用することによって、計算されます。

   The two consecutive sub-blocks of the residual exhibiting the maximal
   weighted energy are identified.  Within these two sub-blocks, the
   start state (segment) is selected from two choices: the first 57/58
   samples or the last 57/58 samples of the two consecutive sub-blocks.
   The selected segment is the one of higher energy.  The start state is
   encoded with scalar quantization.

最大限度の荷重しているエネルギーを示す残差の2つの連続したサブブロックが特定されます。 これらの2つのサブブロック以内では、スタート状態(セグメント)は2つの選択から選択されます: 2つの連続したサブブロックの最初の57/58個のサンプルか最後の57/58個のサンプル。 選択されたセグメントは、より高いエネルギーの1つです。 スタート状態はスカラの量子化でコード化されます。

   A dynamic codebook encoding procedure is used to encode 1) the 23/22
   (20 ms/30 ms) remaining samples in the two sub-blocks containing the
   start state; 2) the sub-blocks after the start state in time; and 3)
   the sub-blocks before the start state in time.  Thus, the encoding
   target can be either the 23/22 samples remaining of the two sub-
   blocks containing the start state or a 40-sample sub-block.  This
   target can consist of samples indexed forward in time or backward in
   time, depending on the location of the start state.

手順をコード化するダイナミックな符号表はスタート状態を含んでいて、2つのサブブロックのサンプルのままで残りながら、エンコード1) 23/22(20ms/30ms)に使用されます。 2) 時間内にのスタート状態の後のサブブロック。 そして、始めの前のサブブロックが時間内に述べる3)。 したがって、コード化目標は、スタート状態を含む2つのサブブロックを残す23/22個のサンプルか40サンプルのサブブロックのどちらかであるかもしれません。 この目標は時間内に前方に時間内にか後方に索引をつけられたサンプルから成ることができます、スタート状態の位置によって。

   The codebook coding is based on an adaptive codebook built from a
   codebook memory that contains decoded LPC excitation samples from the
   already encoded part of the block.  These samples are indexed in the
   same time direction as the target vector, ending at the sample
   instant prior to the first sample instant represented in the target
   vector.  The codebook is used in CB_NSTAGES=3 stages in a successive
   refinement approach, and the resulting three code vector gains are
   encoded with 5-, 4-, and 3-bit scalar quantization, respectively.

符号表コード化はブロックの既にコード化された部分からの解読されたLPC励振のサンプルを含む符号表メモリから造られた適応型の符号表に基づいています。 これらのサンプルは目標ベクトルと同じ時間方向に索引をつけられます、最初にサンプル即時の前の瞬間に目標ベクトルで表されたサンプルで終わって。 符号表は連続した気品アプローチにCB_NSTAGES=3段階で使用されます、そして、3つの結果として起こるコードベクトル利得が5、4、および3ビットのスカラの量子化でそれぞれコード化されます。

   The codebook search method employs noise shaping derived from the LPC
   filters, and the main decision criterion is to minimize the squared
   error between the target vector and the code vectors.  Each code
   vector in this codebook comes from one of CB_EXPAND=2 codebook
   sections.  The first section is filled with delayed, already encoded
   residual vectors.  The code vectors of the second codebook section
   are constructed by predefined linear combinations of vectors in the
   first section of the codebook.

符号表検索方法はLPCフィルタから得られた雑音形成を使います、そして、主な決定評価基準は目標ベクトルとコードベクトルの間の二乗された誤りを最小にすることです。 この符号表のそれぞれのコードベクトルはCB_EXPAND=2符号表部の1つから来ます。 最初のセクションは遅らせて、既にコード化された残りのベクトルで満たされます。 第2符号表部のコードベクトルは符号表の最初のセクションのベクトルの事前に定義された一次結合で構成されます。

   As codebook encoding with squared-error matching is known to produce
   a coded signal of less power than does the scalar quantized start
   state signal, a gain re-scaling method is implemented by a refined
   search for a better set of codebook gains in terms of power matching
   after encoding.  This is done by searching for a higher value of the
   gain factor for the first stage codebook, as the subsequent stage
   codebook gains are scaled by the first stage gain.

二乗された誤りマッチングによる符号表コード化がスタート州の信号であると量子化されたスカラより少ないパワーのコード化された信号を作り出すのが知られているとき、利得再スケーリング方法はコード化の後に合っているパワーに関して、より良いセットの符号表獲得の洗練された検索で実行されます。 第一段階符号表のための利得要素の、より高い値を捜し求めることによって、これをします、その後のステージ符号表利得が第一段階利得によってスケーリングされるとき。

Andersen, et al.              Experimental                      [Page 6]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[6ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

2.2.  Decoder

2.2. デコーダ

   Typically for packet communications, a jitter buffer placed at the
   receiving end decides whether the packet containing an encoded signal
   block has been received or lost.  This logic is not part of the codec
   described here.  For each encoded signal block received the decoder
   performs a decoding.  For each lost signal block, the decoder
   performs a PLC operation.

通常、パケットコミュニケーションに関しては、犠牲者に置かれたジターバッファは、コード化された信号ブロックを含むパケットを受け取るか、または失ったかを決めます。 この論理はここで説明されたコーデックの一部ではありません。 受け取られたそれぞれのコード化された信号ブロックに関しては、デコーダは解読を実行します。 それぞれの無くなっている信号ブロックに関しては、デコーダはPLC操作を実行します。

   The decoding for each block starts by decoding and interpolating the
   LPC coefficients.  Subsequently the start state is decoded.

各ブロックのための解読は、LPC係数を解読して、補間することによって、始まります。 次に、スタート状態は解読されます。

   For codebook-encoded segments, each segment is decoded by
   constructing the three code vectors given by the received codebook
   indices in the same way that the code vectors were constructed in the
   encoder.  The three gain factors are also decoded and the resulting
   decoded signal is given by the sum of the three codebook vectors
   scaled with respective gain.

符号表でコード化されたセグメントにおいて、各セグメントは、コードベクトルがエンコーダで構成されたなら3つのコードベクトルを構成することによって、解読されます。 また、3つの利得要素を解読します、そして、それぞれの利得でスケーリングされた3つの符号表ベクトルの合計は結果として起こる解読された信号を与えます。

   An enhancement algorithm is applied to the reconstructed excitation
   signal.  This enhancement augments the periodicity of voiced speech
   regions.  The enhancement is optimized under the constraint that the
   modification signal (defined as the difference between the enhanced
   excitation and the excitation signal prior to enhancement) has a
   short-time energy that does not exceed a preset fraction of the
   short-time energy of the excitation signal prior to enhancement.

エンハンスアルゴリズムは再建された励磁信号に適用されます。 この増進は有声なスピーチ領域の周期性を増大させます。 増進は変更信号(増進の前に高められた励振と励磁信号の違いと定義される)でそれがする短い間のエネルギーが超えていない規制の下に最適化されて、aが断片をあらかじめセットしたということです。増進の前の励磁信号の短い間のエネルギーについて。

   A packet loss concealment (PLC) operation is easily embedded in the
   decoder.  The PLC operation can, e.g., be based on repeating LPC
   filters and obtaining the LPC residual signal by using a long-term
   prediction estimate from previous residual blocks.

パケット損失隠すこと(PLC)の操作は容易にデコーダに埋め込まれています。 PLC操作は基づくことができて、例えば、前の残りのブロックから長期の予測見積りを使用することによってLPCフィルタを繰り返して、LPCの残りの信号を入手するのに基づいてください。

3.  Encoder Principles

3. エンコーダ原則

   The following block diagram is an overview of all the components of
   the iLBC encoding procedure.  The description of the blocks contains
   references to the section where that particular procedure is further
   described.

以下のブロック図は手順をコード化するiLBCのすべての部品の概観です。 ブロックの記述はその特定の手順がさらに説明されるセクションの参照を含んでいます。

Andersen, et al.              Experimental                      [Page 7]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[7ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

             +-----------+    +---------+    +---------+
   speech -> | 1. Pre P  | -> | 2. LPC  | -> | 3. Ana  | ->
             +-----------+    +---------+    +---------+

+-----------+ +---------+ +---------+ スピーチ->。| 1. 前P| ->| 2. LPC| ->| 3. 名言集| ->+-----------+ +---------+ +---------+

             +---------------+   +--------------+
          -> | 4. Start Sel  | ->| 5. Scalar Qu | ->
             +---------------+   +--------------+

+---------------+ +--------------+ ->。| 4. Selを始動してください。| ->| 5. スカラのQu| ->+---------------+ +--------------+

             +--------------+    +---------------+
          -> |6. CB Search  | -> | 7. Packetize  | -> payload
          |  +--------------+ |  +---------------+
          ----<---------<------
       sub-frame 0..2/4 (20 ms/30 ms)

+--------------+ +---------------+ ->。|6. CB検索| ->| 7. Packetizeします。| ->ペイロード| +--------------+ | +---------------+ ----<、-、-、-、-、-、-、-、--、<、-、-、-、-、-- サブフレーム0。2/4 (20ms/30ms)

   Figure 3.1. Flow chart of the iLBC encoder

図3.1。 iLBCエンコーダのフローチャート

   1. Pre-process speech with a HP filter, if needed (section 3.1).

1. 必要であるなら(セクション3.1)、HPフィルタによるスピーチを前処理してください。

   2. Compute LPC parameters, quantize, and interpolate (section 3.2).

2. LPCパラメタを計算してください、(セクション3.2)を量子化して、補間してください。

   3. Use analysis filters on speech to compute residual (section 3.3).

3. スピーチのときに分析フィルタを使用して、残差(セクション3.3)を計算してください。

   4. Select position of 57/58-sample start state (section 3.5).

4. 57/58サンプルのスタート州(セクション3.5)の位置を選択してください。

   5. Quantize the 57/58-sample start state with scalar quantization
      (section 3.5).

5. スカラの量子化(セクション3.5)で57/58サンプルがスタート状態であると量子化してください。

   6. Search the codebook for each sub-frame.  Start with 23/22 sample
      block, then encode sub-blocks forward in time, and then encode
      sub-blocks backward in time.  For each block, the steps in Figure
      3.4 are performed (section 3.6).

6. それぞれのサブフレームとして符号表を捜してください。 23/22サンプルブロックから始まってください、そして、次に、時間内に、前方にサブブロックをコード化してください、そして、次に、時間内に、後方にサブブロックをコード化してください。 各ブロックに関しては、図3.4におけるステップは実行されます(セクション3.6)。

   7. Packetize the bits into the payload specified in Table 3.2.

7. Table3.2で指定されたペイロードにビットをPacketizeします。

   The input to the encoder SHOULD be 16-bit uniform PCM sampled at 8
   kHz.  Also it SHOULD be partitioned into blocks of BLOCKL=160/240
   samples.  Each block input to the encoder is divided into NSUB=4/6
   consecutive sub-blocks of SUBL=40 samples each.

8kHzで抽出された16ビットの一定のPCMになってくださいエンコーダSHOULDに入力されて。 それ、もSHOULD、ブロックのBLOCKL=160/240のサンプルに仕切られてください。 エンコーダへの各ブロック入力はそれぞれNSUB=4/6連続したサブブロックのSUBL=40のサンプルに分割されます。

Andersen, et al.              Experimental                      [Page 8]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[8ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

             0        39        79       119       159
             +---------------------------------------+
             |    1    |    2    |    3    |    4    |
             +---------------------------------------+
                            20 ms frame

0 39 79 119 159 +---------------------------------------+ | 1 | 2 | 3 | 4 | +---------------------------------------+ 20msフレーム

   0        39        79       119       159       199       239
   +-----------------------------------------------------------+
   |    1    |    2    |    3    |    4    |    5    |    6    |
   +-----------------------------------------------------------+
                                  30 ms frame
   Figure 3.2. One input block to the encoder for 20 ms (with four sub-
   frames) and 30 ms (with six sub-frames).

0 39 79 119 159 199 239 +-----------------------------------------------------------+ | 1 | 2 | 3 | 4 | 5 | 6 | +-----------------------------------------------------------+ 30msが図3.2を縁どっています。 1つは20ms(4がサブフレームであることでの)と30ms(6がサブフレームであることでの)のためにブロックをエンコーダに入力しました。

3.1.  Pre-processing

3.1. 前処理

   In some applications, the recorded speech signal contains DC level
   and/or 50/60 Hz noise.  If these components have not been removed
   prior to the encoder call, they should be removed by a high-pass
   filter.  A reference implementation of this, using a filter with a
   cutoff frequency of 90 Hz, can be found in Appendix A.28.

使用目的によっては、記録されたスピーチ信号はDCレベル、そして/または、50/60Hzの雑音を含んでいます。 エンコーダ呼び出しの前にこれらのコンポーネントを取り外していないなら、ハイパスフィルタはそれらを取り除くべきです。 90Hzの遮断周波数があるフィルタを使用して、Appendix A.28でこの参照実現を見つけることができます。

3.2.  LPC Analysis and Quantization

3.2. LPC分析と量子化

   The input to the LPC analysis module is a possibly high-pass filtered
   speech buffer, speech_hp, that contains 240/300 (LPC_LOOKBACK +
   BLOCKL = 80/60 + 160/240 = 240/300) speech samples, where samples 0
   through 79/59 are from the previous block and samples 80/60 through
   239/299 are from the current block.  No look-ahead into the next
   block is used.  For the very first block processed, the look-back
   samples are assumed to be zeros.

LPC分析モジュールへの入力はことによると高いパスのフィルターにかけることのスピーチバッファ、スピーチ_hpです、そして、それは240/300個(LPC_LOOKBACK+BLOCKL=80/60+160/240 = 240/300)のスピーチのサンプルを含んでいます、そして、サンプル80/60〜239/299は現在のブロックから来ています。(そこでは、サンプル0〜79/59は前のブロックから来ています)。 次のブロックへの先でどんな一見も使用されていません。 最初のブロックして非常に処理にされるのに関しては、逆、が見ることのサンプルはゼロであると思われます。

   For each input block, the LPC analysis calculates one/two set(s) of
   LPC_FILTERORDER=10 LPC filter coefficients using the autocorrelation
   method and the Levinson-Durbin recursion.  These coefficients are
   converted to the Line Spectrum Frequency representation.  In the 20
   ms case, the single lsf set represents the spectral characteristics
   as measured at the center of the third sub-block.  For 30 ms frames,
   the first set, lsf1, represents the spectral properties of the input
   signal at the center of the second sub-block, and the other set,
   lsf2, represents the spectral characteristics as measured at the
   center of the fifth sub-block.  The details of the computation for 30
   ms frames are described in sections 3.2.1 through 3.2.6.  Section
   3.2.7 explains how the LPC Analysis and Quantization differs for 20
   ms frames.

それぞれの入力ブロックに関しては、LPC分析は、自己相関方法とレヴィンソン-ダービン再帰を使用することで1/2セットのLPC_FILTERORDER=10 LPCフィルタ係数について計算します。 これらの係数は線Spectrum Frequency表現に変換されます。 20ms場合では、ただ一つのlsfセットは3番目のサブブロックの中心で測定されるようにスペクトル特性を表します。 30個のmsフレームに関しては、第一セット(lsf1)は2番目のサブブロックの中心に入力信号のスペクトル特性を表します、そして、もう片方のセット(lsf2)は5番目のサブブロックの中心で測定されるようにスペクトル特性を表します。 30個のmsフレームのための計算の詳細はセクション3.2で.1〜3.2に.6に説明されます。 セクション3.2 .7 LPC AnalysisとQuantizationがどう20個のmsフレームに異なるかを説明します。

Andersen, et al.              Experimental                      [Page 9]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[9ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

3.2.1.  Computation of Autocorrelation Coefficients

3.2.1. 自己相関係数の計算

   The first step in the LPC analysis procedure is to calculate
   autocorrelation coefficients by using windowed speech samples.  This
   windowing is the only difference in the LPC analysis procedure for
   the two sets of coefficients.  For the first set, a 240-sample-long
   standard symmetric Hanning window is applied to samples 0 through 239
   of the input data.  The first window, lpc_winTbl, is defined as

LPC分析手順による第一歩は窓を付けられたスピーチのサンプルを使用することによって自己相関係数について計算することです。 このウインドーは2セットの係数のためのLPC分析手順の唯一の違いです。 第一セットに関しては、240サンプル長さの標準の左右対称のHanningウィンドウは入力データのサンプル0〜239に適用されます。 最初の窓(lpc_winTbl)は定義されます。

      lpc_winTbl[i]= 0.5 * (1.0 - cos((2*PI*(i+1))/(BLOCKL+1)));
               i=0,...,119
      lpc_winTbl[i] = winTbl[BLOCKL - i - 1]; i=120,...,239

lpc_winTbl[i]=0.5*(1.0--cos((2*パイ*(i+1))/(BLOCKL+1)))。 i=0…119lpc_winTbl[i]=winTbl[BLOCKL--i--1]。 i=120…,239

   The windowed speech speech_hp_win1 is then obtained by multiplying
   the first 240 samples of the input speech buffer with the window
   coefficients:

次に_win1が窓の係数がある入力スピーチバッファの最初の240個のサンプルを掛けながら入手される窓を付けられたスピーチスピーチ_hp:

      speech_hp_win1[i] = speech_hp[i] * lpc_winTbl[i];
               i=0,...,BLOCKL-1

スピーチ_hp_win1[i]=スピーチ_hp[i]*lpc_winTbl[i]。 i=0…BLOCKL-1

   From these 240 windowed speech samples, 11 (LPC_FILTERORDER + 1)
   autocorrelation coefficients, acf1, are calculated:

これらの240個の窓を付けられたスピーチのサンプルで、11(LPC_FILTERORDER+1)の自己相関係数(acf1)が計算されます:

      acf1[lag] += speech_hp_win1[n] * speech_hp_win1[n + lag];
               lag=0,...,LPC_FILTERORDER; n=0,...,BLOCKL-lag-1

_acf1[立ち遅れ]+=スピーチ_hp_win1[n]*スピーチhp_win1[n+立ち遅れ]。 =0を遅れさせてください…LPC_FILTERORDER。 n=0…BLOCKLは1を遅れさせます。

   In order to make the analysis more robust against numerical precision
   problems, a spectral smoothing procedure is applied by windowing the
   autocorrelation coefficients before the LPC coefficients are
   computed.  Also, a white noise floor is added to the autocorrelation
   function by multiplying coefficient zero by 1.0001 (40dB below the
   energy of the windowed speech signal).  These two steps are
   implemented by multiplying the autocorrelation coefficients with the
   following window:

分析を数値精度問題に対して、より強健にするように、スペクトルスムージング手順はLPC係数が計算される前に自己相関係数に窓を付けることによって、適用されます。 また、白色雑音床は、係数ゼロの1.0001(窓を付けられたスピーチ信号のエネルギーの40dB下における)を掛けることによって、自己相関関数に加えられます。 これらの2ステップは以下の窓で自己相関係数を掛けることによって、実行されます:

      lpc_lagwinTbl[0] = 1.0001;
      lpc_lagwinTbl[i] = exp(-0.5 * ((2 * PI * 60.0 * i) /FS)^2);
               i=1,...,LPC_FILTERORDER
               where FS=8000 is the sampling frequency

lpc_lagwinTbl[0]は1.0001と等しいです。 lpc_lagwinTbl[i]はexp(-0.5*(2*PI*60.0*i)/FS)^2)と等しいです。 i=1…FS=8000がサンプリング周波数であるLPC_FILTERORDER

   Then, the windowed acf function acf1_win is obtained by

そして、_勝利が得られる窓を付けられたacf機能acf1

      acf1_win[i] = acf1[i] * lpc_lagwinTbl[i];
               i=0,...,LPC_FILTERORDER

acf1_勝利[i]はacf1[i]*lpc_lagwinTbl[i]と等しいです。 i=0…LPC_FILTERORDER

   The second set of autocorrelation coefficients, acf2_win, are
   obtained in a similar manner.  The window, lpc_asymwinTbl, is applied
   to samples 60 through 299, i.e., the entire current block.  The

同じように、2番目のセットの自己相関係数(acf2_勝利)を得ます。 窓(lpc_asymwinTbl)はすなわち、サンプル60〜299、全体の現在のブロックに適用されます。 The

Andersen, et al.              Experimental                     [Page 10]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[10ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   window consists of two segments, the first (samples 0 to 219) being
   half a Hanning window with length 440 and the second a quarter of a
   cycle of a cosine wave.  By using this asymmetric window, an LPC
   analysis centered in the fifth sub-block is obtained without the need
   for any look-ahead, which would add delay.  The asymmetric window is
   defined as

窓が2つのセグメントから成って、最初(0〜219に、抽出する)の存在半分が長さ440があるHanningの窓であり、2番目は余弦波の1サイクルの4分の1です。 この非対称の窓を使用することによって、先のどんな外観の必要性なしでも5番目のサブブロックの中心に置かれたLPC分析を得ます。(外観は遅れを加えるでしょう)。 窓が定義される非対称

      lpc_asymwinTbl[i] = (sin(PI * (i + 1) / 441))^2; i=0,...,219

lpc_asymwinTbl[i]は^2と等しいです((パイ*(i+1)/441)を犯します)。 i=0…,219

      lpc_asymwinTbl[i] = cos((i - 220) * PI / 40); i=220,...,239

lpc_asymwinTbl[i]はcos((i--220)*PI / 40)と等しいです。 i=220…,239

   and the windowed speech is computed by

そして、窓を付けられたスピーチによって計算されます。

      speech_hp_win2[i] = speech_hp[i + LPC_LOOKBACK] *
               lpc_asymwinTbl[i];  i=0,....BLOCKL-1

スピーチ_hp_win2[i]=スピーチ_hp[+ i LPC_LOOKBACK]*lpc_asymwinTbl[i]。 i=0、…BLOCKL-1

   The windowed autocorrelation coefficients are then obtained in
   exactly the same way as for the first analysis instance.

そして、最初の分析例のようにまさに同じように窓を付けられた自己相関係数を得ます。

   The generation of the windows lpc_winTbl, lpc_asymwinTbl, and
   lpc_lagwinTbl are typically done in advance, and the arrays are
   stored in ROM rather than repeating the calculation for every block.

ウィンドウのlpc_winTbl、lpc_asymwinTbl、およびlpc_lagwinTblの世代があらかじめ、通常行われて、アレイはあらゆるブロックのための計算を繰り返すよりROMにむしろ格納されます。

3.2.2.  Computation of LPC Coefficients

3.2.2. LPC係数の計算

   From the 2 x 11 smoothed autocorrelation coefficients, acf1_win and
   acf2_win, the 2 x 11 LPC coefficients, lp1 and lp2, are calculated
   in the same way for both analysis locations by using the well known
   Levinson-Durbin recursion.  The first LPC coefficient is always 1.0,
   resulting in ten unique coefficients.

同様に、2x11の平坦な自己相関係数、acf1_勝利、およびacf2_勝利から、2x11のLPC係数(lp1とlp2)が、両方の分析位置によく知られているレヴィンソン-ダービン再帰を使用することによって、計算されます。 10のユニークな係数をもたらして、いつも最初のLPC係数は1.0です。

   After determining the LPC coefficients, a bandwidth expansion
   procedure is applied to smooth the spectral peaks in the
   short-term spectrum.  The bandwidth addition is obtained by the
   following modification of the LPC coefficients:

LPC係数を測定した後に、帯域幅拡大手順は、短期的なスペクトルでスペクトルピークを整えるために適用されます。 LPC係数の以下の変更で帯域幅添加を得ます:

      lp1_bw[i] = lp1[i] * chirp^i; i=0,...,LPC_FILTERORDER
      lp2_bw[i] = lp2[i] * chirp^i; i=0,...,LPC_FILTERORDER

lp1_bw[i]はlp1[i]*ちゅっちゅっ^iと等しいです。 i=0…LPC_FILTERORDER lp2_bw[i]=lp2[i]*ちゅっちゅっ^i。 i=0…LPC_FILTERORDER

   where "chirp" is a real number between 0 and 1.  It is RECOMMENDED to
   use a value of 0.9.

「ちゅっちゅっ」が0〜1の実数であるところ。 それは0.9の値を使用するRECOMMENDEDです。

3.2.3.  Computation of LSF Coefficients from LPC Coefficients

3.2.3. LPC係数からのLSF係数の計算

   Thus far, two sets of LPC coefficients that represent the short-term
   spectral characteristics of the speech signal for two different time
   locations within the current block have been determined.  These
   coefficients SHOULD be quantized and interpolated.  Before this is

これまでのところ、現在のブロックの中の2つの異なった時間位置のためのスピーチ信号の短期的なスペクトル特性を表す2セットのLPC係数は決定しています。 量子化されて、補間されたこれらの係数SHOULD。 これがそうであるのになる前に

Andersen, et al.              Experimental                     [Page 11]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[11ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   done, it is advantageous to convert the LPC parameters into another
   type of representation called Line Spectral Frequencies (LSF).  The
   LSF parameters are used because they are better suited for
   quantization and interpolation than the regular LPC coefficients.
   Many computationally efficient methods for calculating the LSFs from
   the LPC coefficients have been proposed in the literature.  The
   detailed implementation of one applicable method can be found in
   Appendix A.26.  The two arrays of LSF coefficients obtained, lsf1 and
   lsf2, are of dimension 10 (LPC_FILTERORDER).

していて、線Spectral Frequencies(LSF)と呼ばれる別のタイプの表現にLPCパラメタを変換するのは有利です。 LSFパラメタは、通常のLPC係数より量子化と挿入に合うほうがよいので、使用されています。 LPC係数からLSFsについて計算するための多くの計算上効率的な方法が文学で提案されました。 Appendix A.26で1つの適用される方式の詳細な実現を見つけることができます。 得られたLSF係数の2つの勢ぞろい(lsf1とlsf2)が、寸法10(LPC_FILTERORDER)のものです。

3.2.4.  Quantization of LSF Coefficients

3.2.4. LSF係数の量子化

   Because the LPC filters defined by the two sets of LSFs are also
   needed in the decoder, the LSF parameters need to be quantized and
   transmitted as side information.  The total number of bits required
   to represent the quantization of the two LSF representations for one
   block of speech is 40, with 20 bits used for each of lsf1 and lsf2.

また、LSFsの2セットによって定義されたLPCフィルタがデコーダで必要であるので、LSFパラメタは、サイド情報として量子化されて、伝えられる必要があります。 表現が個人的には妨げるスピーチの2LSFの量子化を表さなければならなかったビットの総数は40です、20ビットがそれぞれのlsf1とlsf2に使用されている状態で。

   For computational and storage reasons, the LSF vectors are quantized
   using three-split vector quantization (VQ).  That is, the LSF vectors
   are split into three sub-vectors that are each quantized with a
   regular VQ.  The quantized versions of lsf1 and lsf2, qlsf1 and
   qlsf2, are obtained by using the same memoryless split VQ.  The
   length of each of these two LSF vectors is 10, and they are split
   into three sub-vectors containing 3, 3, and 4 values, respectively.

コンピュータと格納理由で、LSFベクトルは、3分裂のベクトル量子化(VQ)を使用することで量子化されます。 すなわち、LSFベクトルは通常のVQと共にそれぞれ量子化される3つのサブベクトルに分けられます。 同じ無記憶な分裂VQを使用することによって、lsf1とlsf2の量子化されたバージョン(qlsf1とqlsf2)を得ます。 それぞれのこれらの2つのLSFベクトルの長さは10です、そして、それらはそれぞれ3、3、および4を含む3つのサブベクトル値に分けられます。

   For each of the sub-vectors, a separate codebook of quantized values
   has been designed with a standard VQ training method for a large
   database containing speech from a large number of speakers recorded
   under various conditions.  The size of each of the three codebooks
   associated with the split definitions above is

それぞれのサブベクトルにおいて、大容量データベースのための標準のVQトレーニング方法がスピーチを含んでいて、量子化された値の別々の符号表は様々な条件のもとで記録された多くのスピーカーから設計されます。 上で分裂定義に関連づけられたそれぞれの3つの符号表のサイズはそうです。

      int size_lsfCbTbl[LSF_NSPLIT] = {64,128,128};

intサイズ_lsfCbTbl[LSF_NSPLIT]=6412万8128。

   The actual values of the vector quantization codebook that must be
   used can be found in the reference code of Appendix A.  Both sets of
   LSF coefficients, lsf1 and lsf2, are quantized with a standard
   memoryless split vector quantization (VQ) structure using the squared
   error criterion in the LSF domain.  The split VQ quantization
   consists of the following steps:

LSFドメインで標準の無記憶な分裂ベクトル量子化(VQ)構造が二乗された誤り評価基準を使用している状態で係数(lsf1とlsf2)が量子化されるLSFのAppendix A.Bothセットの参照コードで使用しなければならないベクトル量子化符号表の実価を見つけることができます。 分裂VQ量子化は以下のステップから成ります:

   1) Quantize the first three LSF coefficients (1 - 3) with a VQ
      codebook of size 64.
   2) Quantize the next three LSF coefficients 4 - 6 with VQ a codebook
      of size 128.
   3) Quantize the last four LSF coefficients (7 - 10) with a VQ
      codebook of size 128.

1) サイズ64のVQ符号表で最初の3つのLSF係数が(1--3)であると量子化してください。 2) VQがある次の3つのLSF係数4--6にサイズ128の符号表を量子化してください。 3) サイズ128のVQ符号表で最後の4つのLSF係数が(7--10)であると量子化してください。

Andersen, et al.              Experimental                     [Page 12]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[12ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   This procedure, repeated for lsf1 and lsf2, gives six quantization
   indices and the quantized sets of LSF coefficients qlsf1 and qlsf2.
   Each set of three indices is encoded with 6 + 7 + 7 = 20 bits.  The
   total number of bits used for LSF quantization in a block is thus 40
   bits.

このlsf1とlsf2のために繰り返された手順はLSF係数のqlsf1とqlsf2の6つの量子化インデックスリストと量子化されたセットに与えます。 それぞれのセットの3つのインデックスリストが6+7+7 = 20ビットでコード化されます。 その結果、ブロックでのLSF量子化に使用されるビットの総数は40ビットです。

3.2.5.  Stability Check of LSF Coefficients

3.2.5. LSF係数の安定性チェック

   The LSF representation of the LPC filter has the convenient property
   that the coefficients are ordered by increasing value, i.e., lsf(n-1)
   < lsf(n), 0 < n < 10, if the corresponding synthesis filter is
   stable.  As we are employing a split VQ scheme, it is possible that
   at the split boundaries the LSF coefficients are not ordered
   correctly and hence that the corresponding LP filter is unstable.  To
   ensure that the filter used is stable, a stability check is performed
   for the quantized LSF vectors.  If it turns out that the coefficients
   are not ordered appropriately (with a safety margin of 50 Hz to
   ensure that formant peaks are not too narrow), they will be moved
   apart.  The detailed method for this can be found in Appendix A.40.
   The same procedure is performed in the decoder.  This ensures that
   exactly the same LSF representations are used in both encoder and
   decoder.

LPCフィルタのLSF表現には、係数が価値を増すことによって注文される便利な特性があります、すなわち、lsf(n-1)<lsf(n)、0<n<10、対応する統合フィルタが安定しているなら。 私たちが分裂VQ計画を使っているとき、分裂境界では、LSF係数が正しく注文されないで、したがって、対応するLPフィルタが不安定であることは、可能です。 使用されるフィルタが安定しているのを保証するために、安定性チェックは量子化されたLSFベクトルのために実行されます。 係数が適切に注文されない(50Hzの安全域で、ホルマントピークはそれを確実にすることができないくらいには、狭くない)と判明すると、それらは離れて動かされるでしょう。 Appendix A.40でこれのための詳細な方法を見つけることができます。 同じ手順はデコーダで実行されます。 これは、まさに同じLSF表現がエンコーダとデコーダの両方で使用されるのを確実にします。

3.2.6.  Interpolation of LSF Coefficients

3.2.6. LSF係数の挿入

   From the two sets of LSF coefficients that are computed for each
   block of speech, different LSFs are obtained for each sub-block by
   means of interpolation.  This procedure is performed for the original
   LSFs (lsf1 and lsf2), as well as the quantized versions qlsf1 and
   qlsf2, as both versions are used in the encoder.  Here follows a
   brief summary of the interpolation scheme; the details are found in
   the c-code of Appendix A.  In the first sub-block, the average of the
   second LSF vector from the previous block and the first LSF vector in
   the current block is used.  For sub-blocks two through five, the LSFs
   used are obtained by linear interpolation from lsf1 (and qlsf1) to
   lsf2 (and qlsf2), with lsf1 used in sub-block two and lsf2 in sub-
   block five.  In the last sub-block, lsf2 is used.  For the very first
   block it is assumed that the last LSF vector of the previous block is
   equal to a predefined vector, lsfmeanTbl, obtained by calculating the
   mean LSF vector of the LSF design database.

挿入によってそれぞれのブロックのスピーチのために計算される2セットのLSF係数と異なったLSFsをそれぞれのサブブロックに入手します。 この手順はオリジナルのLSFs(lsf1とlsf2)のために実行されます、量子化されたバージョンのqlsf1とqlsf2と同様に、両方のバージョンがエンコーダで使用されるとき。 ここで、挿入計画の簡潔な概要は従います。 詳細は最初のサブブロック、前のブロックからの2番目のLSFベクトルの平均、およびAppendix A.Inの最初のLSFのc-コードで見つけられて、現在のブロックのベクトルが使用されているということです。 サブブロックの2〜5において、直線的なlsf1(そして、qlsf1)からlsf2(そして、qlsf2)までの挿入で使用されるLSFsを入手します、lsf1がサブブロック2とlsf2でサブブロック5に使用されている状態で。 最後のサブブロックでは、lsf2が使用されています。 まさしくその最初のブロックに関しては、前のブロックの最後のLSFベクトルが事前に定義されたベクトル、LSF設計データベースの平均であるLSFベクトルについて計算することによって入手されたlsfmeanTblと等しいと思われます。

   lsfmeanTbl[LPC_FILTERORDER] = {0.281738, 0.445801, 0.663330,
                  0.962524, 1.251831, 1.533081, 1.850586, 2.137817,
                  2.481445, 2.777344}

lsfmeanTbl[LPC_FILTERORDER]={0.281738, 0.445801, 0.663330, 0.962524, 1.251831, 1.533081, 1.850586, 2.137817, 2.481445, 2.777344}

Andersen, et al.              Experimental                     [Page 13]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[13ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   The interpolation method is standard linear interpolation in the LSF
   domain.  The interpolated LSF values are converted to LPC
   coefficients for each sub-block.  The unquantized and quantized LPC
   coefficients form two sets of filters respectively.  The unquantized
   analysis filter for sub-block k is defined as follows

挿入方法はLSFドメインでの標準の直線的な挿入です。 補間されたLSF値はそれぞれのサブブロック単位のLPC係数に変換されます。 非量子化されて量子化されたLPC係数はそれぞれ2セットのフィルタを形成します。 サブブロックkのための非量子化された分析フィルタは以下の通り定義されます。

                ___
                \
      Ak(z)= 1 + > ak(i)*z^(-i)
                /__
             i=1...LPC_FILTERORDER

___ \Ak(z)は1+>ak(i)*z^(-i)/__i=1と等しいです…LPC_FILTERORDER

   The quantized analysis filter for sub-block k is defined as follows
                 ___
                 \
      A~k(z)= 1 + > a~k(i)*z^(-i)
                 /__
             i=1...LPC_FILTERORDER

サブブロックkのための量子化された分析フィルタは以下の通り定義されます。___ \1+~k(z)=>は~k(i)*z^(-i)/__i=1…です。LPC_FILTERORDER

   A reference implementation of the lsf encoding is given in Appendix
   A.38.  A reference implementation of the corresponding decoding can
   be found in Appendix A.36.

Appendix A.38でlsfコード化の参照実現を与えます。 Appendix A.36で対応する解読の参照実現を見つけることができます。

3.2.7.  LPC Analysis and Quantization for 20 ms Frames

3.2.7. 20ms FramesのためのLPC AnalysisとQuantization

   As previously stated, the codec only calculates one set of LPC
   parameters for the 20 ms frame size as opposed to two sets for 30 ms
   frames.  A single set of autocorrelation coefficients is calculated
   on the LPC_LOOKBACK + BLOCKL = 80 + 160 = 240 samples.  These samples
   are windowed with the asymmetric window lpc_asymwinTbl, centered over
   the third sub-frame, to form speech_hp_win.  Autocorrelation
   coefficients, acf, are calculated on the 240 samples in speech_hp_win
   and then windowed exactly as in section 3.2.1 (resulting in
   acf_win).

前述のように、コーデックは30個のmsフレームへの2セットと対照的に20msフレーム・サイズのための1セットのLPCパラメタについて計算するだけです。 1セットの自己相関係数は=80+160 = 240が抽出するLPC_LOOKBACK+BLOCKLで計算されます。 これらのサンプルは、スピーチ_hp_勝利を形成するために3番目のサブフレームの上の中心に置かれた非対称のウィンドウlpc_asymwinTblと共に窓を付けられます。 次に、自己相関係数(acf)は、スピーチ_hp_勝利で240個のサンプルの上に計算されてちょうどセクション3.2.1のように窓を付けられます(_acfをもたらして、勝ってください)。

   This single set of windowed autocorrelation coefficients is used to
   calculate LPC coefficients, LSF coefficients, and quantized LSF
   coefficients in exactly the same manner as in sections 3.2.3 through
   3.2.4.  As for the 30 ms frame size, the ten LSF coefficients are
   divided into three sub-vectors of size 3, 3, and 4 and quantized by
   using the same scheme and codebook as in section 3.2.4 to finally get
   3 quantization indices.  The quantized LSF coefficients are
   stabilized with the algorithm described in section 3.2.5.

このただ一つのセットの窓を付けられた自己相関係数がLPC係数、LSF係数について計算するのに使用されて、まさにコネセクション3.2.3と同じ方法によるLSF係数であると通じて量子化される、3.2、.4 30msフレーム・サイズに関して、10のLSF係数が、最終的に3つの量子化インデックスリストを得るためにサイズ3、3、および4の3つのサブベクトルに分割されて、セクション3.2.4のように同じ計画と符号表を使用することによって、量子化されます。 アルゴリズムがセクション3.2.5で説明されている状態で、量子化されたLSF係数は安定しています。

   From the set of LSF coefficients computed for this block and those
   from the previous block, different LSFs are obtained for each sub-
   block by means of interpolation.  The interpolation is done linearly
   in the LSF domain over the four sub-blocks, so that the n-th sub-

挿入によってこのブロックとそれらのために前のブロックから計算されたLSF係数のセットと、異なったLSFsをそれぞれのサブブロックに入手します。 LSFドメインで直線的に4つのサブブロックの上挿入して、そうがそれである、n番目、サブ

Andersen, et al.              Experimental                     [Page 14]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[14ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   frame uses the weight (4-n)/4 for the LSF from old frame and the
   weight n/4 of the LSF from the current frame.  For the very first
   block the mean LSF, lsfmeanTbl, is used as the LSF from the previous
   block.  Similarly as seen in section 3.2.6, both unquantized, A(z),
   and quantized, A~(z), analysis filters are calculated for each of the
   four sub-blocks.

フレームはLSFに古いフレームとLSFの重さn/4から現在のフレームから重り(4-n)/4を使用します。 まさしくその最初のブロックのために、意地悪なLSF(lsfmeanTbl)はLSFとして前のブロックから使用されます。 同様に、両方がセクション3.2.6で見られるように非量子化しました、A(z)の、そして、量子化されたA~(z)、フィルタがそれぞれ計算される4つのサブブロックの分析。

3.3.  Calculation of the Residual

3.3. 残差の計算

   The block of speech samples is filtered by the quantized and
   interpolated LPC analysis filters to yield the residual signal.  In
   particular, the corresponding LPC analysis filter for each 40 sample
   sub-block is used to filter the speech samples for the same sub-
   block.  The filter memory at the end of each sub-block is carried
   over to the LPC filter of the next sub-block.  The signal at the
   output of each LP analysis filter constitutes the residual signal for
   the corresponding sub-block.

スピーチのサンプルのブロックは量子化されて補間されたLPC分析フィルタによってフィルターにかけられて、残りの信号をもたらします。 特に、各40サンプルサブブロックする対応するLPC分析フィルタは、同じサブブロックスピーチのサンプルをフィルターにかけるのに使用されます。 それぞれのサブブロックの端のフィルタメモリは次のサブブロックのLPCフィルタに持ち越されます。 それぞれのLP分析フィルタの出力における信号は対応するサブブロックで残りの信号を構成します。

   A reference implementation of the LPC analysis filters is given in
   Appendix A.10.

Appendix A.10でLPC分析フィルタの参照実現を与えます。

3.4.  Perceptual Weighting Filter

3.4. 知覚の重さのフィルタ

   In principle any good design of a perceptual weighting filter can be
   applied in the encoder without compromising this codec definition.
   However, it is RECOMMENDED to use the perceptual weighting filter Wk
   for sub-block k specified below:

このコーデック定義で妥協しないで、エンコーダで原則として知覚の重さのフィルタのどんな良い設計も適用できます。 しかしながら、それは以下で指定されたサブブロックkに知覚の重さのフィルタWkを使用するRECOMMENDEDです:

      Wk(z)=1/Ak(z/LPC_CHIRP_WEIGHTDENUM), where
                               LPC_CHIRP_WEIGHTDENUM = 0.4222

週(z)は1/Ak(z/LPC_CHIRP_WEIGHTDENUM)と等しいです。そこでは、LPC_CHIRP_WEIGHTDENUMが0.4222と等しいです。

   This is a simple design with low complexity that is applied in the
   LPC residual domain.  Here Ak(z) is the filter obtained for sub-block
   k from unquantized but interpolated LSF coefficients.

これはLPCの残りのドメインで適用される低複雑さがある単純なデザインです。 ここで、Ak(z)は非量子化されましたが、補間されたLSF係数からのサブブロックkに入手されたフィルタです。

3.5.  Start State Encoder

3.5. 州のエンコーダを始動してください。

   The start state is quantized by using a common 6-bit scalar quantizer
   for the block and a 3-bit scalar quantizer operating on scaled
   samples in the weighted speech domain.  In the following we describe
   the state encoding in greater detail.

スタート状態は、ブロックとスケーリングされたサンプルを作動させる3ビットのスカラの量子化器に荷重しているスピーチドメインで一般的な6ビットのスカラの量子化器を使用することによって、量子化されます。 以下では、私たちは、よりすばらしい詳細における州のコード化について説明します。

Andersen, et al.              Experimental                     [Page 15]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[15ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

3.5.1.  Start State Estimation

3.5.1. 州の見積りを始めてください。

   The two sub-blocks containing the start state are determined by
   finding the two consecutive sub-blocks in the block having the
   highest power.  Advantageously, down-weighting is used in the
   beginning and end of the sub-frames, i.e., the following measure is
   computed (NSUB=4/6 for 20/30 ms frame size):

ブロックでの2つの連続したサブブロックには最も高いパワーがあるのがわかることによって、スタート状態を含む2つのサブブロックが測定されます。 下にに重みを加えるのは、有利に、サブフレームの首尾で使用されていて、すなわち、以下の測定が計算されるという(20/30msフレーム・サイズのためのNSUB=4/6)ことです:

      nsub=1,...,NSUB-1
      ssqn[nsub] = 0.0;
      for (i=(nsub-1)*SUBL; i<(nsub-1)*SUBL+5; i++)
               ssqn[nsub] += sampEn_win[i-(nsub-1)*SUBL]*
                                 residual[i]*residual[i];
      for (i=(nsub-1)*SUBL+5; i<(nsub+1)*SUBL-5; i++)
               ssqn[nsub] += residual[i]*residual[i];
      for (i=(nsub+1)*SUBL-5; i<(nsub+1)*SUBL; i++)
               ssqn[nsub] += sampEn_win[(nsub+1)*SUBL-i-1]*
                                 residual[i]*residual[i];

nsub=1…NSUB-1 ssqn[nsub]=0.0。 (i=(nsub-1)*SUBL; i<(nsub-1)*SUBL+5; i++)ssqn[nsub]+=sampEn_勝利[i(nsub-1)*SUBL]*残差[i]*残差[i]のために。 (i=(nsub-1)*SUBL+5; i<(nsub+1)*SUBL-5; i++)ssqn[nsub]に関しては、+は残差[i]*残差[i]と等しいです。 (iは*SUBL-5と等しいです(nsub+1); i<(nsub+1)*SUBL; i+ +) ssqn[nsub]+=sampEn_勝利(nsub+1)*SUBL-i-1]*残差[i]*残差[i]のために。

   where sampEn_win[5]={1/6, 2/6, 3/6, 4/6, 5/6}; MAY be used.  The
   sub-frame number corresponding to the maximum value of
   ssqEn_win[nsub-1]*ssqn[nsub] is selected as the start state
   indicator.  A weighting of ssqEn_win[]={0.8,0.9,1.0,0.9,0.8} for 30
   ms frames and ssqEn_win[]={0.9,1.0,0.9} for 20 ms frames; MAY
   advantageously be used to bias the start state towards the middle of
   the frame.

sampEn_勝利[5]が1/6、2/6、3/6、4/6、5/6と等しいところ。 使用されるかもしれません。 ssqEn_勝利[nsub-1]*ssqn[nsub]の最大値に対応するサブフレーム番号はスタート州のインディケータとして選定されます。 0.8、0.9、1.0、0.9、30個のmsフレームとssqEn_のためのssqEn_勝利[]の重さ=0.8は0.9、1.0、[]=0.9を20個のmsフレームに獲得します。 フレームの中央に向かってスタート状態に偏るのに有利に使用されるかもしれません。

   For 20 ms frames there are three possible positions for the two-sub-
   block length maximum power segment; the start state position is
   encoded with 2 bits.  The start state position, start, MUST be
   encoded as

20個のmsフレームには、2サブブロック長最大の力セグメントのための3つの可能な位置があります。 スタート州の位置は2ビットでコード化されます。 状態を置いて、始めて、コード化しなければならない始め

      start=1: start state in sub-frame 0 and 1
      start=2: start state in sub-frame 1 and 2
      start=3: start state in sub-frame 2 and 3

=1を始めてください: 0と1が始動するサブフレーム=2における状態を始めてください: サブフレーム1で状態を始めてください。そうすれば、2は=3を始めます: サブフレーム2と3で状態を始めてください。

   For 30 ms frames there are five possible positions of the two-sub-
   block length maximum power segment, the start state position is
   encoded with 3 bits.  The start state position, start, MUST be
   encoded as

30個のmsフレームには、2サブブロック長最大の力セグメントの5つの可能な位置があって、スタート州の位置は3ビットでコード化されます。 状態を置いて、始めて、コード化しなければならない始め

      start=1: start state in sub-frame 0 and 1
      start=2: start state in sub-frame 1 and 2
      start=3: start state in sub-frame 2 and 3
      start=4: start state in sub-frame 3 and 4
      start=5: start state in sub-frame 4 and 5

=1を始めてください: 0と1が始動するサブフレーム=2における状態を始めてください: サブフレーム1で状態を始めてください。そうすれば、2は=3を始めます: サブフレーム2で状態を始めてください。そうすれば、3は=4を始めます: サブフレーム3で状態を始めてください。そうすれば、4は=5を始めます: サブフレーム4と5で状態を始めてください。

Andersen, et al.              Experimental                     [Page 16]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[16ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   Hence, in both cases, index 0 is not used.  In order to shorten the
   start state for bit rate efficiency, the start state is brought down
   to STATE_SHORT_LEN=57 samples for 20 ms frames and STATE_SHORT_LEN=58
   samples for 30 ms frames.  The power of the first 23/22 and last
   23/22 samples of the two sub-frame blocks identified above is
   computed as the sum of the squared signal sample values, and the
   23/22-sample segment with the lowest power is excluded from the start
   state.  One bit is transmitted to indicate which of the two possible
   57/58 sample segments is used.  The start state position within the
   two sub-frames determined above, state_first, MUST be encoded as

したがって、どちらの場合も、インデックス0は使用されていません。 ビット伝送速度効率のためにスタート状態を短くするために、スタート状態は20個のmsフレームのための州_SHORT_LEN=57のサンプルと30個のmsフレームのための州_SHORT_LEN=58のサンプルまで持って来られます。 上で特定された2つのサブフレームブロックの最初の23/22と最後の23/22個のサンプルのパワーは二乗された信号標本値の合計として計算されます、そして、最も低いパワーがある23/22サンプルのセグメントはスタート状態から除かれます。 あるビットは、57/58がセグメントを抽出するのが可能な2つのもののどれが使用されているかを示すために伝えられます。 上で断固としたサブフレーム(状態_1番目)をコード化しなければならない2中のスタート州の位置

      state_first=1: start state is first STATE_SHORT_LEN samples
      state_first=0: start state is last STATE_SHORT_LEN samples

_最初に、=1を述べてください: スタート状態は最初に、LENのサンプルが_最初に述べる州_SHORT_=0です: スタート状態は最後の州_SHORT_LENのサンプルです。

3.5.2.  All-Pass Filtering and Scale Quantization

3.5.2. オールフィルタリングとスケール量子化を通過してください。

   The block of residual samples in the start state is first filtered by
   an all-pass filter with the quantized LPC coefficients as denominator
   and reversed quantized LPC coefficients as numerator.  The purpose of
   this phase-dispersion filter is to get a more even distribution of
   the sample values in the residual signal.  The filtering is performed
   by circular convolution, where the initial filter memory is set to
   zero.

スタート状態の残りのサンプルのブロックは最初に、分子として分母と逆にされた量子化されたLPC係数としての量子化されたLPC係数があるオールパスフィルタによってフィルターにかけられます。 この位相分散フィルタの目的は残りの信号における、標本値の、より同等の分配を得ることです。 初期のフィルタ記憶がゼロに設定されるところでフィルタリングは円形の包旋状態によって実行されます。

      res(0..(STATE_SHORT_LEN-1))   = uncoded start state residual
      res((STATE_SHORT_LEN)..(2*STATE_SHORT_LEN-1)) = 0

res(0(_州SHORT_LEN-1))=は残りのres(_州のSHORT_レン)スタート州の(_2*州SHORT_LEN-1)=0を非コード化しました。

      Pk(z) = A~rk(z)/A~k(z), where
                                   ___
                                   \
      A~rk(z)= z^(-LPC_FILTERORDER)+>a~k(i+1)*z^(i-(LPC_FILTERORDER-1))
                                   /__
                               i=0...(LPC_FILTERORDER-1)

Pk(z)はA~rk(z)/A~k(z)、どこと等しいか。___ \A~rk(z)= z^、(-、LPC_FILTERORDER) + >a~k(i+1)*z^(i(LPC_FILTERORDER-1))/__i=0…(LPC_FILTERORDER-1)

      and A~k(z) is taken from the block where the start state begins

そして、A~k(z)はスタート状態が始まるブロックから抜粋されます。

      res -> Pk(z) -> filtered

Pk(z)->がフィルターにかけたres->。

      ccres(k) = filtered(k) + filtered(k+STATE_SHORT_LEN),
                                        k=0..(STATE_SHORT_LEN-1)

ccres(k)=は+がフィルターにかけた(k)(_k+州SHORT_LEN)、k=0をフィルターにかけました。(状態_の短い_レン-1)

   The all-pass filtered block is searched for its largest magnitude
   sample.  The 10-logarithm of this magnitude is quantized with a 6-bit
   quantizer, state_frgqTbl, by finding the nearest representation.

オールパスフィルターにかけることのブロックは最も大きい大きさのサンプルを捜されます。 _frgqTblは、この大きさの10対数が6ビットの量子化器で量子化されると最も近い表現を見つけることによって、述べます。

Andersen, et al.              Experimental                     [Page 17]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[17ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   This results in an index, idxForMax, corresponding to a quantized
   value, qmax.  The all-pass filtered residual samples in the block are
   then multiplied with a scaling factor scal=4.5/(10^qmax) to yield
   normalized samples.

これはインデックス、量子化された値、qmaxに対応するidxForMaxをもたらします。 そして、ブロックのオールパスのフィルターにかけることの残りのサンプルはけた移動子scal=4.5/(10^qmax)で掛けられて、正常にされたサンプルをもたらします。

   state_frgqTbl[64] = {1.000085, 1.071695, 1.140395, 1.206868,
                  1.277188, 1.351503, 1.429380, 1.500727, 1.569049,
                  1.639599, 1.707071, 1.781531, 1.840799, 1.901550,
                  1.956695, 2.006750, 2.055474, 2.102787, 2.142819,
                  2.183592, 2.217962, 2.257177, 2.295739, 2.332967,
                  2.369248, 2.402792, 2.435080, 2.468598, 2.503394,
                  2.539284, 2.572944, 2.605036, 2.636331, 2.668939,
                  2.698780, 2.729101, 2.759786, 2.789834, 2.818679,
                  2.848074, 2.877470, 2.906899, 2.936655, 2.967804,
                  3.000115, 3.033367, 3.066355, 3.104231, 3.141499,
                  3.183012, 3.222952, 3.265433, 3.308441, 3.350823,
                  3.395275, 3.442793, 3.490801, 3.542514, 3.604064,
                  3.666050, 3.740994, 3.830749, 3.938770, 4.101764}

状態_frgqTbl[64]={1.000085, 1.071695, 1.140395, 1.206868, 1.277188, 1.351503, 1.429380, 1.500727, 1.569049, 1.639599, 1.707071, 1.781531, 1.840799, 1.901550, 1.956695, 2.006750, 2.055474, 2.102787, 2.142819, 2.183592, 2.217962, 2.257177, 2.295739, 2.332967, 2.369248, 2.402792, 2.435080, 2.468598, 2.503394, 2.539284, 2.572944, 2.605036, 2.636331, 2.668939, 2.698780, 2.729101, 2.759786, 2.789834, 2.818679, 2.848074, 2.877470, 2.906899, 2.936655, 2.967804, 3.000115, 3.033367, 3.066355, 3.104231, 3.141499, 3.183012, 3.222952, 3.265433, 3.308441, 3.350823, 3.395275, 3.442793, 3.490801, 3.542514, 3.604064, 3.666050, 3.740994, 3.830749, 3.938770, 4.101764}

3.5.3.  Scalar Quantization

3.5.3. スカラの量子化

   The normalized samples are quantized in the perceptually weighted
   speech domain by a sample-by-sample scalar DPCM quantization as
   depicted in Figure 3.3.  Each sample in the block is filtered by a
   weighting filter Wk(z), specified in section 3.4, to form a weighted
   speech sample x[n].  The target sample d[n] is formed by subtracting
   a predicted sample y[n], where the prediction filter is given by

正常にされたサンプルは図3.3に表現されるように知覚のに荷重しているスピーチドメインでサンプルごとのスカラのDPCM量子化で量子化されます。 ブロックの各サンプルはWk(z)であって、セクション3.4で指定された重さのフィルタによってフィルターにかけられて、荷重しているスピーチサンプルx[n]を形成します。 目標のサンプルd[n]は、予測されたサンプルy[n]を引き算することによって、形成されます。(そこでは、予測フィルタが与えられています)。

           Pk(z) = 1 - 1 / Wk(z).

Pk(z)=1--1/週の(z)。

               +-------+  x[n] +    d[n] +-----------+ u[n]
   residual -->| Wk(z) |-------->(+)---->| Quantizer |------> quantized
               +-------+       - /|\     +-----------+    |   residual
                                  |                      \|/
                             y[n] +--------------------->(+)
                                  |                       |
                                  |        +------+       |
                                  +--------| Pk(z)|<------+
                                           +------+

+-------+ x[n]+d[n]+-----------+ u[n]残差-->| 週(z)|-------->(+)---->| 量子化器|------+であると量子化された>。-------+ - /|\ +-----------+ | 残差| \|/y[n]+--------------------->(+) | | | +------+ | +--------| Pk(z)| <、-、-、-、-、--+ +------+

   Figure 3.3.  Quantization of start state samples by DPCM in weighted
   speech domain.

図3.3。 荷重しているスピーチドメインのDPCMによるスタート州のサンプルの量子化。

   The coded state sample u[n] is obtained by quantizing d[n] with a 3-
   bit quantizer with quantization table state_sq3Tbl.

量子化テーブル状態_sq3Tblと共に3の噛み付いている量子化器でd[n]を量子化することによって、コード化された州のサンプルu[n]を入手します。

   state_sq3Tbl[8] = {-3.719849, -2.177490, -1.130005, -0.309692,
                  0.444214, 1.329712, 2.436279, 3.983887}

状態_sq3Tbl[8]={-3.719849, -2.177490, -1.130005, -0.309692, 0.444214, 1.329712, 2.436279, 3.983887}

Andersen, et al.              Experimental                     [Page 18]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[18ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   The quantized samples are transformed back to the residual domain by
   1) scaling with 1/scal; 2) time-reversing the scaled samples; 3)
   filtering the time-reversed samples by the same all-pass filter, as
   in section 3.5.2, by using circular convolution; and 4) time-
   reversing the filtered samples.  (More detail is in section 4.2.)

量子化されたサンプルは1/scalで1の残りのドメイン) スケーリングに変えて戻されます。 スケーリングが抽出する2)時間逆にすること。 3) 同じくらいで時間で逆にされたサンプルをフィルターにかけて、円形の包旋状態を使用するのによるセクション3.5.2のようにオールフィルタを渡してください。 4)時間そして、フィルターにかけることのサンプルを逆にすること。 (その他の詳細がセクション4.2にあります。)

   A reference implementation of the start-state encoding can be found
   in Appendix A.46.

Appendix A.46でスタート州のコード化の参照実現を見つけることができます。

3.6.  Encoding the Remaining Samples

3.6. 残っているサンプルをコード化します。

   A dynamic codebook is used to encode 1) the 23/22 remaining samples
   in the two sub-blocks containing the start state; 2) the sub-blocks
   after the start state in time; and 3) the sub-blocks before the start
   state in time.  Thus, the encoding target can be either the 23/22
   samples remaining of the 2 sub-blocks containing the start state, or
   a 40-sample sub-block.  This target can consist of samples that are
   indexed forward in time or backward in time, depending on the
   location of the start state.  The length of the target is denoted by
   lTarget.

スタート状態を含んでいて、ダイナミックな符号表はエンコード1) 2つのサブブロックの23/22個の残っているサンプルに使用されます。 2) 時間内にのスタート状態の後のサブブロック。 そして、始めの前のサブブロックが時間内に述べる3)。 したがって、コード化目標は、スタート状態を含む2つのサブブロックを残す23/22個のサンプルか40サンプルのサブブロックのどちらかであるかもしれません。 この目標は時間内に前方に時間内にか後方に索引をつけられるサンプルから成ることができます、スタート状態の位置によって。 目標の長さはlTargetによって指示されます。

   The coding is based on an adaptive codebook that is built from a
   codebook memory that contains decoded LPC excitation samples from the
   already encoded part of the block.  These samples are indexed in the
   same time direction as is the target vector and end at the sample
   instant prior to the first sample instant represented in the target
   vector.  The codebook memory has length lMem, which is equal to
   CB_MEML=147 for the two/four 40-sample sub-blocks and 85 for the
   23/22-sample sub-block.

コード化はブロックの既にコード化された部分からの解読されたLPC励振のサンプルを含む符号表メモリから造られる適応型の符号表に基づいています。 これらのサンプルは、目標ベクトルのように同じ時間方向に索引をつけられて、1番目の前の瞬間のサンプルの終わりに目標ベクトルで表された瞬間を抽出します。 符号表メモリには長さのlMemがあります。(2/4つの40サンプルのサブブロックと85に、lMemは23/22サンプルのサブブロックのためにCB_MEML=147と等しいです)。

   The following figure shows an overview of the encoding procedure.

以下の図はコード化手順の概観を示しています。

         +------------+    +---------------+    +-------------+
      -> | 1. Decode  | -> | 2. Mem setup  | -> | 3. Perc. W. | ->
         +------------+    +---------------+    +-------------+

+------------+ +---------------+ +-------------+ ->。| 1. 解読してください。| ->| 2. Memセットアップ| ->| 3. Perc。 W。 | ->+------------+ +---------------+ +-------------+

         +------------+    +-----------------+
      -> | 4. Search  | -> | 5. Upd. Target  | ------------------>
       | +------------+    +------------------ |
       ----<-------------<-----------<----------
                     stage=0..2

+------------+ +-----------------+ ->。| 4. 検索| ->| 5. Upd。 目標| ------------------>| +------------+ +------------------ | ----<-------------<-----------<---------- =0を上演してください。2

         +----------------+
      -> | 6. Recalc G[0] | ---------------> gains and CB indices
         +----------------+

+----------------+ ->。| 6. Recalc G[0]| --------------->利得とCBインデックスリスト+----------------+

   Figure 3.4.  Flow chart of the codebook search in the iLBC encoder.

図3.4。 iLBCエンコーダでの符号表検索のフローチャート。

Andersen, et al.              Experimental                     [Page 19]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[19ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   1. Decode the part of the residual that has been encoded so far,
      using the codebook without perceptual weighting.

1. 知覚の重さなしで符号表を使用して、今までのところコード化された残差の部分を解読してください。

   2. Set up the memory by taking data from the decoded residual.  This
      memory is used to construct codebooks.  For blocks preceding the
      start state, both the decoded residual and the target are time
      reversed (section 3.6.1).
   3. Filter the memory + target with the perceptual weighting filter
      (section 3.6.2).

2. 解読された残差からデータを取ることによって、メモリをセットアップしてください。 このメモリは、符号表を構成するのに使用されます。 スタート状態に先行するブロックに関しては、逆にされて(セクション3.6.1)、解読された残差と目標の両方が時間です。 3. 知覚の重さのフィルタ(セクション3.6.2)でメモリ+目標をフィルターにかけてください。

   4. Search for the best match between the target and the codebook
      vector.  Compute the optimal gain for this match and quantize that
      gain (section 3.6.4).

4. 目標と符号表ベクトルとの最も良いマッチを捜し求めてください。 このマッチのために最適の利得を計算してください、そして、その利得が(セクション3.6.4)であると量子化してください。

   5. Update the perceptually weighted target by subtracting the
      contribution from the selected codebook vector from the
      perceptually weighted memory (quantized gain times selected
      vector).  Repeat 4 and 5 for the two additional stages.

5. 選択された符号表ベクトルから知覚のに荷重しているメモリから貢献を引き算することによって、知覚のに荷重している目標をアップデートしてください(量子化された利得回はベクトルを選択しました)。 2つの追加ステージに4と5を繰り返してください。

   6. Calculate the energy loss due to encoding of the residual.  If
      needed, compensate for this loss by an upscaling and
      requantization of the gain for the first stage (section 3.7).

6. 残差のコード化によるエネルギー損について計算してください。 必要であるなら、第一段階(セクション3.7)に利得のupscalingと「再-量子化」によるこの損失を補ってください。

   The following sections provide an in-depth description of the
   different blocks of Figure 3.4.

以下のセクションは異なったブロックの図3.4の徹底的な記述を提供します。

3.6.1.  Codebook Memory

3.6.1. 符号表メモリ

   The codebook memory is based on the already encoded sub-blocks, so
   the available data for encoding increases for each new sub-block that
   has been encoded.  Until enough sub-blocks have been encoded to fill
   the codebook memory with data, it is padded with zeros.  The
   following figure shows an example of the order in which the sub-
   blocks are encoded for the 30 ms frame size if the start state is
   located in the last 58 samples of sub-block 2 and 3.

符号表メモリが既にコード化されたサブブロックに基づいているので、コード化のための利用可能なデータはコード化されたそれぞれの新しいサブブロックに増加します。 十分なサブブロックがデータで符号表メモリを満たすためにコード化されるまで、それはゼロで水増しされます。 以下の図は、スタート状態が2と3サブブロックの最後の58個のサンプルに位置しているかどうかをサブブロックが30msフレーム・サイズのためにコード化されるオーダーに関する例に示します。

   +-----------------------------------------------------+
   |  5     | 1  |///|////////|    2   |    3   |    4   |
   +-----------------------------------------------------+

+-----------------------------------------------------+ | 5 | 1 |///|////////| 2 | 3 | 4 | +-----------------------------------------------------+

   Figure 3.5.  The order from 1 to 5 in which the sub-blocks are
   encoded.  The slashed area is the start state.

図3.5。 サブブロックがコード化される1〜5までのオーダー。 なでぎりされた地域はスタート状態です。

Andersen, et al.              Experimental                     [Page 20]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[20ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   The first target sub-block to be encoded is number 1, and the
   corresponding codebook memory is shown in the following figure.  As
   the target vector comes before the start state in time, the codebook
   memory and target vector are time reversed; thus, after the block has
   been time reversed the search algorithm can be reused.  As only the
   start state has been encoded so far, the last samples of the codebook
   memory are padded with zeros.

コード化されるべき最初の目標サブブロックはNo.1です、そして、対応する符号表メモリは以下の図に示されます。 目標ベクトルが時間内にスタート状態に優先するとき、逆にされて、符号表メモリと目標ベクトルは時間です。 したがって、逆にされて、ブロックが時間になった後に検索アルゴリズムを再利用できます。 スタート状態だけが今までのところコード化されたとき、符号表メモリの最後のサンプルはゼロで水増しされます。

   +-------------------------
   |zeros|\\\\\\\\|\\\\|  1 |
   +-------------------------

+------------------------- |ゼロ|\\\\\\\\|\\\\| 1 | +-------------------------

   Figure 3.6.  The codebook memory, length lMem=85 samples, and the
   target vector 1, length 22 samples.

図3.6。 符号表メモリ、長さのlMem=85のサンプル、および目標ベクトル1、長さ22のサンプル。

   The next step is to encode sub-block 2 by using the memory that now
   has increased since sub-block 1 has been encoded.  The following
   figure shows the codebook memory for encoding of sub-block 2.

次のステップはサブブロック1がコード化されて以来今増加しているメモリを使用することによってサブブロック2をコード化することです。 以下の図はサブブロック2のコード化のための符号表メモリを示しています。

   +-----------------------------------
   | zeros | 1  |///|////////|    2   |
   +-----------------------------------

+----------------------------------- | ゼロ| 1 |///|////////| 2 | +-----------------------------------

   Figure 3.7.  The codebook memory, length lMem=147 samples, and the
   target vector 2, length 40 samples.

図3.7。 符号表メモリ、長さのlMem=147のサンプル、および目標ベクトル2、長さ40のサンプル。

   The next step is to encode sub-block 3 by using the memory which has
   been increased yet again since sub-blocks 1 and 2 have been encoded,
   but the sub-block still has to be padded with a few zeros.  The
   following figure shows the codebook memory for encoding of sub-block
   3.

次のステップは1と2サブブロックがコード化されましたが、サブブロックがいくつかのゼロでまだ水増しされなければならないので再びまだ増加しているメモリを使用することによってサブブロック3をコード化することです。 以下の図はサブブロック3のコード化のための符号表メモリを示しています。

   +------------------------------------------
   |zeros| 1  |///|////////|    2   |   3    |
   +------------------------------------------

+------------------------------------------ |ゼロ| 1 |///|////////| 2 | 3 | +------------------------------------------

   Figure 3.8.  The codebook memory, length lMem=147 samples, and the
   target vector 3, length 40 samples.

図3.8。 符号表メモリ、長さのlMem=147のサンプル、および目標ベクトル3、長さ40のサンプル。

   The next step is to encode sub-block 4 by using the memory which now
   has increased yet again since sub-blocks 1, 2, and 3 have been
   encoded.  This time, the memory does not have to be padded with
   zeros.  The following figure shows the codebook memory for encoding
   of sub-block 4.

次のステップはサブブロック1、2、および3がコード化されて以来今再びまだ増加しているメモリを使用することによってサブブロック4をコード化することです。 今回、メモリはゼロで水増しされる必要はありません。 以下の図はサブブロック4のコード化のための符号表メモリを示しています。

Andersen, et al.              Experimental                     [Page 21]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[21ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   +------------------------------------------
   |1|///|////////|    2   |   3    |   4    |
   +------------------------------------------

+------------------------------------------ |1|///|////////| 2 | 3 | 4 | +------------------------------------------

   Figure 3.9.  The codebook memory, length lMem=147 samples, and the
   target vector 4, length 40 samples.

図3.9。 符号表メモリ、長さのlMem=147のサンプル、および目標ベクトル4、長さ40のサンプル。

   The final target sub-block to be encoded is number 5, and the
   following figure shows the corresponding codebook memory.  As the
   target vector comes before the start state in time, the codebook
   memory and target vector are time reversed.

コード化されるべき最終的な目標サブブロックはNo.5です、そして、以下の図は対応する符号表メモリを示しています。 目標ベクトルが時間内にスタート状態に優先するとき、逆にされて、符号表メモリと目標ベクトルは時間です。

   +-------------------------------------------
   |  3  |   2    |\\\\\\\\|\\\\|  1 |   5    |
   +-------------------------------------------

+------------------------------------------- | 3 | 2 |\\\\\\\\|\\\\| 1 | 5 | +-------------------------------------------

   Figure 3.10.  The codebook memory, length lMem=147 samples, and the
   target vector 5, length 40 samples.

図3.10。 符号表メモリ、長さのlMem=147のサンプル、および目標ベクトル5、長さ40のサンプル。

   For the case of 20 ms frames, the encoding procedure looks almost
   exactly the same.  The only difference is that the size of the start
   state is 57 samples and that there are only three sub-blocks to be
   encoded.  The encoding order is the same as above, starting with the
   23-sample target and then encoding the two remaining 40-sample sub-
   blocks, first going forward in time and then going backward in time
   relative to the start state.

20個のmsフレームに関するケースがないかどうか、コード化手順はほとんどまさに同じに見えます。 唯一の違いはスタート状態のサイズが57個のサンプルであり、コード化されるために3つのサブブロックしかないということです。 コード化オーダーは次に、23サンプルの目標と次に、2つの残っている40サンプルのサブブロックをコード化することをきっかけに、時間内に、最初に、進んで、時間内にスタート状態に比例して逆行する上と同じです。

3.6.2.  Perceptual Weighting of Codebook Memory and Target

3.6.2. 符号表メモリと目標の知覚の重さ

   To provide a perceptual weighting of the coding error, a
   concatenation of the codebook memory and the target to be coded is
   all-pole filtered with the perceptual weighting filter specified in
   section 3.4.  The filter state of the weighting filter is set to
   zero.

コード化されるためにコード化誤りの知覚の重さ、符号表メモリの連結、および目標を提供するのは、知覚の重さのフィルタがセクション3.4で指定されている状態でフィルターにかけられたオールポールです。 重さの州がフィルターにかけるフィルタはゼロに設定されます。

      in(0..(lMem-1))            = unweighted codebook memory
      in(lMem..(lMem+lTarget-1)) = unweighted target signal

「非-重みを加え」られた目標(lMem(lMem+lTarget-1))=信号の「非-重みを加え」られた符号表(0(lMem-1))=メモリで

      in -> Wk(z) -> filtered,
          where Wk(z) is taken from the sub-block of the target

Wk(z)->がフィルターにかけた->で。そこでは、Wk(z)が目標のサブブロックから抜粋されます。

      weighted codebook memory = filtered(0..(lMem-1))
      weighted target signal = filtered(lMem..(lMem+lTarget-1))

=がフィルターにかけた荷重している符号表メモリ(0(lMem-1))は=がフィルターにかけた目標信号に重みを加えました。(lMem(lMem+lTarget-1))

   The codebook search is done with the weighted codebook memory and the
   weighted target, whereas the decoding and the codebook memory update
   uses the unweighted codebook memory.

符号表検索は、荷重している符号表メモリでしていて荷重している目標ですが、解読と符号表メモリアップデート用途は「非-重みを加え」られた符号表メモリです。

Andersen, et al.              Experimental                     [Page 22]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[22ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

3.6.3.  Codebook Creation

3.6.3. 符号表創造

   The codebook for the search is created from the perceptually weighted
   codebook memory.  It consists of two sections, where the first is
   referred to as the base codebook and the second as the expanded
   codebook, as it is created by linear combinations of the first.  Each
   of these two sections also has a subsection referred to as the
   augmented codebook.  The augmented codebook is only created and used
   for the coding of the 40-sample sub-blocks and not for the 23/22-
   sample sub-block case.  The codebook size used for the different
   sub-blocks and different stages are summarized in the table below.

検索のための符号表は知覚のに荷重している符号表メモリから作成されます。 それは2つのセクションから成ります、それが1つの番目ものの一次結合で作成されるとき。(そこでは、1番目が拡張符号表としてベース符号表と2番目と呼ばれます)。 また、それぞれのこれらの2つのセクションには、増大している符号表と呼ばれた小区分があります。 増大している符号表は、23/22サンプルサブブロックケースではなく、40サンプルのサブブロックのコード化に作成されるだけであり、使用されます。 異なったサブブロックに、中古の符号表サイズと異なったステージは以下のテーブルにまとめられます。

                              Stage
                        1               2 & 3
           --------------------------------------------
                22     128  (64+0)*2     128 (64+0)*2
   Sub-    1:st 40     256  (108+20)*2   128 (44+20)*2
   Blocks  2:nd 40     256  (108+20)*2   256 (108+20)*2
           3:rd 40     256  (108+20)*2   256 (108+20)*2
           4:th 40     256  (108+20)*2   256 (108+20)*2

ステージ1 2と3-------------------------------------------- 22 128 (64+0)*2 128 (64+0)*2 Sub- 1:st 40 256 (108+20)*2 128 (44+20)*2 Blocks 2:nd 40 256 (108+20)*2 256 (108+20)*2 3:rd 40 256 (108+20)*2 256 (108+20)*2 4:th 40 256 (108+20)*2 256 (108+20)*2

   Table 3.1.  Codebook sizes for the 30 ms mode.

3.1を見送ってください。 30msモードのための符号表サイズ。

   Table 3.1 shows the codebook size for the different sub-blocks and
   stages for 30 ms frames.  Inside the parentheses it shows how the
   number of codebook vectors is distributed, within the two sections,
   between the base/expanded codebook and the augmented base/expanded
   codebook.  It should be interpreted in the following way:
   (base/expanded cb + augmented base/expanded cb).  The total number of
   codebook vectors for a specific sub-block and stage is given by the
   following formula:

テーブル3.1は30個のmsフレームのために異なったサブブロックとステージに符号表サイズを案内しています。 括弧の中では、符号表ベクトルの数がどう分散されているかを示しています、2つのセクションの中で、ベース/拡張している符号表と増大しているベース/拡張している符号表の間で。 それは以下の方法で解釈されるべきです: (cb+増大しているベース/拡張しているcbを基づくか、または広げます。) 以下の公式で特定のサブブロックとステージへの符号表ベクトルの総数を与えます:

   Tot. cb vectors = base cb + aug. base cb + exp. cb + aug. exp. cb

幼児cbベクトルはベースcb+8月のベースcb+exp. cb+8月のexp. cbと等しいです。

   The corresponding values to Figure 3.1 for 20 ms frames are only
   slightly modified.  The short sub-block is 23 instead of 22 samples,
   and the 3:rd and 4:th sub-frame are not present.

20個のmsフレームへの図3.1への換算値はわずかに変更されるだけです。 第そして、短いサブブロックは、22個のサンプルの代わりに23と、3です:、4:、サブフレームは第存在していません。

3.6.3.1.  Creation of a Base Codebook

3.6.3.1. 基地の符号表の創造

   The base codebook is given by the perceptually weighted codebook
   memory that is mentioned in section 3.5.3.  The different codebook
   vectors are given by sliding a window of length 23/22 or 40, given by
   variable lTarget, over the lMem-long perceptually weighted codebook
   memory.  The indices are ordered so that the codebook vector
   containing sample (lMem-lTarget-n) to (lMem-n-1) of the codebook

セクション3.5.3で言及する知覚のに荷重している符号表メモリはベース符号表を与えます。 lMem長い知覚のに荷重している符号表メモリの上に可変lTargetによって与えられた長さ23/22か40の窓を滑らせることによって、異なった符号表ベクトルを与えます。 インデックスリストが注文されるので、符号表ベクトル含有は符号表の(lMem-n-1)に(lMem-lTarget-n)を抽出します。

Andersen, et al.              Experimental                     [Page 23]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[23ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   memory vector has index n, where n=0..lMem-lTarget.  Thus the total
   number of base codebook vectors is lMem-lTarget+1, and the indices
   are ordered from sample delay lTarget (23/22 or 40) to lMem+1 (86 or
   148).

メモリベクトルには、インデックスn、どこn=0があるか。lMem-lTarget。 したがって、ベース符号表ベクトルの総数はlMem-lTarget+1です、そして、インデックスリストはサンプル遅れlTarget(23/22か40)からlMem+1(86か148)まで注文されます。

3.6.3.2.  Codebook Expansion

3.6.3.2. 符号表拡大

   The base codebook is expanded by a factor of 2, creating an
   additional section in the codebook.  This new section is obtained by
   filtering the base codebook, base_cb, with a FIR filter with filter
   length CB_FILTERLEN=8.  The construction of the expanded codebook
   compensates for the delay of four samples introduced by the FIR
   filter.

符号表に追加セクションを創設して、ベース符号表は2の要素によって広げられます。 フィルタの長さのCB_FILTERLEN=8と共にFIRフィルタでベース符号表、ベース_cbをフィルターにかけることによって、この新しいセクションを入手します。 拡張符号表の工事はFIRフィルタによって紹介された4個のサンプルの遅れを補います。

   cbfiltersTbl[CB_FILTERLEN]={-0.033691, 0.083740, -0.144043,
                  0.713379, 0.806152, -0.184326,
                  0.108887, -0.034180};

cbfiltersTbl[CB_FILTERLEN]は-0.033691、0.083740、-0.144043、0.713379、0.806152、-0.184326、0.108887、-0.034180と等しいです。

                   ___
                   \
      exp_cb(k)=  + > cbfiltersTbl(i)*x(k-i+4)
                   /__
             i=0...(LPC_FILTERORDER-1)

___ \exp_cb(k)は+ >cbfiltersTbl(i)*x(k-i+4)/__i=0と等しいです…(LPC_FILTERORDER-1)

      where x(j) = base_cb(j) for j=0..lMem-1 and 0 otherwise

x(j)がj=0であるときにベース_cb(j)と等しいところ。lMem-1と0、そうではありませんさ

   The individual codebook vectors of the new filtered codebook, exp_cb,
   and their indices are obtained in the same fashion as described above
   for the base codebook.

ベース符号表のために上で説明されるのと同じファッションで新しいフィルターにかけることの符号表、exp_cb、およびそれらのインデックスリストの個々の符号表ベクトルを得ます。

3.6.3.3.  Codebook Augmentation

3.6.3.3. 符号表増大

   For cases where encoding entire sub-blocks, i.e., cbveclen=40, the
   base and expanded codebooks are augmented to increase codebook
   richness.  The codebooks are augmented by vectors produced by
   interpolation of segments.  The base and expanded codebook,
   constructed above, consists of vectors corresponding to sample delays
   in the range from cbveclen to lMem.  The codebook augmentation
   attempts to augment these codebooks with vectors corresponding to
   sample delays from 20 to 39.  However, not all of these samples are
   present in the base codebook and expanded codebook, respectively.
   Therefore, the augmentation vectors are constructed as linear
   combinations between samples corresponding to sample delays in the
   range 20 to 39.  The general idea of this procedure is presented in
   the following figures and text.  The procedure is performed for both
   the base codebook and the expanded codebook.

ケースにおいて、ベースと拡張符号表は、符号表豊かを増加させるように全体のサブブロック、すなわち、cbveclen=40をコード化するところで増大します。 符号表はセグメントの挿入で生産されたベクトルによって増大させられます。 上で構成されたベースと拡張符号表はcbveclenからlMemまでの範囲で遅れを抽出するために対応するベクトルから成ります。 符号表増大は、ベクトルが20〜39まで遅れを抽出するために対応していた状態でこれらの符号表を増大させるのを試みます。 しかしながら、これらのサンプルのすべてがベース符号表と拡張符号表にそれぞれ出席しているというわけではありません。 したがって、増大ベクトルは範囲で20〜39に遅れを抽出するために対応するサンプルの間の一次結合として構成されます。 この手順の概念は以下の数字とテキストに提示されます。 手順はベース符号表と拡張符号表の両方のために実行されます。

Andersen, et al.              Experimental                     [Page 24]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[24ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       - - ------------------------|
    codebook memory                |
       - - ------------------------|
                  |-5-|---15---|-5-|
                  pi  pp       po

- - ------------------------| 符号表メモリ| - - ------------------------| |-5-|---15---|-5-| パイpp po

                      |        |                       Codebook vector
                      |---15---|-5-|-----20-----|   <- corresponding to
                          i     ii      iii            sample delay 20

| | 符号表ベクトル|---15---|-5-|-----20-----| <。 i ii iiiサンプル遅れ20に対応しています。

   Figure 3.11.  Generation of the first augmented codebook.

図3.11。 1番目の世代は符号表を増大させました。

   Figure 3.11 shows the codebook memory with pointers pi, pp, and po,
   where pi points to sample 25, pp to sample 20, and po to sample 5.
   Below the codebook memory, the augmented codebook vector
   corresponding to sample delay 20 is drawn.  Segment i consists of
   fifteen samples from pointer pp and forward in time.  Segment ii
   consists of five interpolated samples from pi and forward and from po
   and forward.  The samples are linearly interpolated with weights
   [0.0, 0.2, 0.4, 0.6, 0.8] for pi and weights [1.0, 0.8, 0.6, 0.4,
   0.2] for po.  Segment iii consists of twenty samples from pp and
   forward.  The augmented codebook vector corresponding to sample delay
   21 is produced by moving pointers pp and pi one sample backward in
   time.  This gives us the following figure.

図3.11はポインタパイ、pp、およびpoで符号表メモリを示しています、サンプル5に20、およびpoを抽出するpp。(そこでは、パイがサンプル25を示します)。 符号表メモリの下では、遅れ20を抽出するために対応する増大している符号表ベクトルは描かれます。 セグメントiは時間内に、ポインタppとフォワードからの15個のサンプルから成ります。 セグメントiiは前方とパイとpoからの5個の補間されたサンプルとフォワードから成ります。 サンプルはパイのための重り[0.0、0.2、0.4、0.6、0.8]とpoのための重り[1.0、0.8、0.6、0.4、0.2]で直線的に補間されます。 セグメントiiiはppとフォワードからの20個のサンプルから成ります。 遅れ21を抽出するために対応する増大している符号表ベクトルは、時間内に、ポインタppとパイ1のサンプルを動かすことによって、後方に生産されます。 これは以下の図を私たちに与えます。

       - - ------------------------|
    codebook memory                |
       - - ------------------------|
                  |-5-|---16---|-5-|
                  pi  pp       po

- - ------------------------| 符号表メモリ| - - ------------------------| |-5-|---16---|-5-| パイpp po

                      |        |                       Codebook vector
                      |---16---|-5-|-----19-----|   <- corresponding to
                          i     ii      iii            sample delay 21

| | 符号表ベクトル|---16---|-5-|-----19-----| <。 i ii iiiサンプル遅れ21に対応しています。

   Figure 3.12.  Generation of the second augmented codebook.

図3.12。 2番目の世代は符号表を増大させました。

   Figure 3.12 shows the codebook memory with pointers pi, pp and po
   where pi points to sample 26, pp to sample 21, and po to sample 5.
   Below the codebook memory, the augmented codebook vector
   corresponding to sample delay 21 is drawn.  Segment i now consists of
   sixteen samples from pp and forward.  Segment ii consists of five
   interpolated samples from pi and forward and from po and forward, and
   the interpolation weights are the same throughout the procedure.
   Segment iii consists of nineteen samples from pp and forward.  The
   same procedure of moving the two pointers is continued until the last
   augmented vector corresponding to sample delay 39 has been created.
   This gives a total of twenty new codebook vectors to each of the two

図3.12は、パイがサンプル26をどこに示すかをポインタパイ、pp、およびpoがある符号表メモリに示します、サンプル5に21、およびpoを抽出するpp。 符号表メモリの下では、遅れ21を抽出するために対応する増大している符号表ベクトルは描かれます。 現在、セグメントiはppとフォワードからの16個のサンプルから成ります。 セグメントiiは前方とパイとpoからの5個の補間されたサンプルとフォワードから成ります、そして、挿入重りは手順中で同じです。 セグメントiiiはppとフォワードからの19個のサンプルから成ります。 遅れ39を抽出するために対応する最後に増大しているベクトルが作成されるまで、2個のポインタを動かす同じ手順は続けられています。 これは合計20の新しい符号表ベクトルをそれぞれ2つに与えます。

Andersen, et al.              Experimental                     [Page 25]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[25ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   sections.  Thus the total number of codebook vectors for each of the
   two sections, when including the augmented codebook, becomes lMem-
   SUBL+1+SUBL/2.  This is provided that augmentation is evoked, i.e.,
   that lTarget=SUBL.

セクション。 増大している符号表を含んでいるとき、したがって、それぞれの2つのセクションへの符号表ベクトルの総数はlMem- SUBL+1+SUBL/2になります。 これは増大が喚起されるかどうかということであり、すなわち、それはlTarget=SUBLです。

3.6.4.  Codebook Search

3.6.4. 符号表検索

   The codebook search uses the codebooks described in the sections
   above to find the best match of the perceptually weighted target, see
   section 3.6.2.  The search method is a multi-stage gain-shape
   matching performed as follows.  At each stage the best shape vector
   is identified, then the gain is calculated and quantized, and finally
   the target is updated in preparation for the next codebook search
   stage.  The number of stages is CB_NSTAGES=3.

符号表検索は知覚のに荷重している目標の最も良いマッチを見つけるためには上のセクションで説明された符号表を使用します、とセクション3.6.2が見ます。 検索方法は利得形のマッチングが以下の通り実行したマルチステージです。 各段階で最も良い形のベクトルを特定します、そして、次に、利得を計算して、量子化します、そして、次の符号表検索ステージに備えて最終的に目標をアップデートします。 ステージの数はCB_NSTAGES=3です。

   If the target is the 23/22-sample vector the codebooks are indexed so
   that the base codebook is followed by the expanded codebook.  If the
   target is 40 samples the order is as follows: base codebook,
   augmented base codebook, expanded codebook, and augmented expanded
   codebook.  The size of each codebook section and its corresponding
   augmented section is given by Table 3.1 in section 3.6.3.

符号表が目標が23/22サンプルのベクトルであるなら索引をつけられるので、拡張符号表はベース符号表のあとに続いています。 目標が40個のサンプルであるなら、オーダーは以下の通りです: ベース符号表(増大しているベース符号表)は、符号表を広げて、拡張符号表を増大させました。 それぞれの符号表部とその対応する増大しているセクションのサイズはセクション3.6.3でTable3.1によって与えられています。

   For example, when the second 40-sample sub-block is coded, indices 0
   - 107 correspond to the base codebook, 108 - 127 correspond to the
   augmented base codebook, 128 - 235 correspond to the expanded
   codebook, and indices 236 - 255 correspond to the augmented expanded
   codebook.  The indices are divided in the same fashion for all stages
   in the example.  Only in the case of coding the first 40-sample sub-
   block is there a difference between stages (see Table 3.1).

2番目の40サンプルのサブブロックがコード化されるとき、例えば、インデックスリスト0--107はベース符号表に一致しています、そして、108--127は増大しているベース符号表に対応しています、そして、128--235は拡張符号表に対応しています、そして、インデックスリスト236--255は増大している拡張符号表に一致しています。 インデックスリストは例のすべてのステージへの同じファッションで分割されます。 最初の40サンプルのサブブロックをコード化する場合だけには、ステージの間には、違いがあります(Table3.1を見てください)。

3.6.4.1.  Codebook Search at Each Stage

3.6.4.1. 各段階での符号表検索

   The codebooks are searched to find the best match to the target at
   each stage.  When the best match is found, the target is updated and
   the next-stage search is started.  The three chosen codebook vectors
   and their corresponding gains constitute the encoded sub-block.  The
   best match is decided by the following three criteria:

符号表は、各段階でと最も良い一致したものを目標として探すために捜されます。 最も良いマッチを見つけるとき、目標をアップデートします、そして、次のステージ検索を始めます。 3つの選ばれた符号表ベクトルとそれらの対応する利得はコード化されたサブブロックを構成します。 最も良いマッチは以下の3つの評価基準によって決められます:

   1. Compute the measure

1. 測定を計算してください。

      (target*cbvec)^2 / ||cbvec||^2

(目標*cbvec)^2/||cbvec||^2

   for all codebook vectors, cbvec, and choose the codebook vector
   maximizing the measure.  The expression (target*cbvec) is the dot
   product between the target vector to be coded and the codebook vector
   for which we compute the measure.  The norm, ||x||, is defined as the
   square root of (x*x).

すべての符号表ベクトルに、測定を最大にする符号表ベクトルを、cbvecして、選んでください。 表現(目標*cbvec)はコード化されるべき目標ベクトルと私たちが測定を計算する符号表ベクトルの間のドット製品です。 標準||x||, (x*x)の平方根と定義されます。

Andersen, et al.              Experimental                     [Page 26]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[26ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   2. The absolute value of the gain, corresponding to the chosen
      codebook vector, cbvec, must be smaller than a fixed limit,
      CB_MAXGAIN=1.3:

2. 利得の絶対値、選ばれた符号表ベクトルとの対応(cbvec)は固定限界より小さいに違いありません、CB_MAXGAIN=1.3:

            |gain| < CB_MAXGAIN

| 獲得してください。| <CB_MAXGAIN

      where the gain is computed in the following way:

利得が以下の方法で計算されるところ:

            gain = (target*cbvec) / ||cbvec||^2

利得=(目標*cbvec)/||cbvec||^2

   3. For the first stage, the dot product of the chosen codebook vector
      and target must be positive:

3. 第一段階において、選ばれた符号表ベクトルと目標のドット製品は積極的であるに違いありません:

      target*cbvec > 0

目標*cbvec>0

   In practice the above criteria are used in a sequential search
   through all codebook vectors.  The best match is found by registering
   a new max measure and index whenever the previously registered max
   measure is surpassed and all other criteria are fulfilled.  If none
   of the codebook vectors fulfill (2) and (3), the first codebook
   vector is selected.

実際には、上の評価基準はすべての符号表ベクトルを通した連続した検索に使用されます。 最も良いマッチは、以前に登録された最大測定が凌がれていて、他のすべての評価基準が満たされるときはいつも、新しい最大測定とインデックスを示すことによって、見つけられます。 符号表ベクトルのいずれも(2)と(3)を実現させないなら、最初の符号表ベクトルは選択されます。

3.6.4.2.  Gain Quantization at Each Stage

3.6.4.2. 各段階で量子化を獲得してください。

   The gain follows as a result of the computation

利得は計算の結果、従います。

      gain = (target*cbvec) / ||cbvec||^2

利得=(目標*cbvec)/||cbvec||^2

   for the optimal codebook vector found by the procedure in section
   3.6.4.1.

セクション3.6.4における手順によって.1に見つけられた最適の符号表ベクトルのために

   The three stages quantize the gain, using 5, 4, and 3 bits,
   respectively.  In the first stage, the gain is limited to positive
   values.  This gain is quantized by finding the nearest value in the
   quantization table gain_sq5Tbl.

3つのステージが5、4、および3ビットに、それぞれ利得、使用を量子化します。 第一段階では、利得が正の数に制限されます。 この利得は、量子化テーブル利得_sq5Tblで最も近い値を見つけることによって、量子化されます。

   gain_sq5Tbl[32]={0.037476, 0.075012, 0.112488, 0.150024, 0.187500,
                  0.224976, 0.262512, 0.299988, 0.337524, 0.375000,
                  0.412476, 0.450012, 0.487488, 0.525024, 0.562500,
                  0.599976, 0.637512, 0.674988, 0.712524, 0.750000,
                  0.787476, 0.825012, 0.862488, 0.900024, 0.937500,
                  0.974976, 1.012512, 1.049988, 1.087524, 1.125000,
                  1.162476, 1.200012}

利得_sq5Tbl[32]={0.037476, 0.075012, 0.112488, 0.150024, 0.187500, 0.224976, 0.262512, 0.299988, 0.337524, 0.375000, 0.412476, 0.450012, 0.487488, 0.525024, 0.562500, 0.599976, 0.637512, 0.674988, 0.712524, 0.750000, 0.787476, 0.825012, 0.862488, 0.900024, 0.937500, 0.974976, 1.012512, 1.049988, 1.087524, 1.125000, 1.162476, 1.200012}

   The gains of the subsequent two stages can be either positive or
   negative.  The gains are quantized by using a quantization table
   times a scale factor.  The second stage uses the table gain_sq4Tbl,
   and the third stage uses gain_sq3Tbl.  The scale factor equates 0.1

その後の2つのステージの獲得は、肯定しているか、または否定している場合があります。 利得は、1位取り因数あたり1つの量子化テーブル回数を使用することによって、量子化されます。 2番目のステージはテーブル利得_sq4Tblを使用します、そして、3番目のステージは利得_sq3Tblを使用します。 位取り因数は0.1を等しくします。

Andersen, et al.              Experimental                     [Page 27]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[27ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   or the absolute value of the quantized gain representation value
   obtained in the previous stage, whichever is larger.  Again, the
   resulting gain index is the index to the nearest value of the
   quantization table times the scale factor.

または、どれがさらに大きいかなら前の段階で得られた量子化された利得表現価値の絶対値。 一方、結果として起こる利得インデックスはスケールが因数分解する量子化テーブル回数の最も近い値へのインデックスです。

        gainQ = scaleFact * gain_sqXTbl[index]

gainQはscaleFact*利得_sqXTblと等しいです。[インデックス]

   gain_sq4Tbl[16]={-1.049988, -0.900024, -0.750000, -0.599976,
                  -0.450012, -0.299988, -0.150024, 0.000000, 0.150024,
                  0.299988, 0.450012, 0.599976, 0.750000, 0.900024,
                  1.049988, 1.200012}

利得_sq4Tbl[16]={-1.049988, -0.900024, -0.750000, -0.599976, -0.450012, -0.299988, -0.150024, 0.000000, 0.150024, 0.299988, 0.450012, 0.599976, 0.750000, 0.900024, 1.049988, 1.200012}

   gain_sq3Tbl[8]={-1.000000, -0.659973, -0.330017,0.000000,
                  0.250000, 0.500000, 0.750000, 1.00000}

利得_sq3Tbl[8]={-1.000000, -0.659973, -0.330017,0.000000, 0.250000, 0.500000, 0.750000, 1.00000}

3.6.4.3.  Preparation of Target for Next Stage

3.6.4.3. 次のステージのための目標の準備

   Before performing the search for the next stage, the perceptually
   weighted target vector is updated by subtracting from it the selected
   codebook vector (from the perceptually weighted codebook) times the
   corresponding quantized gain.

次のステージの検索を実行する前に、それから選択された符号表ベクトル(知覚のに荷重している符号表からの)回を対応が利得を量子化した引き算することによって、知覚のに荷重している目標ベクトルをアップデートします。

      target[i] = target[i] - gainQ * selected_vec[i];

目標[i]は目標[i]と等しいです--gainQ*は_vec[i]を選択しました。

   A reference implementation of the codebook encoding is found in
   Appendix A.34.

符号表コード化の参照実現はAppendix A.34で見つけられます。

3.7.  Gain Correction Encoding

3.7. 利得修正コード化

   The start state is quantized in a relatively model independent manner
   using 3 bits per sample.  In contrast, the remaining parts of the
   block are encoded by using an adaptive codebook.  This codebook will
   produce high matching accuracy whenever there is a high correlation
   between the target and the best codebook vector.  For unvoiced speech
   segments and background noises, this is not necessarily so, which,
   due to the nature of the squared error criterion, results in a coded
   signal with less power than the target signal.  As the coded start
   state has good power matching to the target, the result is a power
   fluctuation within the encoded frame.  Perceptually, the main problem
   with this is that the time envelope of the signal energy becomes
   unsteady.  To overcome this problem, the gains for the codebooks are
   re-scaled after the codebook encoding by searching for a new gain
   factor for the first stage codebook that provides better power
   matching.

スタート状態は、1サンプルあたり3ビットを使用しながら、モデルから比較的独立している方法で量子化されます。 対照的に、ブロックの残存部分は、適応型の符号表を使用することによって、コード化されます。 目標と最も良い符号表ベクトルの間には、高い相関関係があると、この符号表は必ず高い合っている精度を生産するでしょう。 必ずしたがって、暗黙のスピーチセグメントとバックグラウンドノイズのために、これはそうではありません(二乗された誤り評価基準の本質のため目標信号より少ないパワーでコード化された信号をもたらします)。 コード化されたスタート州に目標に合っている良いパワーがあるとき、結果はコード化されたフレームの中の電源変動です。 Perceptuallyに、これに関する主な問題は信号エネルギーの時間封筒が不安定になるということです。 この問題を克服するために、符号表のための利得は提供される第一段階符号表のための新たな利益要素を検索するのによる符号表コード化の後再スケーリングされたより良いパワーマッチングです。

   First, the energy for the target signal, tene, is computed along with
   the energy for the coded signal, cene, given by the addition of the
   three gain scaled codebook vectors.  Because the gains of the second

まず最初に、目標信号のためのエネルギー(tene)はコード化された信号、3つの利得のスケーリングされた符号表ベクトルの添加で与えられているceneのためにエネルギーと共に計算されます。 2番目の獲得

Andersen, et al.              Experimental                     [Page 28]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[28ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   and third stage scale with the gain of the first stage, when the
   first stage gain is changed from gain[0] to gain_sq5Tbl[i] the energy
   of the coded signal changes from cene to

そして、利得_sq5Tbl[i]へのコード化された信号のエネルギーがceneから変化する利得[0]から第一段階利得を変えるときの第一段階の獲得がある3番目のステージスケール

      cene*(gain_sq5Tbl[i]*gain_sq5Tbl[i])/(gain[0]*gain[0])

cene*、(利得_sq5Tbl[i]*は_sq5Tbl[i])/を獲得します。([0]*利得[0])を獲得してください。

   where gain[0] is the gain for the first stage found in the original
   codebook search.  A refined search is performed by testing the gain
   indices i=0 to 31, and as long as the new codebook energy as given
   above is less than tene, the gain index for stage 1 is increased.  A
   restriction is applied so that the new gain value for stage 1 cannot
   be more than two times higher than the original value found in the
   codebook search.  Note that by using this method we do not change the
   shape of the encoded vector, only the gain or amplitude.

利得[0]がオリジナルの符号表で見つけられた第一段階への利得であるところでは、探してください。 洗練された検索は利得インデックスリストi=0を31にテストすることによって、実行されます、そして、上に与えられている新しい符号表エネルギーがtene以下である限り、ステージ1への利得インデックスは増加されています。 制限は、ステージ1への新たな利益値が符号表検索で見つけられた元の値より2倍以上高いはずがないように、適用されています。 この方法を使用することによって、私たちがコード化されたベクトル、利得または振幅だけの形を変えないことに注意してください。

3.8.  Bitstream Definition

3.8. Bitstream定義

   The total number of bits used to describe one frame of 20 ms speech
   is 304, which fits in 38 bytes and results in a bit rate of 15.20
   kbit/s.  For the case of a frame length of 30 ms speech, the total
   number of bits used is 400, which fits in 50 bytes and results in a
   bit rate of 13.33 kbit/s.  In the bitstream definition, the bits are
   distributed into three classes according to their bit error or loss
   sensitivity.  The most sensitive bits (class 1) are placed first in
   the bitstream for each frame.  The less sensitive bits (class 2) are
   placed after the class 1 bits.  The least sensitive bits (class 3)
   are placed at the end of the bitstream for each frame.

20msスピーチの1個のフレームについて説明するのに使用されるビットの総数は304です(15.20kbit/sのレートを38バイトうまくはめ込んで、少しもたらします)。 30msスピーチのフレームの長さに関するケースのために、中古であるビットの総数は400です(13.33kbit/sのレートを50バイトうまくはめ込んで、少しもたらします)。 bitstream定義では、それらの噛み付いている誤りか損失感度に従って、ビットは3つのクラスに分配されます。 最も敏感なビット(クラス1)は各フレームのために最初に、bitstreamに置かれます。 それほど敏感でないビット(クラス2)はクラスの後に1ビット置かれます。 最も敏感でないビット(クラス3)は各フレームのためにbitstreamの端に置かれます。

   In the 20/30 ms frame length cases for each class, the following hold
   true: The class 1 bits occupy a total of 6/8 bytes (48/64 bits), the
   class 2 bits occupy 8/12 bytes (64/96 bits), and the class 3 bits
   occupy 24/30 bytes (191/239 bits).  This distribution of the bits
   enables the use of uneven level protection (ULP) as is exploited in
   the payload format definition for iLBC [1].  The detailed bit
   allocation is shown in the table below.  When a quantization index is
   distributed between more classes, the more significant bits belong to
   the lowest class.

各クラスあたり20/30のmsフレーム長さの場合では、以下は有効です: 1ビットが合計6/8バイト(48/64ビット)占領するクラス、2ビットが8/12バイト(64/96ビット)占領するクラス、および3ビットが24/30バイト(191/239ビット)占領するクラス。 ビットのこの分配はiLBC[1]にペイロード形式定義で利用される不ぞろいなレベル保護(ULP)の使用を可能にします。 詳細な噛み付いている配分は以下のテーブルに示されます。 量子化インデックスが、より多くのクラスの間に配布されるとき、より重要なビットは最も低いクラスのものです。

Andersen, et al.              Experimental                     [Page 29]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[29ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   Bitstream structure:

Bitstream構造:

   ------------------------------------------------------------------+
   Parameter                         |       Bits Class <1,2,3>      |
                                     |  20 ms frame  |  30 ms frame  |
   ----------------------------------+---------------+---------------+
                            Split 1  |   6 <6,0,0>   |   6 <6,0,0>   |
                   LSF 1    Split 2  |   7 <7,0,0>   |   7 <7,0,0>   |
   LSF                      Split 3  |   7 <7,0,0>   |   7 <7,0,0>   |
                   ------------------+---------------+---------------+
                            Split 1  | NA (Not Appl.)|   6 <6,0,0>   |
                   LSF 2    Split 2  |      NA       |   7 <7,0,0>   |
                            Split 3  |      NA       |   7 <7,0,0>   |
                   ------------------+---------------+---------------+
                   Sum               |  20 <20,0,0>  |  40 <40,0,0>  |
   ----------------------------------+---------------+---------------+
   Block Class                       |   2 <2,0,0>   |   3 <3,0,0>   |
   ----------------------------------+---------------+---------------+
   Position 22 sample segment        |   1 <1,0,0>   |   1 <1,0,0>   |
   ----------------------------------+---------------+---------------+
   Scale Factor State Coder          |   6 <6,0,0>   |   6 <6,0,0>   |
   ----------------------------------+---------------+---------------+
                   Sample 0          |   3 <0,1,2>   |   3 <0,1,2>   |
   Quantized       Sample 1          |   3 <0,1,2>   |   3 <0,1,2>   |
   Residual           :              |   :    :      |   :    :      |
   State              :              |   :    :      |   :    :      |
   Samples            :              |   :    :      |   :    :      |
                   Sample 56         |   3 <0,1,2>   |   3 <0,1,2>   |
                   Sample 57         |      NA       |   3 <0,1,2>   |
                   ------------------+---------------+---------------+
                   Sum               | 171 <0,57,114>| 174 <0,58,116>|
   ----------------------------------+---------------+---------------+
                            Stage 1  |   7 <6,0,1>   |   7 <4,2,1>   |
   CB for 22/23             Stage 2  |   7 <0,0,7>   |   7 <0,0,7>   |
   sample block             Stage 3  |   7 <0,0,7>   |   7 <0,0,7>   |
                   ------------------+---------------+---------------+
                   Sum               |  21 <6,0,15>  |  21 <4,2,15>  |
   ----------------------------------+---------------+---------------+
                            Stage 1  |   5 <2,0,3>   |   5 <1,1,3>   |
   Gain for 22/23           Stage 2  |   4 <1,1,2>   |   4 <1,1,2>   |
   sample block             Stage 3  |   3 <0,0,3>   |   3 <0,0,3>   |
                   ------------------+---------------+---------------+
                   Sum               |  12 <3,1,8>   |  12 <2,2,8>   |
   ----------------------------------+---------------+---------------+
                            Stage 1  |   8 <7,0,1>   |   8 <6,1,1>   |
               sub-block 1  Stage 2  |   7 <0,0,7>   |   7 <0,0,7>   |
                            Stage 3  |   7 <0,0,7>   |   7 <0,0,7>   |
                   ------------------+---------------+---------------+

------------------------------------------------------------------+ パラメタ| ビットクラス<1、2、3>。| | 20msフレーム| 30msフレーム| ----------------------------------+---------------+---------------+ 分裂1| 6 <6、0、0>。| 6 <6、0、0>。| LSF1分裂2| 7 <7、0、0>。| 7 <7、0、0>。| LSF分裂3| 7 <7、0、0>。| 7 <7、0、0>。| ------------------+---------------+---------------+ 分裂1| Na(Applでない。)| 6 <6、0、0>。| LSF2分裂2| Na| 7 <7、0、0>。| 分裂3| Na| 7 <7、0、0>。| ------------------+---------------+---------------+ 合計| 20 <20、0、0>。| 40 <40、0、0>。| ----------------------------------+---------------+---------------+ ブロックのクラス| 2 <2、0、0>。| 3 <3、0、0>。| ----------------------------------+---------------+---------------+ 位置22のサンプルセグメント| 1 <1、0、0>。| 1 <1、0、0>。| ----------------------------------+---------------+---------------+ 位取り因数州の符号化器| 6 <6、0、0>。| 6 <6、0、0>。| ----------------------------------+---------------+---------------+ サンプル0| 3 <0、1、2>。| 3 <0、1、2>。| サンプル1であると量子化されます。| 3 <0、1、2>。| 3 <0、1、2>。| 残差: | : : | : : | 州: | : : | : : | サンプル: | : : | : : | サンプル56| 3 <0、1、2>。| 3 <0、1、2>。| サンプル57| Na| 3 <0、1、2>。| ------------------+---------------+---------------+ 合計| 171 <0、57,114>| 174 <0、58,116>| ----------------------------------+---------------+---------------+ ステージ1| 7 <6、0、1>。| 7 <4、2、1>。| 22/23ステージ2へのCB| 7 <0、0、7>。| 7 <0、0、7>。| サンプルブロックStage3| 7 <0、0、7>。| 7 <0、0、7>。| ------------------+---------------+---------------+ 合計| 21 <6、0、15>。| 21 <4、2、15>。| ----------------------------------+---------------+---------------+ ステージ1| 5 <2、0、3>。| 5 <1、1、3>。| 22/23舞台2に獲得してください。| 4 <1、1、2>。| 4 <1、1、2>。| サンプルブロックStage3| 3 <0、0、3>。| 3 <0、0、3>。| ------------------+---------------+---------------+ 合計| 12 <3、1、8>。| 12 <2、2、8>。| ----------------------------------+---------------+---------------+ ステージ1| 8 <7、0、1>。| 8 <6、1、1>。| サブブロック1Stage2| 7 <0、0、7>。| 7 <0、0、7>。| ステージ3| 7 <0、0、7>。| 7 <0、0、7>。| ------------------+---------------+---------------+

Andersen, et al.              Experimental                     [Page 30]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[30ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

                            Stage 1  |   8 <0,0,8>   |   8 <0,7,1>   |
               sub-block 2  Stage 2  |   8 <0,0,8>   |   8 <0,0,8>   |
   Indices                  Stage 3  |   8 <0,0,8>   |   8 <0,0,8>   |
   for CB          ------------------+---------------+---------------+
   sub-blocks               Stage 1  |      NA       |   8 <0,7,1>   |
               sub-block 3  Stage 2  |      NA       |   8 <0,0,8>   |
                            Stage 3  |      NA       |   8 <0,0,8>   |
                   ------------------+---------------+---------------+
                            Stage 1  |      NA       |   8 <0,7,1>   |
               sub-block 4  Stage 2  |      NA       |   8 <0,0,8>   |
                            Stage 3  |      NA       |   8 <0,0,8>   |
                   ------------------+---------------+---------------+
                   Sum               |  46 <7,0,39>  |  94 <6,22,66> |
   ----------------------------------+---------------+---------------+
                            Stage 1  |   5 <1,2,2>   |   5 <1,2,2>   |
               sub-block 1  Stage 2  |   4 <1,1,2>   |   4 <1,2,1>   |
                            Stage 3  |   3 <0,0,3>   |   3 <0,0,3>   |
                   ------------------+---------------+---------------+
                            Stage 1  |   5 <1,1,3>   |   5 <0,2,3>   |
               sub-block 2  Stage 2  |   4 <0,2,2>   |   4 <0,2,2>   |
                            Stage 3  |   3 <0,0,3>   |   3 <0,0,3>   |
   Gains for       ------------------+---------------+---------------+
   sub-blocks               Stage 1  |      NA       |   5 <0,1,4>   |
               sub-block 3  Stage 2  |      NA       |   4 <0,1,3>   |
                            Stage 3  |      NA       |   3 <0,0,3>   |
                   ------------------+---------------+---------------+
                            Stage 1  |      NA       |   5 <0,1,4>   |
               sub-block 4  Stage 2  |      NA       |   4 <0,1,3>   |
                            Stage 3  |      NA       |   3 <0,0,3>   |
                   ------------------+---------------+---------------+
                   Sum               |  24 <3,6,15>  |  48 <2,12,34> |
   ----------------------------------+---------------+---------------+
   Empty frame indicator             |   1 <0,0,1>   |   1 <0,0,1>   |
   -------------------------------------------------------------------
   SUM                                 304 <48,64,192> 400 <64,96,240>

ステージ1| 8 <0、0、8>。| 8 <0、7、1>。| サブブロック2Stage2| 8 <0、0、8>。| 8 <0、0、8>。| インデックスリストは3を上演します。| 8 <0、0、8>。| 8 <0、0、8>。| CBのために------------------+---------------+---------------+ サブブロックStage1| Na| 8 <0、7、1>。| サブブロック3Stage2| Na| 8 <0、0、8>。| ステージ3| Na| 8 <0、0、8>。| ------------------+---------------+---------------+ ステージ1| Na| 8 <0、7、1>。| サブブロック4Stage2| Na| 8 <0、0、8>。| ステージ3| Na| 8 <0、0、8>。| ------------------+---------------+---------------+ 合計| 46 <7、0、39>。| 94 <6、22、66>。| ----------------------------------+---------------+---------------+ ステージ1| 5 <1、2、2>。| 5 <1、2、2>。| サブブロック1Stage2| 4 <1、1、2>。| 4 <1、2、1>。| ステージ3| 3 <0、0、3>。| 3 <0、0、3>。| ------------------+---------------+---------------+ ステージ1| 5 <1、1、3>。| 5 <0、2、3>。| サブブロック2Stage2| 4 <0、2、2>。| 4 <0、2、2>。| ステージ3| 3 <0、0、3>。| 3 <0、0、3>。| 獲得します。------------------+---------------+---------------+ サブブロックStage1| Na| 5 <0、1、4>。| サブブロック3Stage2| Na| 4 <0、1、3>。| ステージ3| Na| 3 <0、0、3>。| ------------------+---------------+---------------+ ステージ1| Na| 5 <0、1、4>。| サブブロック4Stage2| Na| 4 <0、1、3>。| ステージ3| Na| 3 <0、0、3>。| ------------------+---------------+---------------+ 合計| 24 <3、6、15>。| 48 <2、12、34>。| ----------------------------------+---------------+---------------+ 空のフレームインディケータ| 1 <0、0、1>。| 1 <0、0、1>。| ------------------------------------------------------------------- 合計304<48、64,192>400<64、96,240>。

   Table 3.2.  The bitstream definition for iLBC for both the 20 ms
   frame size mode and the 30 ms frame size mode.

3.2を見送ってください。 20msフレーム・サイズモードと30msフレーム・サイズモードの両方のためのiLBCのためのbitstream定義。

   When packetized into the payload, the bits MUST be sorted as follows:
   All the class 1 bits in the order (from top to bottom) as specified
   in the table, all the class 2 bits (from top to bottom), and all the
   class 3 bits in the same sequential order.  The last bit, the empty
   frame indicator, SHOULD be set to zero by the encoder.  If this bit
   is set to 1 the decoder SHOULD treat the data as a lost frame.  For
   example, this bit can be set to 1 to indicate lost frame for file
   storage format, as in [1].

ペイロードにpacketizedされると、以下の通りビットを分類しなければなりません: テーブル、すべてのクラスで2ビット(上から下まで)指定されるオーダー(上から下まで)におけるクラス1ビット、および同じくらいに連続した3ビットが注文するすべてのクラス。 SHOULD、最終は噛み付いて、空のフレームはインディケータです。エンコーダによってゼロに設定されます。 このビットが1に設定されるなら、デコーダSHOULDは無くなっているフレームとしてデータを扱います。 例えば、[1]のように1にこのビットがファイル記憶装置形式のために無くなっているフレームを示すように設定できます。

Andersen, et al.              Experimental                     [Page 31]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[31ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

4.  Decoder Principles

4. デコーダ原則

   This section describes the principles of each component of the
   decoder algorithm.

このセクションはデコーダアルゴリズムのそれぞれの成分の原則について説明します。

              +-------------+    +--------+    +---------------+
   payload -> | 1. Get para | -> | 2. LPC | -> | 3. Sc Dequant | ->
              +-------------+    +--------+    +---------------+

+-------------+ +--------+ +---------------+ ペイロード->。| 1. パラを得てください。| ->| 2. LPC| ->| 3. Sc Dequant| ->+-------------+ +--------+ +---------------+

              +-------------+    +------------------+
           -> | 4. Mem setup| -> | 5. Construct res |------->
           |  +-------------+    +-------------------   |
           ---------<-----------<-----------<------------
                     Sub-frame 0...2/4 (20 ms/30 ms)

+-------------+ +------------------+ ->。| 4. Memセットアップ| ->| 5. 構造物res|、-、-、-、-、-、--、>| +-------------+ +------------------- | ---------<-----------<-----------<------------ サブフレーム0…2/4 (20ms/30ms)

              +----------------+    +----------+
           -> | 6. Enhance res | -> | 7. Synth | ------------>
              +----------------+    +----------+

+----------------+ +----------+ ->。| 6. resを高めてください。| ->| 7. Synth| ------------>+----------------+ +----------+

              +-----------------+
           -> | 8. Post Process | ----------------> decoded speech
              +-----------------+

+-----------------+ ->。| 8. ポストの過程| ---------------->はスピーチ+を解読しました。-----------------+

   Figure 4.1.  Flow chart of the iLBC decoder.  If a frame was lost,
   steps 1 to 5 SHOULD be replaced by a PLC algorithm.

図4.1。 iLBCデコーダのフローチャート。 フレームが失われて、1を踏むなら、5SHOULDには、いてください。PLCアルゴリズムに取り替えます。

   1. Extract the parameters from the bitstream.

1. bitstreamからパラメタを抜粋してください。

   2. Decode the LPC and interpolate (section 4.1).

2. LPCを解読してください、そして、(セクション4.1)を補間してください。

   3. Construct the 57/58-sample start state (section 4.2).

3. 57/58サンプルのスタート状態(セクション4.2)を構成してください。

   4. Set up the memory by using data from the decoded residual.  This
      memory is used for codebook construction.  For blocks preceding
      the start state, both the decoded residual and the target are time
      reversed.  Sub-frames are decoded in the same order as they were
      encoded.

4. 解読された残差からのデータを使用することによって、メモリをセットアップしてください。 このメモリは符号表工事に使用されます。 スタート状態に先行するブロックに関しては、逆にされて、解読された残差と目標の両方が時間です。 それらがコード化されたとき、サブフレームは同次で解読されます。

   5. Construct the residuals of this sub-frame (gain[0]*cbvec[0] +
      gain[1]*cbvec[1] + gain[2]*cbvec[2]).  Repeat 4 and 5 until the
      residual of all sub-blocks has been constructed.

5. このサブフレームの残差を構成してください。([0]*cbvec[0]+利得[1]*cbvec[1]+利得[2]*cbvec[2])を獲得してください。 すべてのサブブロックの残差までの反復4と5は構成されました。

   6. Enhance the residual with the post filter (section 4.6).

6. ポストフィルタ(セクション4.6)で残差を高めてください。

   7. Synthesis of the residual (section 4.7).

7. 残差(セクション4.7)の統合。

   8. Post process with HP filter, if desired (section 4.8).

8. 望まれているなら(セクション4.8)、HPフィルタで過程を掲示してください。

Andersen, et al.              Experimental                     [Page 32]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[32ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

4.1.  LPC Filter Reconstruction

4.1. LPCフィルタ再建

   The decoding of the LP filter parameters is very straightforward.
   For a set of three/six indices, the corresponding LSF vector(s) are
   found by simple table lookup.  For each of the LSF vectors, the three
   split vectors are concatenated to obtain qlsf1 and qlsf2,
   respectively (in the 20 ms mode only one LSF vector, qlsf, is
   constructed).  The next step is the stability check described in
   section 3.2.5 followed by the interpolation scheme described in
   section 3.2.6 (3.2.7 for 20 ms frames).  The only difference is that
   only the quantized LSFs are known at the decoder, and hence the
   unquantized LSFs are not processed.

LPフィルタパラメタの解読は非常に簡単です。 3/6つのインデックスリストのセットにおいて、対応するLSFベクトルは簡単な索表によって見つけられます。 それぞれのLSFベクトルにおいて、3つの分裂ベクトルが、それぞれqlsf1とqlsf2を入手するために連結されます(20msモードだけで、1つのLSFベクトル(qlsf)が構成されます)。 次のステップがセクション3.2.5で説明された安定性チェックがセクション3.2.6で説明された挿入計画で続いたということである、(3.2、.7、20個のmsフレーム) 唯一の違いは量子化されたLSFsだけがデコーダで知られていて、したがって、unquantized LSFsが処理されないということです。

   A reference implementation of the LPC filter reconstruction is given
   in Appendix A.36.

Appendix A.36でLPCフィルタ再建の参照実現を与えます。

4.2.  Start State Reconstruction

4.2. 州の再建を始めてください。

   The scalar encoded STATE_SHORT_LEN=58 (STATE_SHORT_LEN=57 in the 20
   ms mode) state samples are reconstructed by 1) forming a set of
   samples (by table lookup) from the index stream idxVec[n], 2)
   multiplying the set with 1/scal=(10^qmax)/4.5, 3) time reversing the
   57/58 samples, 4) filtering the time reversed block with the
   dispersion (all-pass) filter used in the encoder (as described in
   section 3.5.2); this compensates for the phase distortion of the
   earlier filter operation, and 5 reversing the 57/58 samples from the
   previous step.

インデックスの流れのidxVec[n]、2から1セットのサンプル(索表による)を形成するスカラのコード化された州_SHORT_レン=58(州_SHORT_LEN=57は1時までに20msモード) 州のサンプルで再建されます)) 57/58個のサンプル、4を逆にしながら、1/scal=4.5、(10^qmax)/3)時間でセットを掛けます) 時間をフィルターにかけると、分散(オール通る)フィルタがエンコーダで使用されている状態で、ブロックは逆になりました(セクション3.5.2で説明されるように)。 これは前からの57/58個のサンプルが踏む以前のフィルタ操作、5のおよび逆にすることの位相歪を補います。

   in(0..(STATE_SHORT_LEN-1)) = time reversed samples from table
                                look-up,
                                idxVecDec((STATE_SHORT_LEN-1)..0)

テーブル索引、idxVecDecからの時間の逆にされた(0(_州SHORT_LEN-1))=サンプルで(. (_短い_レン-1を述べます).0)

   in(STATE_SHORT_LEN..(2*STATE_SHORT_LEN-1)) = 0

(_背の低い_レン州の(_2*州の短い_LEN-1))=0で

   Pk(z) = A~rk(z)/A~k(z), where
                                  ___
                                  \
   A~rk(z)= z^(-LPC_FILTERORDER) + > a~ki*z^(i-(LPC_FILTERORDER-1))
                                  /__
                              i=0...(LPC_FILTERORDER-1)

Pk(z)はA~rk(z)/A~k(z)、どこと等しいか。___ \A~rk(z)= z^、(-、LPC_FILTERORDER) + >a~気*z^(i(LPC_FILTERORDER-1))/__i=0…(LPC_FILTERORDER-1)

   and A~k(z) is taken from the block where the start state begins

そして、A~k(z)はスタート状態が始まるブロックから抜粋されます。

   in -> Pk(z) -> filtered

Pk(z)->がフィルターにかけた->で

   out(k) = filtered(STATE_SHORT_LEN-1-k) +
                           filtered(2*STATE_SHORT_LEN-1-k),
                                         k=0..(STATE_SHORT_LEN-1)

=がフィルターにかけたか(_州SHORT_LEN-1-k)、またはフィルターにかけた出かけている(k)(_2*州SHORT_LEN-1-k)、k=0。(状態_の短い_レン-1)

Andersen, et al.              Experimental                     [Page 33]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[33ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   The remaining 23/22 samples in the state are reconstructed by the
   same adaptive codebook technique described in section 4.3.  The
   location bit determines whether these are the first or the last 23/22
   samples of the 80-sample state vector.  If the remaining 23/22
   samples are the first samples, then the scalar encoded
   STATE_SHORT_LEN state samples are time-reversed before initialization
   of the adaptive codebook memory vector.

状態の残っている23/22個のサンプルがセクション4.3で説明された同じ適応型の符号表のテクニックで再建されます。 位置のビットは、これらが80サンプルの州のベクトルの1番目かそれとも最後の23/22個のサンプルであるかを決定します。 残っている23/22個のサンプルが最初のサンプルであるなら、スカラのコード化された州_SHORT_LEN州のサンプルは適応型の符号表メモリベクトルの以前時間で逆にされた初期化です。

   A reference implementation of the start state reconstruction is given
   in Appendix A.44.

Appendix A.44でスタート州の再建の参照実現を与えます。

4.3.  Excitation Decoding Loop

4.3. 励振解読輪

   The decoding of the LPC excitation vector proceeds in the same order
   in which the residual was encoded at the encoder.  That is, after the
   decoding of the entire 80-sample state vector, the forward sub-blocks
   (corresponding to samples occurring after the state vector samples)
   are decoded, and then the backward sub-blocks (corresponding to
   samples occurring before the state vector) are decoded, resulting in
   a fully decoded block of excitation signal samples.

残差がエンコーダでコード化された同次における、LPC励振ベクトルの解読しかける。 すなわち、全体の80サンプルの州のベクトルの解読の後に、前進のサブブロック(見本と合います州のベクトルのサンプルの後に起こる)は解読されます、そして、次に、後方のサブブロック(見本と合います州のベクトルの前に起こる)は解読されます、励磁信号のサンプルの完全に解読されたブロックをもたらして。

   In particular, each sub-block is decoded by using the multistage
   adaptive codebook decoding module described in section 4.4.  This
   module relies upon an adaptive codebook memory constructed before
   each run of the adaptive codebook decoding.  The construction of the
   adaptive codebook memory in the decoder is identical to the method
   outlined in section 3.6.3, except that it is done on the codebook
   memory without perceptual weighting.

特に、それぞれのサブブロックは、セクション4.4で説明された多段式の適応型の符号表解読モジュールを使用することによって、解読されます。 このモジュールはそれぞれ走る前にメモリが構成した適応型の符号表解読の適応型の符号表を当てにします。 デコーダでの適応型の符号表メモリの工事はセクション3.6.3に概説された方法と同じです、符号表メモリで知覚の重さなしでそれをするのを除いて。

   For the initial forward sub-block, the last STATE_LEN=80 samples of
   the length CB_LMEM=147 adaptive codebook memory are filled with the
   samples of the state vector.  For subsequent forward sub-blocks, the
   first SUBL=40 samples of the adaptive codebook memory are discarded,
   the remaining samples are shifted by SUBL samples toward the
   beginning of the vector, and the newly decoded SUBL=40 samples are
   placed at the end of the adaptive codebook memory.  For backward
   sub-blocks, the construction is similar, except that every vector of
   samples involved is first time reversed.

初期の前進のサブブロックに関しては、長さのCB_LMEM=147の適応型の符号表メモリの最後の州_LEN=80のサンプルは州のベクトルのサンプルで満たされます。 その後の前進のサブブロックに関しては、適応型の符号表メモリの最初のSUBL=40のサンプルは捨てられて、残っているサンプルはSUBLのサンプルによってベクトルの始まりに向かって移動させられて、新たに解読されたSUBL=40のサンプルは適応型の符号表メモリの終わりに置かれます。 後方のサブブロックに関しては、サンプルのかかわったあらゆるベクトルが逆にされた状態で初めてを除いて、構造は同様です。

   A reference implementation of the excitation decoding loop is found
   in Appendix A.5.

励振解読輪の参照実現はAppendix A.5で見つけられます。

Andersen, et al.              Experimental                     [Page 34]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[34ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

4.4.  Multistage Adaptive Codebook Decoding

4.4. 多段式の適応型の符号表解読

   The Multistage Adaptive Codebook Decoding module is used at both the
   sender (encoder) and the receiver (decoder) ends to produce a
   synthetic signal in the residual domain that is eventually used to
   produce synthetic speech.  The module takes the index values used to
   construct vectors that are scaled and summed together to produce a
   synthetic signal that is the output of the module.

Multistage Adaptive Codebook Decodingモジュールは、結局合成発話を起こすのに使用される残りのドメインで合成の信号を作り出すのに送付者(エンコーダ)と受信機(デコーダ)エンドの両方で使用されます。 モジュールはスケーリングされたベクトルを構成するのに使用されて、モジュールの出力である合成の信号を作り出すために一緒にまとめられたインデックス値を取ります。

4.4.1.  Construction of the Decoded Excitation Signal

4.4.1. 解読された励磁信号の構造

   The unpacked index values provided at the input to the module are
   references to extended codebooks, which are constructed as described
   in section 3.6.3, except that they are based on the codebook memory
   without the perceptual weighting.  The unpacked three indices are
   used to look up three codebook vectors.  The unpacked three gain
   indices are used to decode the corresponding 3 gains.  In this
   decoding, the successive rescaling, as described in section 3.6.4.2,
   is applied.

入力のときにモジュールに提供されたアンパックされたインデックス値は拡張符号表の参照です、知覚の重さなしで符号表メモリに基づいているのを除いて。(符号表はセクション3.6.3で説明されるように構成されます)。 3つのアンパックされたインデックスリストが、3つの符号表ベクトルを見上げるのに使用されます。 3つのアンパックされた利得インデックスリストが、対応する3つの利得を解読するのに使用されます。 この解読、セクション3.6.4で説明される連続した再スケーリングでは、.2は適用されています。

   A reference implementation of the adaptive codebook decoding is
   listed in Appendix A.32.

適応型の符号表解読の参照実現はAppendix A.32に記載されています。

4.5.  Packet Loss Concealment

4.5. パケット損失隠すこと

   If packet loss occurs, the decoder receives a signal saying that
   information regarding a block is lost.  For such blocks it is
   RECOMMENDED to use a Packet Loss Concealment (PLC) unit to create a
   decoded signal that masks the effect of that packet loss.  In the
   following we will describe an example of a PLC unit that can be used
   with the iLBC codec.  As the PLC unit is used only at the decoder,
   the PLC unit does not affect interoperability between
   implementations.  Other PLC implementations MAY therefore be used.

パケット損失が起こるなら、デコーダはブロックの情報が無くなると言う信号を受信します。 そのようなブロックに関しては、そのパケット損失の影響にマスクをかけるのは、解読された信号を作成するのにPacket Loss Concealment(PLC)ユニットを使用するRECOMMENDEDです。 以下では、私たちはiLBCコーデックと共に使用できるPLCユニットに関する例について説明するつもりです。PLCユニットがデコーダだけで使用されるとき、PLCユニットは実現の間の相互運用性に影響しません。 したがって、他のPLC実現は使用されるかもしれません。

   The PLC described operates on the LP filters and the excitation
   signals and is based on the following principles:

説明されたPLCはLPフィルタと励磁信号を作動させて、以下の原則に基づいています:

4.5.1.  Block Received Correctly and Previous Block Also Received

4.5.1. ブロックは正しく受信されました、そして、また、前のブロックは受信されました。

   If the block is received correctly, the PLC only records state
   information of the current block that can be used in case the next
   block is lost.  The LP filter coefficients for each sub-block and the
   entire decoded excitation signal are all saved in the decoder state
   structure.  All of this information will be needed if the following
   block is lost.

正しくブロックを受け取るなら、PLCは次のブロックが無くなるといけないので使用できる現在のブロックの州の情報を記録するだけです。 それぞれのサブブロックと全体の解読された励磁信号のためのLPフィルタ係数はデコーダ州の構造にすべて保存されます。 以下のブロックが無くなると、この情報のすべてが必要でしょう。

Andersen, et al.              Experimental                     [Page 35]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[35ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

4.5.2.  Block Not Received

4.5.2. ブロックは受信されませんでした。

   If the block is not received, the block substitution is based on a
   pitch-synchronous repetition of the excitation signal, which is
   filtered by the last LP filter of the previous block.  The previous
   block's information is stored in the decoder state structure.

ブロックが受信されていないなら、ブロック代替は励磁信号のピッチ同期の反復に基づいています。(励磁信号は前のブロックの最後のLPフィルタによってフィルターにかけられます)。 前のブロックの情報はデコーダ州の構造に格納されます。

   A correlation analysis is performed on the previous block's
   excitation signal in order to detect the amount of pitch periodicity
   and a pitch value.  The correlation measure is also used to decide on
   the voicing level (the degree to which the previous block's
   excitation was a voiced or roughly periodic signal).  The excitation
   in the previous block is used to create an excitation for the block
   to be substituted, such that the pitch of the previous block is
   maintained.  Therefore, the new excitation is constructed in a
   pitch-synchronous manner.  In order to avoid a buzzy-sounding
   substituted block, a random excitation is mixed with the new pitch
   periodic excitation, and the relative use of the two components is
   computed from the correlation measure (voicing level).

相関分析は、ピッチの周期性の量とピッチ値を検出するために前のブロックの励磁信号に実行されます。 また、相関関係測定は、ヴォイシングレベル(前のブロックの励振が有声であるかおよそ周期的な信号であった程度)を決めるのに使用されます。 前のブロックでの励振はブロックを代入するために励振を作成するのに使用されます、前のブロックのピッチが維持されるように。 したがって、新しい励振はピッチ同期の方法で構成されます。 buzzy聞こえる代入されたブロックを避けるために、不規則励振は新しいピッチに混ぜられた周期的な励振です、そして、2つのコンポーネントの相対的な使用は相関関係測定(ヴォイシングレベル)から計算されます。

   For the block to be substituted, the newly constructed excitation
   signal is then passed through the LP filter to produce the speech
   that will be substituted for the lost block.

そして、ブロックを代入するなら、無くなっているブロックに代入されるスピーチを製作するためにLPフィルタを新たに組み立てられた励磁信号を通り抜けます。

   For several consecutive lost blocks, the packet loss concealment
   continues in a similar manner.  The correlation measure of the last
   block received is still used along with the same pitch value.  The LP
   filters of the last block received are also used again.  The energy
   of the substituted excitation for consecutive lost blocks is
   decreased, leading to a dampened excitation, and therefore to
   dampened speech.

いくつかの連続した無くなっているブロックに関しては、パケット損失隠すことは同じように続きます。 受け取られた最後のブロックの相関関係測定は同じピッチ値と共にまだ使用されています。 また、最後のブロックのフィルタが受けたLPは再び使用されます。 連続した無くなっているブロックのための代入された励振のエネルギーは減少します、湿っている励振と、そして、したがって、湿っているスピーチに導いて。

4.5.3.  Block Received Correctly When Previous Block Not Received

4.5.3. 前のブロックが受信されなかったとき正しく受け取られたブロック

   For the case in which a block is received correctly when the previous
   block was not, the correctly received block's directly decoded speech
   (based solely on the received block) is not used as the actual
   output.  The reason for this is that the directly decoded speech does
   not necessarily smoothly merge into the synthetic speech generated
   for the previous lost block.  If the two signals are not smoothly
   merged, an audible discontinuity is accidentally produced.
   Therefore, a correlation analysis between the two blocks of
   excitation signal (the excitation of the previous concealed block and
   that of the current received block) is performed to find the best
   phase match.  Then a simple overlap-add procedure is performed to
   merge the previous excitation smoothly into the current block's
   excitation.

前のブロックが受け取られなかったときブロックが正しく受け取られる場合のために、正しく受信されたブロックの直接解読されたスピーチ(唯一受信されたブロックに基づいている)は現実産出量として使用されません。 この理由は直接解読されたスピーチが必ずスムーズに前の無くなっているブロックに発生する合成発話に溶け込むというわけではないということです。 2つの信号がスムーズに合併されていないなら、聞きとれる不連続は偶然生産されます。 したがって、励磁信号の2ブロックの間の相関分析(前の隠されたブロックの励振と現在の受信されたブロックのもの)は、最も良いフェーズマッチを見つけるために実行されます。 そして、簡単なオーバラップして加えている手順は、スムーズに現在のブロックの励振に前の励振を合併するために実行されます。

Andersen, et al.              Experimental                     [Page 36]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[36ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   The exact implementation of the packet loss concealment does not
   influence interoperability of the codec.

パケット損失隠すことの正確な実現はコーデックの相互運用性に影響を及ぼしません。

   A reference implementation of the packet loss concealment is
   suggested in Appendix A.14.  Exact compliance with this suggested
   algorithm is not needed for a reference implementation to be fully
   compatible with the overall codec specification.

パケット損失隠すことの参照実現はAppendix A.14に示されます。 この提案されたアルゴリズムへの正確なコンプライアンスは、参照実現が総合的なコーデック仕様と完全に互換性があるのに必要ではありません。

4.6.  Enhancement

4.6. 増進

   The decoder contains an enhancement unit that operates on the
   reconstructed excitation signal.  The enhancement unit increases the
   perceptual quality of the reconstructed signal by reducing the
   speech-correlated noise in the voiced speech segments.  Compared to
   traditional postfilters, the enhancer has an advantage in that it can
   only modify the excitation signal slightly.  This means that there is
   no risk of over enhancement.  The enhancer works very similarly for
   both the 20 ms frame size mode and the 30 ms frame size mode.

デコーダは再建された励磁信号を作動させる増進ユニットを含んでいます。 増進ユニットは、有声なスピーチセグメントでスピーチによって関連させられた雑音を減少させることによって、再建された信号の知覚の品質を増加させます。 励磁信号をわずかに変更できるだけであるので、伝統的な後置フィルタと比べて、エンハンサには利点があります。 これが、リスクが全くないことを意味する、増進の上で。 エンハンサは20msフレーム・サイズモードと30msフレーム・サイズモードの両方のために非常に同様に働いています。

   For the mode with 20 ms frame size, the enhancer uses a memory of six
   80-sample excitation blocks prior in time plus the two new 80-sample
   excitation blocks.  For each block of 160 new unenhanced excitation
   samples, 160 enhanced excitation samples are produced.  The enhanced
   excitation is 40-sample delayed compared to the unenhanced
   excitation, as the enhancer algorithm uses lookahead.

20msフレーム・サイズがあるモードのために、エンハンサは6つの80サンプルの励振ブロックのメモリを優先的に時間内に、2つの新しい80サンプルの励振ブロックに使用します。 それぞれのブロックの160個の新しい「非-高め」られた励振のサンプルに関しては、160個の高められた励振のサンプルが作り出されます。 高められた励振は「非-高め」られた励振と比べて、エンハンサアルゴリズムが先読みを使用するので遅れた40サンプルです。

   For the mode with 30 ms frame size, the enhancer uses a memory of
   five 80-sample excitation blocks prior in time plus the three new
   80-sample excitation blocks.  For each block of 240 new unenhanced
   excitation samples, 240 enhanced excitation samples are produced.
   The enhanced excitation is 80-sample delayed compared to the
   unenhanced excitation, as the enhancer algorithm uses lookahead.

30msフレーム・サイズがあるモードのために、エンハンサは5つの80サンプルの励振ブロックのメモリを優先的に時間内に、3つの新しい80サンプルの励振ブロックに使用します。 それぞれのブロックの240個の新しい「非-高め」られた励振のサンプルに関しては、240個の高められた励振のサンプルが作り出されます。 高められた励振は「非-高め」られた励振と比べて、エンハンサアルゴリズムが先読みを使用するので遅れた80サンプルです。

   Outline of Enhancer

エンハンサのアウトライン

   The speech enhancement unit operates on sub-blocks of 80 samples,
   which means that there are two/three 80 sample sub-blocks per frame.
   Each of these two/three sub-blocks is enhanced separately, but in an
   analogous manner.

スピーチ増進ユニットは80個のサンプルのサブブロックを作動させます。(ブロックは1フレームあたり2/3 80サンプルサブブロックがあることを意味します)。 別々に高められますが、それぞれのこれらの2/3つのサブブロックが類似の方法でそうします。

Andersen, et al.              Experimental                     [Page 37]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[37ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   unenhanced residual
           |
           |   +---------------+    +--------------+
           +-> | 1. Pitch Est  | -> | 2. Find PSSQ | -------->
               +---------------+  | +--------------+
                                  +-----<-------<------<--+
               +------------+         enh block 0..1/2    |
            -> | 3. Smooth  |                             |
               +------------+                             |
                 \                                        |
                 /\                                       |
                /  \   Already                            |
               / 4. \----------->----------->-----------+ |
               \Crit/ Fulfilled                         | |
                \? /                                    v |
                 \/                                     | |
                  \  +-----------------+    +---------+ | |
              Not +->| 5. Use Constr.  | -> | 6. Mix  | ----->
           Fulfilled +-----------------+    +---------+

残差を「非-高め」ました。| | +---------------+ +--------------+ +->。| 1. エストを売り込んでください。| ->| 2. PSSQを見つけてください。| -------->+---------------+ | +--------------+ +-----<、-、-、-、-、-、--、<、-、-、-、-、--<--+ +------------+ enhブロック0。1/2 | ->| 3. 滑らか| | +------------+ | \ | /\ | /、\、既に。| / 4. \----------->、-、-、-、-、-、-、-、-、-、--、>、-、-、-、-、-、-、-、-、-、--+ | Crit/が実現させた\| | \?/v| \/ | | \ +-----------------+ +---------+ | | +でない>| 5. Constrを使用してください。 | ->| 6. ミックス| ----->は+を実現させました。-----------------+ +---------+

            ---------------> enhanced residual

--------------->は残差を高めました。

   Figure 4.2.  Flow chart of the enhancer.

図4.2。 エンハンサのフローチャート。

   1. Pitch estimation of each of the two/three new 80-sample blocks.

1. それぞれの2/3つの新しい80サンプルのブロックの見積りを売り込んでください。

   2. Find the pitch-period-synchronous sequence n (for block k) by a
      search around the estimated pitch value.  Do this for n=1,2,3,
      -1,-2,-3.

2. およそピッチ値の周りの検索による期間の同時の状態で投げている系列n(ブロックk)を見つけてください。 n=1、2、3、-1-2 3のためにこれをしてください。

   3. Calculate the smoothed residual generated by the six pitch-
      period-synchronous sequences from prior step.

3. 6つのピッチの期間の同期の系列で先のステップから発生する平坦な残差について計算してください。

   4. Check if the smoothed residual satisfies the criterion (section
      4.6.4).

4. 平坦な残差が評価基準(セクション4.6.4)を満たすかどうかチェックしてください。

   5. Use constraint to calculate mixing factor (section 4.6.5).

5. 混合要素(セクション4.6.5)について計算するという規制を使用してください。

   6. Mix smoothed signal with unenhanced residual (pssq(n) n=0).

6. ミックスは「非-高め」られた残差(pssq(n) n=0)で信号を整えました。

   The main idea of the enhancer is to find three 80 sample blocks
   before and three 80-sample blocks after the analyzed unenhanced sub-
   block and to use these to improve the quality of the excitation in
   that sub-block.  The six blocks are chosen so that they have the
   highest possible correlation with the unenhanced sub-block that is
   being enhanced.  In other words, the six blocks are pitch-period-
   synchronous sequences to the unenhanced sub-block.

エンハンサの本旨は、ブロックの前と3つの80サンプルのブロック次々と80分析「非-高め」られたサンプルサブブロックときの3を見つけて、そのサブブロックの励振の品質を改良するのにこれらを使用することです。 6ブロックが選ばれているので、それらには、高められている「非-高め」られたサブブロックがある可能な限り高い相関関係があります。 言い換えれば、6ブロックが「非-高め」られたサブブロックへのピッチ期間の同期の系列です。

Andersen, et al.              Experimental                     [Page 38]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[38ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   A linear combination of the six pitch-period-synchronous sequences is
   calculated that approximates the sub-block.  If the squared error
   between the approximation and the unenhanced sub-block is small
   enough, the enhanced residual is set equal to this approximation.
   For the cases when the squared error criterion is not fulfilled, a
   linear combination of the approximation and the unenhanced residual
   forms the enhanced residual.

サブブロックに近似する6つの期間の同時の状態で投げている系列の一次結合は計算されます。 近似と「非-高め」られたサブブロックの間の二乗された誤りが十分小さいなら、高められた残差はこの近似と等しいセットです。 二乗された誤り評価基準が実現しないときのケースのために、近似と「非-高め」られた残差の一次結合は高められた残差を形成します。

4.6.1.  Estimating the Pitch

4.6.1. ピッチを見積もっています。

   Pitch estimates are needed to determine the locations of the pitch-
   period-synchronous sequences in a complexity-efficient way.  For each
   of the new two/three sub-blocks, a pitch estimate is calculated by
   finding the maximum correlation in the range from lag 20 to lag 120.
   These pitch estimates are used to narrow down the search for the best
   possible pitch-period-synchronous sequences.

ピッチ見積りが、複雑さ効率的な方法でピッチの期間の同期の系列の位置を決定するのに必要です。 それぞれの2/3つの新しいサブブロックに関しては、ピッチ見積りは、120を遅れさせるように範囲で立ち遅れ20から最大の相関関係を見つけることによって、計算されます。 これらのピッチ見積りは、可能な限り良い期間の同時の状態で投げている系列の検索を限定するのに使用されます。

4.6.2.  Determination of the Pitch-Synchronous Sequences

4.6.2. ピッチ同期の系列の決断

   Upon receiving the pitch estimates from the prior step, the enhancer
   analyzes and enhances one 80-sample sub-block at a time.  The pitch-
   period-synchronous-sequences pssq(n) can be viewed as vectors of
   length 80 samples each shifted n*lag samples from the current sub-
   block.  The six pitch-period-synchronous-sequences, pssq(-3) to
   pssq(-1) and pssq(1) to pssq(3), are found one at a time by the steps
   below:

先のステップからピッチ見積りを受けると、エンハンサは、一度に1つの80サンプルのサブブロックを分析して、高めます。 長さ80のサンプルのベクトルが現在のサブブロックからn*立ち遅れサンプルをそれぞれ移動させたので、ピッチ期間の同期系列pssq(n)を見ることができます。 6つのピッチの期間の同期の系列(pssq(-1)へのpssq(-3)とpssq(3)へのpssq(1))が、一度に一つ、下でのステップで見つけられます:

   1) Calculate the estimate of the position of the pssq(n).  For
      pssq(n) in front of pssq(0) (n > 0), the location of the pssq(n)
      is estimated by moving one pitch estimate forward in time from the
      exact location of pssq(n-1).  Similarly, pssq(n) behind pssq(0) (n
      < 0) is estimated by moving one pitch estimate backward in time
      from the exact location of pssq(n+1).  If the estimated pssq(n)
      vector location is totally within the enhancer memory (Figure
      4.3), steps 2, 3, and 4 are performed, otherwise the pssq(n) is
      set to zeros.

1) pssq(n)の位置の見積りについて計算してください。 pssq(0)のpssq(n)のために (n>0), pssq(n)の位置は、pssq(n-1)の正確な位置から時間内に1つのピッチ見積りを前方へ動かせることによって、見積もられています。 同様である、pssq(0)の後ろのpssq(n) (n<0) pssq(n+1)の正確な位置からの時間内に後方の1つの感動的なピッチ見積りで、見積もられています。 エンハンサメモリ(図4.3)の完全に中におよそpssq(n)ベクトル位置があるなら、ステップ2、3、および4は実行されます。さもなければ、pssq(n)はゼロに用意ができています。

   2) Compute the correlation between the unenhanced excitation and
      vectors around the estimated location interval of pssq(n).  The
      correlation is calculated in the interval estimated location +/- 2
      samples.  This results in five correlation values.

2) pssq(n)のおよそ位置の間隔頃に「非-高め」られた励振とベクトルの間の相関関係を計算してください。 相関関係は位置+/-2サンプルであると見積もられていた間隔で計算されます。 これは5つの相関関係値をもたらします。

   3) The five correlation values are upsampled by a factor of 4, by
      using four simple upsampling filters (MA filters with coefficients
      upsFilter1.. upsFilter4).  Within these the maximum value is
      found, which specifies the best pitch-period with a resolution of
      a quarter of a sample.

3) 5つの相関関係値が4の要素によってupsampledされます、フィルタ(係数upsFilter1.. upsFilter4があるMAフィルタ)をupsamplingしながら簡単な状態で4を使用することによって。 これらの中では、最大値(サンプルの4分の1の解決で最も良いピッチ周期を指定する)は見つけられます。

Andersen, et al.              Experimental                     [Page 39]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[39ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

      upsFilter1[7]={0.000000 0.000000 0.000000 1.000000
             0.000000 0.000000 0.000000}
      upsFilter2[7]={0.015625 -0.076904 0.288330 0.862061
            -0.106445 0.018799 -0.015625}
      upsFilter3[7]={0.023682 -0.124268 0.601563 0.601563
            -0.124268 0.023682 -0.023682}
      upsFilter4[7]={0.018799 -0.106445 0.862061 0.288330
            -0.076904 0.015625 -0.018799}

0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000upsFilter1[7]=upsFilter2[7]=0.015625 -0.076904 0.288330 0.862061 -0.106445 0.018799 -0.015625upsFilter3[7]は0.023682 -0.124268 0.601563 0.601563 -0.124268 0.023682 -0.023682upsFilter4[7]=と等しいです。{0.018799 -0.106445 0.862061 0.288330 -0.076904 0.015625 -0.018799}

   4) Generate the pssq(n) vector by upsampling of the excitation memory
      and extracting the sequence that corresponds to the lag delay that
      was calculated in prior step.

4) 励振メモリをupsamplingして、先のステップで計算された立ち遅れ遅れに対応する系列を抜粋することによって、pssq(n)ベクトルを発生させてください。

   With the steps above, all the pssq(n) can be found in an iterative
   manner, first moving backward in time from pssq(0) and then forward
   in time from pssq(0).

ステップが上であるなら、繰り返しの方法ですべてのpssq(n)を見つけることができます、pssq(0)から時間内に最初に後方にpssq(0)からの時間とそして前方に動いて。

   0              159             319             479             639
   +---------------------------------------------------------------+
   |  -5   |  -4   |  -3   |  -2   |  -1   |   0   |   1   |   2   |
   +---------------------------------------------------------------+
                                               |pssq 0 |
                                          |pssq -1| |pssq 1 |
                                       |pssq -2|       |pssq 2 |
                                    |pssq -3|             |pssq 3 |

0 159 319 479 639 +---------------------------------------------------------------+ | -5 | -4 | -3 | -2 | -1 | 0 | 1 | 2 | +---------------------------------------------------------------+ |pssq0| |pssq-1| |pssq1| |pssq-2| |pssq2| |pssq-3| |pssq3|

   Figure 4.3.  Enhancement for 20 ms frame size.

図4.3。 20msフレーム・サイズのための増進。

   Figure 4.3 depicts pitch-period-synchronous sequences in the
   enhancement of the first 80 sample block in the 20 ms frame size
   mode.  The unenhanced signal input is stored in the last two sub-
   blocks (1 - 2), and the six other sub-blocks contain unenhanced
   residual prior-in-time.  We perform the enhancement algorithm on two
   blocks of 80 samples, where the first of the two blocks consists of
   the last 40 samples of sub-block 0 and the first 40 samples of sub-
   block 1.  The second 80-sample block consists of the last 40 samples
   of sub-block 1 and the first 40 samples of sub-block 2.

図4.3は20msフレーム・サイズモードにおける、最初の80サンプルブロックの増進における期間の同時の状態で投げている系列について表現します。 「非-高め」られたシグナル入力は最後の2つのサブブロック(1--2)に格納されました、そして、他のサブブロックが含む6は時間内に先の残差を「非-高め」ました。 私たちは2ブロックの80個のサンプルの上にエンハンスアルゴリズムを実行します。そこでは、2ブロックの1番目がサブブロック0の最後の40個のサンプルとサブブロック1の最初の40個のサンプルから成ります。 2番目の80サンプルのブロックはサブブロック1の最後の40個のサンプルとサブブロック2の最初の40個のサンプルから成ります。

Andersen, et al.              Experimental                     [Page 40]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[40ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   0              159             319             479             639
   +---------------------------------------------------------------+
   |  -4   |  -3   |  -2   |  -1   |   0   |   1   |   2   |   3   |
   +---------------------------------------------------------------+
                                   |pssq 0 |
                              |pssq -1| |pssq 1 |
                           |pssq -2|       |pssq 2 |
                        |pssq -3|             |pssq 3 |

0 159 319 479 639 +---------------------------------------------------------------+ | -4 | -3 | -2 | -1 | 0 | 1 | 2 | 3 | +---------------------------------------------------------------+ |pssq0| |pssq-1| |pssq1| |pssq-2| |pssq2| |pssq-3| |pssq3|

   Figure 4.4.  Enhancement for 30 ms frame size.

図4.4。 30msフレーム・サイズのための増進。

   Figure 4.4 depicts pitch-period-synchronous sequences in the
   enhancement of the first 80-sample block in the 30 ms frame size
   mode.  The unenhanced signal input is stored in the last three sub-
   blocks (1 - 3).  The five other sub-blocks contain unenhanced
   residual prior-in-time.  The enhancement algorithm is performed on
   the three 80 sample sub-blocks 0, 1, and 2.

図4.4は30msフレーム・サイズモードにおける、最初の80サンプルのブロックの増進における期間の同時の状態で投げている系列について表現します。 「非-高め」られたシグナル入力は最後の3つのサブブロック(1--3)に格納されます。 他のサブブロックが含む5は時間内に先の残差を「非-高め」ました。 エンハンスアルゴリズムは3 80サンプルサブブロック0、1、および2に実行されます。

4.6.3.  Calculation of the Smoothed Excitation

4.6.3. 平坦な励振の計算

   A linear combination of the six pssq(n) (n!=0) form a smoothed
   approximation, z, of pssq(0).  Most of the weight is put on the
   sequences that are close to pssq(0), as these are likely to be most
   similar to pssq(0).  The smoothed vector is also rescaled so that the
   energy of z is the same as the energy of pssq(0).

6pssq(n)(n!=0)の一次結合は平坦な近似、pssq(0)のzを形成します。 体重の大部分はpssq(0)の近くにある系列に増えます、これらがpssq(0)と最も同様である傾向があるときに。 また、平坦なベクトルが再スケーリングされるので、zのエネルギーはpssq(0)のエネルギーと同じです。

      ___
      \
   y = > pssq(i) * pssq_weight(i)
      /__
   i=-3,-2,-1,1,2,3

___ y=>pssq(i)*pssq_重さ(i)/__i=-3 1、1、2、2-3円

   pssq_weight(i) = 0.5*(1-cos(2*pi*(i+4)/(2*3+2)))

pssq_重さの(i)=0.5*(1-cos、(2*パイ*(i+4)/、(2、*3+2)

   z = C * y, where C = ||pssq(0)||/||y||

zがC*y、どこと等しいか、Cは等しいです。||pssq(0)||/||y||

4.6.4.  Enhancer Criterion

4.6.4. エンハンサ評価基準

   The criterion of the enhancer is that the enhanced excitation is not
   allowed to differ much from the unenhanced excitation.  This
   criterion is checked for each 80-sample sub-block.

エンハンサの評価基準は高められた励振が「非-高め」られた励振とあまり異なることができないということです。 この評価基準はそれぞれの80サンプルのサブブロックがないかどうかチェックされます。

   e < (b * ||pssq(0)||^2), where b=0.05 and   (Constraint 1)

e < (b * ||pssq(0)||^2), where b=0.05 and (規制1)

   e = (pssq(0)-z)*(pssq(0)-z), and "*" means the dot product

eは(pssq(0)-z)*と等しいです、そして、(pssq(0)-z)「*」はドット製品を意味します。

Andersen, et al.              Experimental                     [Page 41]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[41ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

4.6.5.  Enhancing the excitation

4.6.5. 励振を機能アップします。

   From the criterion in the previous section, it is clear that the
   excitation is not allowed to change much.  The purpose of this
   constraint is to prevent the creation of an enhanced signal
   significantly different from the original signal.  This also means
   that the constraint limits the numerical size of the errors that the
   enhancement procedure can make.  That is especially important in
   unvoiced segments and background noise segments for which increased
   periodicity could lead to lower perceived quality.

前項の評価基準から、励振があまり変化できないのは、明確です。 この規制の目的はオリジナルの信号とかなり異なった高められた信号の創造を防ぐことです。 また、これは、規制がエンハンス手順がすることができる誤りの数字のサイズを制限することを意味します。 それは暗黙のセグメントで特に重要です、そして、増加する周期性が下ろすのを導くかもしれないバックグラウンドノイズセグメントは品質を知覚しました。

   When the constraint in the prior section is not met, the enhanced
   residual is instead calculated through a constrained optimization by
   using the Lagrange multiplier technique.  The new constraint is that

先のセクションでの規制が迎えられないとき、高められた残差は代わりにラグランジュの未定係数法のテクニックを使用することによって、条件付き最適化で計算されます。 新しい規制はそれです。

      e = (b * ||pssq(0)||^2)                     (Constraint 2)

e = (b * ||pssq(0)||^2) (規制2)

   We distinguish two solution regions for the optimization: 1) the
   region where the first constraint is fulfilled and 2) the region
   where the first constraint is not fulfilled and the second constraint
   must be used.

私たちは最適化のために2つの解決策領域を区別します: 1) 最初の規制が実現する領域と2) 最初の規制が実現しない領域と2番目の規制を使用しなければなりません。

   In the first case, where the second constraint is not needed, the
   optimized re-estimated vector is simply z, the energy-scaled version
   of y.

最初の場合では、最適化された再およそのベクトルは単にzです、yのエネルギーでスケーリングされたバージョン。(そこでは、2番目の規制は必要ではありません)。

   In the second case, where the second constraint is activated and
   becomes an equality constraint, we have

2番目の場合では、私たちはそうしました。そこでは、2番目の規制は、活性であり、平等規制になります。

      z= A*y + B*pssq(0)

zは*y+B*pssqと等しいです。(0)

   where

どこ

      A = sqrt((b-b^2/4)*(w00*w00)/ (w11*w00 + w10*w10)) and

そして=sqrt((b-b^2/4)*(w00*w00)/(w11*w00+w10*w10))。

      w11 = pssq(0)*pssq(0)
      w00 = y*y
      w10 = y*pssq(0)    (* symbolizes the dot product)

w11=pssq(0)*pssq(0) w00=y*y w10=y*pssq(0)(*はドット製品を象徴します)

   and

そして

      B = 1 - b/2 - A * w10/w00

Bは1--b/2--*w10/w00と等しいです。

   Appendix A.16 contains a listing of a reference implementation for
   the enhancement method.

付録A.16はエンハンス方法のための参照実現のリストを含んでいます。

Andersen, et al.              Experimental                     [Page 42]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[42ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

4.7.  Synthesis Filtering

4.7. 統合フィルタリング

   Upon decoding or PLC of the LP excitation block, the decoded speech
   block is obtained by running the decoded LP synthesis filter,
   1/A~k(z), over the block.  The synthesis filters have to be shifted
   to compensate for the delay in the enhancer.  For 20 ms frame size
   mode, they SHOULD be shifted one 40-sample sub-block, and for 30 ms
   frame size mode, they SHOULD be shifted two 40-sample sub-blocks.
   The LP coefficients SHOULD be changed at the first sample of every
   sub-block while keeping the filter state.  For PLC blocks, one
   solution is to apply the last LP coefficients of the last decoded
   speech block for all sub-blocks.

LP励振ブロックの解読かPLCでは、解読されたLP統合フィルタを動かすことによって、解読されたスピーチブロックを入手します、1/A~k(z)、ブロックの上。 統合フィルタは、エンハンサの遅れを補うために移動しなければなりません。 1つの移行している40サンプルのサブブロックであり、30のために、msはサイズモードを縁どっています、そして、彼らはSHOULDです。20のために、msがサイズモードを縁どっていて、彼らがSHOULDである、2つの40サンプルの移行しているサブブロックになってください。 LP係数SHOULD、フィルタ状態を維持している間、あらゆるサブブロックの最初のサンプルで変えてください。 PLCブロックに関しては、1つの解決策はすべてのサブブロック最後に解読されたスピーチブロックの最後のLP係数を適用することです。

   The reference implementation for the synthesis filtering can be found
   in Appendix A.48.

Appendix A.48で統合フィルタリングのための参照実現を見つけることができます。

4.8.  Post Filtering

4.8. ポストフィルタリング

   If desired, the decoded block can be filtered by a high-pass filter.
   This removes the low frequencies of the decoded signal.  A reference
   implementation of this, with cutoff at 65 Hz, is shown in Appendix
   A.30.

望まれているなら、ハイパスフィルタは解読されたブロックをフィルターにかけることができます。 これは解読された信号の長波を取り除きます。 締切りが65Hzにあるこの参照実現はAppendix A.30に示されます。

5.  Security Considerations

5. セキュリティ問題

   This algorithm for the coding of speech signals is not subject to any
   known security consideration; however, its RTP payload format [1] is
   subject to several considerations, which are addressed there.
   Confidentiality of the media streams is achieved by encryption;
   therefore external mechanisms, such as SRTP [5], MAY be used for that
   purpose.

スピーチ信号のコード化のためのこのアルゴリズムはどんな知られている警備上の配慮も受けることがありません。 しかしながら、RTPペイロード形式[1]はいくつかの問題を受けることがあります。(問題はそこに記述されます)。 メディアの流れの秘密性は暗号化で達成されます。 したがって、SRTP[5]などの外部のメカニズムはそのために使用されるかもしれません。

6.  Evaluation of the iLBC Implementations

6. iLBC実現の評価

   It is possible and suggested to evaluate certain iLBC implementation
   by utilizing methodology and tools available at
   http://www.ilbcfreeware.org/evaluation.html

http://www.ilbcfreeware.org/evaluation.html で利用可能な方法論とツールを利用することによって、あるiLBC実現を評価するのは、可能で提案されています。

7.  References

7. 参照

7.1.  Normative References

7.1. 引用規格

   [1] Duric, A. and S. Andersen, "Real-time Transport Protocol (RTP)
       Payload Format for internet Low Bit Rate Codec (iLBC) Speech",
       RFC 3952, December 2004.

[1]DuricとA.とS.アンダーセン、「インターネットLow Bit Rate Codec(iLBC)スピーチのためのリアルタイムのTransportプロトコル(RTP)有効搭載量Format」、RFC3952、2004年12月。

   [2] Bradner, S., "Key words for use in RFCs to Indicate Requirement
       Levels", BCP 14, RFC 2119, March 1997.

[2] ブラドナー、S.、「Indicate Requirement LevelsへのRFCsにおける使用のためのキーワード」、BCP14、RFC2119、1997年3月。

Andersen, et al.              Experimental                     [Page 43]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[43ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   [3] PacketCable(TM) Audio/Video Codecs Specification, Cable
       Television Laboratories, Inc.

[3] PacketCable(TM)オーディオ/ビデオコーデック仕様、ケーブルテレビ研究所Inc.

7.2.  Informative References

7.2. 有益な参照

   [4] ITU-T Recommendation G.711, available online from the ITU
       bookstore at http://www.itu.int.

[4] ITU-T Recommendation G.711、利用可能である、 http://www.itu.int のITU書店から、オンラインです。

   [5] Baugher, M., McGrew, D., Naslund, M., Carrara, E., and K. Norman,
       "The Secure Real Time Transport Protocol (SRTP)", RFC 3711, March
       2004.

2004年の[5]Baugher、M.、マグリュー、D.、ジーター、M.、カラーラ、E.、およびK.ノーマン、「安全なリアルタイムのトランスポート・プロトコル(SRTP)」、RFC3711行進。

8.  Acknowledgements

8. 承認

   This extensive work, besides listed authors, has the following
   authors, who could not have been listed among "official" authors (due
   to IESG restrictions in the number of authors who can be listed):

この大規模な仕事には、記載された作者以外に、以下の作者がいます:(その作者は、「公式」の作者(記載できる作者の数におけるIESG制限による)の中に記載されたはずがありません)。

      Manohar N. Murthi (Department of Electrical and Computer
      Engineering, University of Miami), Fredrik Galschiodt, Julian
      Spittka, and Jan Skoglund (Global IP Sound).

Manohar N.Murthi(電気とコンピュータ工学の部、マイアミ大学)、フレドリックGalschiodt、ジュリアンSpittka、およびジャン・スコグルンド(グローバルなIP音)。

   The authors are deeply indebted to the following people and thank
   them sincerely:

作者は、心から深く以下の人々の世話になって、彼らに感謝します:

      Henry Sinnreich, Patrik Faltstrom, Alan Johnston, and Jean-
      Francois Mule for great support of the iLBC initiative and for
      valuable feedback and comments.

ヘンリーSinnreich、パトリクFaltstrom、アラン・ジョンストン、およびiLBCイニシアチブのかなりのサポートと有益なフィードバックとコメントのためのジーンフランソアMule。

      Peter Vary, Frank Mertz, and Christoph Erdmann (RWTH Aachen);
      Vladimir Cuperman (Niftybox LLC); Thomas Eriksson (Chalmers Univ
      of Tech), and Gernot Kubin (TU Graz), for thorough review of the
      iLBC document and their valuable feedback and remarks.

ピーターが異なって、フランクがMertzであり、クリストフはエルトマン(RWTHアーヘン)です。 ウラジミールCuperman(Niftybox LLC)。 彼らのiLBCドキュメントの徹底的なレビュー、有益なフィードバック、および所見のためのトーマス・エリクソン(TechのチャーマーズUniv)、およびGernotクービン(TUグラーツ)。

Andersen, et al.              Experimental                     [Page 44]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[44ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

APPENDIX A.  Reference Implementation

付録A.リファレンスインプリメンテーション

   This appendix contains the complete c-code for a reference
   implementation of encoder and decoder for the specified codec.

この付録は指定されたコーデックのためのエンコーダとデコーダの参照実現のための完全なc-コードを含んでいます。

   The c-code consists of the following files with highest-level
   functions:

c-コードは最高水準機能がある以下のファイルから成ります:

         iLBC_test.c: main function for evaluation purpose
         iLBC_encode.h: encoder header
         iLBC_encode.c: encoder function
         iLBC_decode.h: decoder header
         iLBC_decode.c: decoder function

iLBC_test.c: 評価目的iLBC_encode.hに、主な機能: エンコーダヘッダーiLBC_encode.c: エンコーダ機能iLBC_decode.h: デコーダヘッダーiLBC_decode.c: デコーダ機能

   The following files contain global defines and constants:

そして、以下のファイルが含んでいる、グローバルである、定義、定数:

         iLBC_define.h: global defines
         constants.h: global constants header
         constants.c: global constants memory allocations

iLBC_define.h: グローバルである、constants.hを定義します: グローバルな定数ヘッダーconstants.c: グローバルな定数メモリアロケーション

   The following files contain subroutines:

以下のファイルはサブルーチンを含んでいます:

         anaFilter.h: lpc analysis filter header
         anaFilter.c: lpc analysis filter function
         createCB.h: codebook construction header
         createCB.c: codebook construction function
         doCPLC.h: packet loss concealment header
         doCPLC.c: packet loss concealment function
         enhancer.h: signal enhancement header
         enhancer.c: signal enhancement function
         filter.h: general filter header
         filter.c: general filter functions
         FrameClassify.h: start state classification header
         FrameClassify.c: start state classification function
         gainquant.h: gain quantization header
         gainquant.c: gain quantization function
         getCBvec.h: codebook vector construction header
         getCBvec.c: codebook vector construction function
         helpfun.h: general purpose header
         helpfun.c: general purpose functions
         hpInput.h: input high pass filter header
         hpInput.c: input high pass filter function
         hpOutput.h: output high pass filter header
         hpOutput.c: output high pass filter function
         iCBConstruct.h: excitation decoding header
         iCBConstruct.c: excitation decoding function
         iCBSearch.h: excitation encoding header
         iCBSearch.c: excitation encoding function

anaFilter.h: lpc分析フィルタヘッダーanaFilter.c: lpc分析フィルタ関数createCB.h: 符号表工事ヘッダーcreateCB.c: 符号表工事機能doCPLC.h: パケット損失隠すことのヘッダーdoCPLC.c: パケット損失隠すことの機能enhancer.h: 増進ヘッダーenhancer.cに合図してください: 増進機能filter.hに合図してください: 一般的なフィルタヘッダーfilter.c: 一般的なフィルタ関数FrameClassify.h: 州の分類ヘッダーFrameClassify.cを始動してください: 州の分類機能gainquant.hを始動してください: 量子化ヘッダーgainquant.cを獲得してください: 量子化機能getCBvec.hを獲得してください: 符号表ベクトル工事ヘッダーgetCBvec.c: 符号表ベクトル工事機能helpfun.h: 汎用のヘッダーhelpfun.c: 汎用の機能hpInput.h: ハイパスフィルタヘッダーhpInput.cを入力してください: ハイパスフィルタ機能hpOutput.hを入力してください: ハイパスフィルタヘッダーhpOutput.cを出力してください: ハイパスフィルタ機能iCBConstruct.hを出力してください: 励振の解読しているヘッダーiCBConstruct.c: 励振解読機能iCBSearch.h: ヘッダーiCBSearch.cをコード化する励振: 励振コード化機能

Andersen, et al.              Experimental                     [Page 45]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[45ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

         LPCdecode.h: lpc decoding header
         LPCdecode.c: lpc decoding function
         LPCencode.h: lpc encoding header
         LPCencode.c: lpc encoding function
         lsf.h: line spectral frequencies header
         lsf.c: line spectral frequencies functions
         packing.h: bitstream packetization header
         packing.c: bitstream packetization functions
         StateConstructW.h: state decoding header
         StateConstructW.c: state decoding functions
         StateSearchW.h: state encoding header
         StateSearchW.c: state encoding function
         syntFilter.h: lpc synthesis filter header
         syntFilter.c: lpc synthesis filter function

LPCdecode.h: lpcの解読しているヘッダーLPCdecode.c: lpc解読機能LPCencode.h: ヘッダーLPCencode.cをコード化するlpc: lpcコード化機能lsf.h: スペクトル頻度ヘッダーlsf.cを裏打ちしてください: スペクトル頻度機能packing.hを裏打ちしてください: bitstream packetizationヘッダーpacking.c: bitstream packetization機能StateConstructW.h: ヘッダーStateConstructW.cを解読する州: 解読機能StateSearchW.hを述べてください: ヘッダーStateSearchW.cをコード化する州: 機能syntFilter.hをコード化する州: lpc統合フィルタヘッダーsyntFilter.c: lpc統合フィルタ関数

   The implementation is portable and should work on many different
   platforms.  However, it is not difficult to optimize the
   implementation on particular platforms, an exercise left to the
   reader.

実現は、携帯用であり、多くの異なったプラットホームで働くべきです。しかしながら、特定のプラットホームで実現を最適化するのは難しくはありません、読者に任せる運動。

A.1.  iLBC_test.c

A.1iLBC_test.c

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       iLBC_test.c

iLBC_test.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #include <math.h>
   #include <stdlib.h>
   #include <stdio.h>
   #include <string.h>
   #include "iLBC_define.h"
   #include "iLBC_encode.h"
   #include "iLBC_decode.h"

#<math.h>#インクルード<stdlib.h>#インクルード<stdio.h>#インクルード<string.h>#インクルード「iLBC_define.h」#インクルード「iLBC_encode.h」#インクルード「iLBC_decode.h」を含めてください。

   /* Runtime statistics */
   #include <time.h>

/*ランタイム統計*/#、は<time.h>を含んでいます。

   #define ILBCNOOFWORDS_MAX   (NO_OF_BYTES_30MS/2)

#ILBCNOOFWORDS_MAXを定義してください。(_バイト_30MS/2の_がありません)

   /*----------------------------------------------------------------*
    *  Encoder interface function

/*----------------------------------------------------------------* * エンコーダインタフェース機能

Andersen, et al.              Experimental                     [Page 46]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[46ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

    *---------------------------------------------------------------*/

*---------------------------------------------------------------*/

   short encode(   /* (o) Number of bytes encoded */
       iLBC_Enc_Inst_t *iLBCenc_inst,
                                   /* (i/o) Encoder instance */
       short *encoded_data,    /* (o) The encoded bytes */
       short *data                 /* (i) The signal block to encode*/
   ){
       float block[BLOCKL_MAX];
       int k;

エンコードをショートしてください、(/*(o)バイト数のコード化された*/iLBC_Enc_Inst_t*iLBCenc_inst、/*(入出力)エンコーダ例*/短い*は_データをコード化して、/*(o)は信号が*/をコード化するために妨げるコード化されたバイト*/短い*データ/*(i)です)ブロック[BLOCKL_MAX]を広めてください; int k

       /* convert signal to float */

*/を浮かべる/*転向者信号

       for (k=0; k<iLBCenc_inst->blockl; k++)
           block[k] = (float)data[k];

(k=0; k<の_のinst>のiLBCenc blockl; k++)に関しては、[k]=(浮かべます)データ[k]を妨げてください。

       /* do the actual encoding */

/*は実際のコード化*/をします。

       iLBC_encode((unsigned char *)encoded_data, block, iLBCenc_inst);

iLBC_エンコード((無記名の炭*)は_データ、ブロック、iLBCenc_instをコード化しました)。

       return (iLBCenc_inst->no_of_bytes);
   }

(_バイトのiLBCencの_のinst>のノー_)を返してください。 }

   /*----------------------------------------------------------------*
    *  Decoder interface function
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * デコーダインタフェース機能*---------------------------------------------------------------*/

   short decode(       /* (o) Number of decoded samples */
       iLBC_Dec_Inst_t *iLBCdec_inst,  /* (i/o) Decoder instance */
       short *decoded_data,        /* (o) Decoded signal block*/
       short *encoded_data,        /* (i) Encoded bytes */
       short mode                       /* (i) 0=PL, 1=Normal */
   ){
       int k;
       float decblock[BLOCKL_MAX], dtmp;

急に、解読してください、((o)が付番する解読されたサンプル*/iLBC_12月_Inst_t*iLBCdec_instの/*、/*(入出力)デコーダ例*/短い*は_データを解読しました、/*(o)の解読された信号ブロック*/短い*コード化された_データ、/*(i)のコード化されたバイト*/短いモード/*(i)0=PL、正常な1=*/)int k; decblock[BLOCKL_MAX]を浮かべてください、dtmp。

       /* check if mode is valid */

モードであるなら、/*チェックは有効な*/です。

       if (mode<0 || mode>1) {
           printf("\nERROR - Wrong mode - 0, 1 allowed\n"); exit(3);}

(モード<0| | モード>1)です。printf(「\nERROR--間違ったモード--0、1は\nを許容した」)(出口(3))

       /* do actual decoding of block */

/*はブロック*/の実際の解読をします。

       iLBC_decode(decblock, (unsigned char *)encoded_data,
           iLBCdec_inst, mode);

iLBC_は解読します(decblock、(無記名の炭*)が_データ、iLBCdec_inst、モードをコード化しました)。

       /* convert to short */

短い*/への/*転向者

Andersen, et al.              Experimental                     [Page 47]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[47ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       for (k=0; k<iLBCdec_inst->blockl; k++){
           dtmp=decblock[k];

(k=0; k<の_のinst>のiLBCdec blockl; k++)、dtmp=decblock[k]。

           if (dtmp<MIN_SAMPLE)
               dtmp=MIN_SAMPLE;
           else if (dtmp>MAX_SAMPLE)
               dtmp=MAX_SAMPLE;
           decoded_data[k] = (short) dtmp;
       }

(dtmp<の分_サンプル)dtmpが分_サンプルと等しいなら。 ほかに、(dtmp>マックス_SAMPLE)であるなら、dtmpはマックス_SAMPLEと等しいです。 解読された_データ[k]は(短い)のdtmpと等しいです。 }

       return (iLBCdec_inst->blockl);
   }

(_のinst>のiLBCdec blockl)を返してください。 }

   /*---------------------------------------------------------------*
    *  Main program to test iLBC encoding and decoding
    *
    *  Usage:
    *    exefile_name.exe <infile> <bytefile> <outfile> <channel>
    *
    *    <infile>   : Input file, speech for encoder (16-bit pcm file)
    *    <bytefile> : Bit stream output from the encoder
    *    <outfile>  : Output file, decoded speech (16-bit pcm file)
    *    <channel>  : Bit error file, optional (16-bit)
    *                     1 - Packet received correctly
    *                     0 - Packet Lost
    *
    *--------------------------------------------------------------*/

/*---------------------------------------------------------------* * **用法をコード化して、解読するiLBCをテストする主プログラム: * exefile_name.exe<入力ファイル><bytefile><出力ファイル><チャンネル>**<入力ファイル>: エンコーダ(16ビットのpcmファイル)*<bytefile>のためにファイル、スピーチを入力してください: エンコーダ*<出力ファイル>からのビットストリーム出力: 出力ファイル、解読されたスピーチ(16ビットのpcmファイル)*<は>にチャネルを開設します: 噛み付いている誤りファイル、任意の(16ビット)*1--パケットは正しく*0を受けました--パケットLost**--------------------------------------------------------------*/

   int main(int argc, char* argv[])
   {

intメイン、(int argc、炭*argv[])

       /* Runtime statistics */

/*ランタイム統計*/

       float starttime;
       float runtime;
       float outtime;

starttimeを浮かべてください。 浮遊物のランタイム。 「外-時間」を浮かべてください。

       FILE *ifileid,*efileid,*ofileid, *cfileid;
       short data[BLOCKL_MAX];
       short encoded_data[ILBCNOOFWORDS_MAX], decoded_data[BLOCKL_MAX];
       int len;
       short pli, mode;
       int blockcount = 0;
       int packetlosscount = 0;

*ifileid、*efileid、*ofileid、*cfileidをファイルしてください。 短いデータ[BLOCKL_MAX]。 短いコード化された_データ[ILBCNOOFWORDS_MAX]、解読された_データ[BLOCKL_MAX]。 int len。 短いpli、モード。 int blockcount=0。 int packetlosscount=0。

       /* Create structs */
       iLBC_Enc_Inst_t Enc_Inst;
       iLBC_Dec_Inst_t Dec_Inst;

/*はstructs*/iLBC_Enc_Inst_t Enc_Instを作成します。 _iLBC_12月のInst_t12月_Inst。

Andersen, et al.              Experimental                     [Page 48]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[48ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       /* get arguments and open files */

/*は議論とオープン・ファイル*/を得ます。

       if ((argc!=5) && (argc!=6)) {
           fprintf(stderr,
           "\n*-----------------------------------------------*\n");
           fprintf(stderr,
           "   %s <20,30> input encoded decoded (channel)\n\n",
               argv[0]);
           fprintf(stderr,
           "   mode    : Frame size for the encoding/decoding\n");
           fprintf(stderr,
           "                 20 - 20 ms\n");
           fprintf(stderr,
           "                 30 - 30 ms\n");
           fprintf(stderr,
           "   input   : Speech for encoder (16-bit pcm file)\n");
           fprintf(stderr,
           "   encoded : Encoded bit stream\n");
           fprintf(stderr,
           "   decoded : Decoded speech (16-bit pcm file)\n");
           fprintf(stderr,
           "   channel : Packet loss pattern, optional (16-bit)\n");
           fprintf(stderr,
           "                  1 - Packet received correctly\n");
           fprintf(stderr,
           "                  0 - Packet Lost\n");
           fprintf(stderr,
           "*-----------------------------------------------*\n\n");
           exit(1);
       }
       mode=atoi(argv[1]);
       if (mode != 20 && mode != 30) {
           fprintf(stderr,"Wrong mode %s, must be 20, or 30\n",
               argv[1]);
           exit(2);
       }
       if ( (ifileid=fopen(argv[2],"rb")) == NULL) {
           fprintf(stderr,"Cannot open input file %s\n", argv[2]);
           exit(2);}
       if ( (efileid=fopen(argv[3],"wb")) == NULL) {
           fprintf(stderr, "Cannot open encoded file %s\n",
               argv[3]); exit(1);}
       if ( (ofileid=fopen(argv[4],"wb")) == NULL) {
           fprintf(stderr, "Cannot open decoded file %s\n",
               argv[4]); exit(1);}
       if (argc==6) {
           if( (cfileid=fopen(argv[5],"rb")) == NULL) {
               fprintf(stderr, "Cannot open channel file %s\n",

(argc!=5)である、(argc!=6); モードはatoi(argv1)と等しいです。 「開水路が%をファイルできない、s\n」

Andersen, et al.              Experimental                     [Page 49]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[49ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

                   argv[5]);
               exit(1);
           }
       } else {
           cfileid=NULL;
       }

argv[5])。 出口(1)。 ほかcfileidはヌルと等しいです。 }

       /* print info */

/*印刷インフォメーション*/

       fprintf(stderr, "\n");
       fprintf(stderr,
           "*---------------------------------------------------*\n");
       fprintf(stderr,
           "*                                                   *\n");
       fprintf(stderr,
           "*      iLBC test program                            *\n");
       fprintf(stderr,
           "*                                                   *\n");
       fprintf(stderr,
           "*                                                   *\n");
       fprintf(stderr,
           "*---------------------------------------------------*\n");
       fprintf(stderr,"\nMode           : %2d ms\n", mode);
       fprintf(stderr,"Input file     : %s\n", argv[2]);
       fprintf(stderr,"Encoded file   : %s\n", argv[3]);
       fprintf(stderr,"Output file    : %s\n", argv[4]);
       if (argc==6) {
           fprintf(stderr,"Channel file   : %s\n", argv[5]);
       }
       fprintf(stderr,"\n");

「fprintf、(stderr、」、\n」)、。 fprintf(stderr, "*---------------------------------------------------*\n"); 「fprintf、(stderr、」、**\n」)、。 「fprintf、(stderr、」、*iLBCテストプログラム*\n」)、。 「fprintf、(stderr、」、**\n」)、。 「fprintf、(stderr、」、**\n」)、。 fprintf(stderr, "*---------------------------------------------------*\n"); 「fprintf、(stderr、」、\nMode: %、2d ms\n」、モード)、。 fprintf、(stderr、「入力ファイル: %、s\n」、argv[2])。 fprintf、(stderr、「ファイル: %をコード化する、s\n」、argv[3])。 fprintf、(stderr、「出力ファイル: %、s\n」、argv[4])。 「(argc==6)である、fprintf、(stderr、「チャンネルファイル: %、s\n」、argv[5]);、fprintf、(stderr、」、\n」)、。

       /* Initialization */

/*初期設定*/

       initEncode(&Enc_Inst, mode);
       initDecode(&Dec_Inst, mode, 1);

initEncode(Enc_Inst、モード)。 initDecode、(12月_Inst、モード、1)。

       /* Runtime statistics */

/*ランタイム統計*/

       starttime=clock()/(float)CLOCKS_PER_SEC;

starttime=時計()/(浮遊物)は_SECあたりの_の時間を計ります。

       /* loop over input blocks */

入力ブロック*/の上の/*輪

       while (fread(data,sizeof(short),Enc_Inst.blockl,ifileid)==
               Enc_Inst.blockl) {

(fread(データ、sizeof(短い)、Enc_Inst.blockl、ifileid)=Enc_Inst.blockl)です。

           blockcount++;

blockcount++。

           /* encoding */

*/をコード化する/*

Andersen, et al.              Experimental                     [Page 50]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[50ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

           fprintf(stderr, "--- Encoding block %i --- ",blockcount);
           len=encode(&Enc_Inst, encoded_data, data);
           fprintf(stderr, "\r");

fprintf、(stderr、「-、ブロック%iをコード化する、-、--、」、blockcount)、。 lenはエンコード(Enc_Inst、コード化された_データ、データ)と等しいです。 「fprintf、(stderr、」、\r」)、。

           /* write byte file */

/*はバイトファイル*/を書きます。

           fwrite(encoded_data, sizeof(unsigned char), len, efileid);

fwrite(_データ、sizeof(無記名の炭)、len、efileidをコード化します)。

           /* get channel data if provided */
           if (argc==6) {
               if (fread(&pli, sizeof(short), 1, cfileid)) {
                   if ((pli!=0)&&(pli!=1)) {
                       fprintf(stderr, "Error in channel file\n");
                       exit(0);
                   }
                   if (pli==0) {
                       /* Packet loss -> remove info from frame */
                       memset(encoded_data, 0,
                           sizeof(short)*ILBCNOOFWORDS_MAX);
                       packetlosscount++;
                   }
               } else {
                   fprintf(stderr, "Error. Channel file too short\n");
                   exit(0);
               }
           } else {
               pli=1;
           }

(argc==6)であるなら*/を提供するなら、/*はチャンネルにデータを届けます。{ (fread(pli、sizeof(短い)、1、cfileid))である、(pli!=0)である、(pli!=1)、fprintf(stderr、「チャンネルファイル\nの誤り」)。 出口(0)。 (pli==0)である、/*パケット損失->はフレーム*/memsetからインフォメーションを取り除きます(コード化された_データ(0)は(短い)の*ILBCNOOFWORDS_MAXをsizeofします)。 packetlosscount++。 ほか{ fprintf(stderr、「誤り。」 「チャンネルは短過ぎる\nをファイルします」); 出口(0);、ほかpli=1。

           /* decoding */

/*解読*/

           fprintf(stderr, "--- Decoding block %i --- ",blockcount);

fprintf、(stderr、「-、ブロック%iを解読する、-、--、」、blockcount)、。

           len=decode(&Dec_Inst, decoded_data, encoded_data, pli);
           fprintf(stderr, "\r");

len=は解読します(12月_Inst(解読された_データ)は_データ、pliをコード化しました)。 「fprintf、(stderr、」、\r」)、。

           /* write output file */

/*は出力ファイル*/を書きます。

           fwrite(decoded_data,sizeof(short),len,ofileid);
       }

fwrite(_データ、sizeof(短い)、len、ofileidを解読します)。 }

       /* Runtime statistics */

/*ランタイム統計*/

       runtime = (float)(clock()/(float)CLOCKS_PER_SEC-starttime);
       outtime = (float)((float)blockcount*(float)mode/1000.0);
       printf("\n\nLength of speech file: %.1f s\n", outtime);
       printf("Packet loss          : %.1f%%\n",
           100.0*(float)packetlosscount/(float)blockcount);

ランタイム=(浮かべる)(_時計()/(浮遊物)CLOCKS_PER SEC-starttime)。 「外-時間」は((浮遊物)blockcount*(浮かべます)モード/1000.0)と等しいです(浮かべます)。 printf、(「スピーチファイル: %.1f sの\n\nLength、\n」、「外-時間」)、。 printf、(「パケット損失: %.1f%%\n」、100.0*(浮遊物)packetlosscount/(浮遊物) blockcount)。

Andersen, et al.              Experimental                     [Page 51]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[51ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       printf("Time to run iLBC     :");
       printf(" %.1f s (%.1f %% of realtime)\n\n", runtime,
           (100*runtime/outtime));

printf(「調節して、iLBCを走らせてください」)。 printf、(「%.1f s、(%、リアルタイムで.1f%%の) \n円n」、ランタイム(100*ランタイム/「外-時間」)。

       /* close files */

/*近いファイル*/

       fclose(ifileid);  fclose(efileid); fclose(ofileid);
       if (argc==6) {
           fclose(cfileid);
       }
       return(0);
   }

fclose(ifileid)。 fclose(efileid)。 fclose(ofileid)。 (argc==6) fclose(cfileid); リターン(0)。 }

A.2.  iLBC_encode.h

A.2iLBC_encode.h

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       iLBC_encode.h

iLBC_encode.h

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #ifndef __iLBC_ILBCENCODE_H
   #define __iLBC_ILBCENCODE_H

#ifndef__iLBC_ILBCENCODE_H#は__iLBC_ILBCENCODE_Hを定義します。

   #include "iLBC_define.h"

#「iLBC_define.h」を含めてください。

   short initEncode(                   /* (o) Number of bytes
                                              encoded */
       iLBC_Enc_Inst_t *iLBCenc_inst,  /* (i/o) Encoder instance */
       int mode                    /* (i) frame size mode */
   );

短いinitEncode(/*(o)バイト数は*/iLBC_Enc_Inst_t*iLBCenc_instをコード化しました、/*(入出力)エンコーダ例*/intモード/*(i)フレーム・サイズモード*/)。

   void iLBC_encode(

iLBC_エンコードを欠如させてください、(

       unsigned char *bytes,           /* (o) encoded data bits iLBC */
       float *block,                   /* (o) speech vector to
                                              encode */
       iLBC_Enc_Inst_t *iLBCenc_inst   /* (i/o) the general encoder
                                              state */
   );

無記名の炭*バイト、/*(o)はデータ・ビットiLBC*/浮遊物*ブロックをコード化しました、*/iLBC_Enc_Inst_t*iLBCenc_inst/*(入出力) 一般的なエンコーダ状態*/)をコード化する/*(o)スピーチベクトル。

   #endif

#endif

Andersen, et al.              Experimental                     [Page 52]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[52ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

A.3.  iLBC_encode.c

A.3iLBC_encode.c

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       iLBC_encode.c

iLBC_encode.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #include <math.h>
   #include <stdlib.h>
   #include <string.h>

#<math.h>#インクルード<stdlib.h>#インクルード<string.h>を含めてください。

   #include "iLBC_define.h"
   #include "LPCencode.h"
   #include "FrameClassify.h"
   #include "StateSearchW.h"
   #include "StateConstructW.h"
   #include "helpfun.h"
   #include "constants.h"
   #include "packing.h"
   #include "iCBSearch.h"
   #include "iCBConstruct.h"
   #include "hpInput.h"
   #include "anaFilter.h"
   #include "syntFilter.h"

#「iLBC_define.h」#インクルード"LPCencode.h"#インクルード"FrameClassify.h"#インクルード"StateSearchW.h"#インクルード"StateConstructW.h"#インクルード"helpfun.h"#インクルード"constants.h"#インクルード"packing.h"#インクルード"iCBSearch.h"#インクルード"iCBConstruct.h"#インクルード"hpInput.h"#インクルード"anaFilter.h"#インクルード"syntFilter.h"を含めてください。

   /*----------------------------------------------------------------*
    *  Initiation of encoder instance.
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * エンコーダ例の開始。 *---------------------------------------------------------------*/

   short initEncode(                   /* (o) Number of bytes
                                              encoded */
       iLBC_Enc_Inst_t *iLBCenc_inst,  /* (i/o) Encoder instance */
       int mode                    /* (i) frame size mode */
   ){
       iLBCenc_inst->mode = mode;
       if (mode==30) {
           iLBCenc_inst->blockl = BLOCKL_30MS;
           iLBCenc_inst->nsub = NSUB_30MS;
           iLBCenc_inst->nasub = NASUB_30MS;
           iLBCenc_inst->lpc_n = LPC_N_30MS;
           iLBCenc_inst->no_of_bytes = NO_OF_BYTES_30MS;
           iLBCenc_inst->no_of_words = NO_OF_WORDS_30MS;

ショート..(o)..バイト数..コード化..入出力..エンコーダ..例..モード..フレーム・サイズ..モード..モード..等しい..モード..モード..ノー..バイト..等しい..ノー..ノー..単語..ワーズ

Andersen, et al.              Experimental                     [Page 53]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[53ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

           iLBCenc_inst->state_short_len=STATE_SHORT_LEN_30MS;
           /* ULP init */
           iLBCenc_inst->ULP_inst=&ULP_30msTbl;
       }
       else if (mode==20) {
           iLBCenc_inst->blockl = BLOCKL_20MS;
           iLBCenc_inst->nsub = NSUB_20MS;
           iLBCenc_inst->nasub = NASUB_20MS;
           iLBCenc_inst->lpc_n = LPC_N_20MS;
           iLBCenc_inst->no_of_bytes = NO_OF_BYTES_20MS;
           iLBCenc_inst->no_of_words = NO_OF_WORDS_20MS;
           iLBCenc_inst->state_short_len=STATE_SHORT_LEN_20MS;
           /* ULP init */
           iLBCenc_inst->ULP_inst=&ULP_20msTbl;
       }
       else {
           exit(2);
       }

iLBCenc_inst->は__短い_len=州の短い_LEN_30MSを述べます。 /*ULPイニットiLBCenc_inst*/>ULP_inst=とULP_30msTbl。 ほか、(モード=20)である、iLBCencの_のinst>のblockl=BLOCKL_20MS。 _のinst>のiLBCenc nsubはNSUB_20MSと等しいです。 _のinst>のiLBCenc nasubはNASUB_20MSと等しいです。 _のinst>のiLBCenc lpcはLPC_N_20MSと等しいです。 _バイトのiLBCencの_のinst>のノー_は_バイト_20MSのどんな_とも等しくはありません。 _単語_20MSの_のどんな_も言い表さないiLBCenc_inst->=_がありません。 iLBCenc_inst->は__短い_len=州の短い_LEN_20MSを述べます。 /*ULPイニットiLBCenc_inst*/>ULP_inst=とULP_20msTbl。 ほか出口(2)。 }

       memset((*iLBCenc_inst).anaMem, 0,
           LPC_FILTERORDER*sizeof(float));
       memcpy((*iLBCenc_inst).lsfold, lsfmeanTbl,
           LPC_FILTERORDER*sizeof(float));
       memcpy((*iLBCenc_inst).lsfdeqold, lsfmeanTbl,
           LPC_FILTERORDER*sizeof(float));
       memset((*iLBCenc_inst).lpc_buffer, 0,
           (LPC_LOOKBACK+BLOCKL_MAX)*sizeof(float));
       memset((*iLBCenc_inst).hpimem, 0, 4*sizeof(float));

memset(*iLBCenc_inst).anaMem、0、LPC_FILTERORDER*sizeof(浮かべます)。 memcpy(*iLBCenc_inst).lsfold、lsfmeanTbl、LPC_FILTERORDER*sizeof(浮かべます)。 memcpy(*iLBCenc_inst).lsfdeqold、lsfmeanTbl、LPC_FILTERORDER*sizeof(浮かべます)。 memset(*iLBCenc_inst).lpc_バッファ、0(LPC_LOOKBACK+BLOCKL_最大) *sizeof(浮かべます))。 memset(*iLBCenc_inst).hpimem、0、4*sizeof(浮かべます)。

       return (iLBCenc_inst->no_of_bytes);
   }

(_バイトのiLBCencの_のinst>のノー_)を返してください。 }

   /*----------------------------------------------------------------*
    *  main encoder function
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * 主なエンコーダ機能*---------------------------------------------------------------*/

   void iLBC_encode(
       unsigned char *bytes,           /* (o) encoded data bits iLBC */
       float *block,                   /* (o) speech vector to
                                              encode */
       iLBC_Enc_Inst_t *iLBCenc_inst   /* (i/o) the general encoder
                                              state */
   ){

iLBC_エンコードを欠如させてください(無記名の炭*バイト、/*(o)はデータ・ビットiLBC*/浮遊物*ブロックをコード化して、/*(o)スピーチベクトルはエンコード*/iLBC_Enc_Inst_t*iLBCenc_inst/*(入出力)への一般的なエンコーダ状態*/です)。

       float data[BLOCKL_MAX];
       float residual[BLOCKL_MAX], reverseResidual[BLOCKL_MAX];

データ[BLOCKL_MAX]を広めてください。 残差[BLOCKL_MAX]、reverseResidual[BLOCKL_MAX]を浮かべてください。

       int start, idxForMax, idxVec[STATE_LEN];

int始め、idxForMax、idxVec[州_LEN]。

Andersen, et al.              Experimental                     [Page 54]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[54ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       float reverseDecresidual[BLOCKL_MAX], mem[CB_MEML];
       int n, k, meml_gotten, Nfor, Nback, i, pos;
       int gain_index[CB_NSTAGES*NASUB_MAX],
           extra_gain_index[CB_NSTAGES];
       int cb_index[CB_NSTAGES*NASUB_MAX],extra_cb_index[CB_NSTAGES];
       int lsf_i[LSF_NSPLIT*LPC_N_MAX];
       unsigned char *pbytes;
       int diff, start_pos, state_first;
       float en1, en2;
       int index, ulp, firstpart;
       int subcount, subframe;
       float weightState[LPC_FILTERORDER];
       float syntdenum[NSUB_MAX*(LPC_FILTERORDER+1)];
       float weightdenum[NSUB_MAX*(LPC_FILTERORDER+1)];
       float decresidual[BLOCKL_MAX];

reverseDecresidual[BLOCKL_MAX]、mem[CB_MEML]を浮かべてください。 int n、k、手に入れられたmeml_、Nfor、Nback、i、pos。 int利得_インデックス[CB_NSTAGES*NASUB_MAX]、余分な_利得_インデックス[CB_NSTAGES]。 int cb_インデックス[CB_NSTAGES*NASUB_MAX]、余分な_cb_インデックス[CB_NSTAGES]。 int lsf_i[LSF_NSPLIT*LPC_N_MAX]。 無記名の炭*pbytes。 intデフ、始め_posは最初に、_を述べます。 en1、en2を浮かべてください。 intインデックス、ulp、firstpart。 int subcount、「副-フレーム」。 weightState[LPC_FILTERORDER]を浮かべてください。 syntdenum[NSUB_マックス*(LPC_FILTERORDER+1)]を浮かべてください。 weightdenum[NSUB_マックス*(LPC_FILTERORDER+1)]を浮かべてください。 decresidual[BLOCKL_MAX]を浮かべてください。

       /* high pass filtering of input signal if such is not done
              prior to calling this function */

この機能を*/と呼ぶ前に、そのようなものであるなら入力信号の/*高いパスフィルタリングをしません。

       hpInput(block, iLBCenc_inst->blockl,
                   data, (*iLBCenc_inst).hpimem);

hpInput(ブロック、>blockl、データ(*iLBCenc_inst)をinstしている_iLBCenc.hpimem)。

       /* otherwise simply copy */

そうでなければ、/*は単に*/をコピーします。

       /*memcpy(data,block,iLBCenc_inst->blockl*sizeof(float));*/

/*は(データ、ブロック、iLBCencの_のinst>のblockl*sizeof(浮かべる))をmemcpyします; */

       /* LPC of hp filtered input data */

hpの/*LPCは入力データ*/をフィルターにかけました。

       LPCencode(syntdenum, weightdenum, lsf_i, data, iLBCenc_inst);

LPCencode(syntdenum、weightdenum、lsf_i、データ、iLBCenc_inst)。

       /* inverse filter to get residual */

残差*/を得る/*逆フィルター

       for (n=0; n<iLBCenc_inst->nsub; n++) {
           anaFilter(&data[n*SUBL], &syntdenum[n*(LPC_FILTERORDER+1)],
               SUBL, &residual[n*SUBL], iLBCenc_inst->anaMem);
       }

(n=0; n<の_のinst>のiLBCenc nsub; n++)のためにanaFilter(データ[n*SUBL]、syntdenum[n*(LPC_FILTERORDER+1)]、SUBL、および残りの[n*SUBL]、_のinst>のiLBCenc anaMem)。

       /* find state location */

/*掘り出し物の状態位置*/

       start = FrameClassify(iLBCenc_inst, residual);

=FrameClassify(iLBCenc_inst、残差)を始動してください。

       /* check if state should be in first or last part of the
       two subframes */

/*は、州が最初にあるべきであるか、または2「副-フレーム」*/の一部が続くべきであるかをチェックします。

       diff = STATE_LEN - iLBCenc_inst->state_short_len;
       en1 = 0;
       index = (start-1)*SUBL;

デフ=州_LEN--iLBCenc_inst->は_短い_lenを述べます。 en1=0。 =(始め-1)*SUBLに索引をつけてください。

Andersen, et al.              Experimental                     [Page 55]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[55ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       for (i = 0; i < iLBCenc_inst->state_short_len; i++) {
           en1 += residual[index+i]*residual[index+i];
       }
       en2 = 0;
       index = (start-1)*SUBL+diff;
       for (i = 0; i < iLBCenc_inst->state_short_len; i++) {
           en2 += residual[index+i]*residual[index+i];
       }

(i=0; _i<のiLBCencの_のinst>の州のショート_len; i++) en1+=残差[インデックス+i]*残差[インデックス+i]; en2=0。 =(始め-1)*SUBL+デフに索引をつけてください。 (i=0; _i<のiLBCencの_のinst>の州のショート_len; i++)のためにen2+=残差[インデックス+i]*残差[インデックス+i]。

       if (en1 > en2) {
           state_first = 1;
           start_pos = (start-1)*SUBL;
       } else {
           state_first = 0;
           start_pos = (start-1)*SUBL + diff;
       }

(en1>en2)であるなら、ほかに、_始め_posが*SUBLと等しいという(始め-1)最初に、=1を述べてください。_最初に、=0を述べてください; 始め_pos=(始め-1)*SUBL+デフ

       /* scalar quantization of state */

状態*/の/*スカラ量子化

       StateSearchW(iLBCenc_inst, &residual[start_pos],
           &syntdenum[(start-1)*(LPC_FILTERORDER+1)],
           &weightdenum[(start-1)*(LPC_FILTERORDER+1)], &idxForMax,
           idxVec, iLBCenc_inst->state_short_len, state_first);

StateSearchW(iLBCenc_inst、および残差[_posを始動する]、およびsyntdenum*(LPC_FILTERORDER+1]、およびweightdenum(始め-1)*(LPC_FILTERORDER+1]、およびidxForMax、idxVec、iLBCenc_inst->が_簡潔に述べる(始め-1)_lenは最初に、_を述べます)。

       StateConstructW(idxForMax, idxVec,
           &syntdenum[(start-1)*(LPC_FILTERORDER+1)],
           &decresidual[start_pos], iLBCenc_inst->state_short_len);

StateConstructW(idxForMax、idxVec、およびsyntdenum*(LPC_FILTERORDER+1]、およびdecresidual[_posを始動する](始め-1)、iLBCenc_inst->は_短い_lenを述べます)。

       /* predictive quantization in state */

状態*/の/*予言の量子化

       if (state_first) { /* put adaptive part in the end */

(状態_1番目)である、/*は終わり*/に適応型の部分を入れました。

           /* setup memory */

/*セットアップメモリ*/

           memset(mem, 0,
               (CB_MEML-iLBCenc_inst->state_short_len)*sizeof(float));
           memcpy(mem+CB_MEML-iLBCenc_inst->state_short_len,
               decresidual+start_pos,
               iLBCenc_inst->state_short_len*sizeof(float));
           memset(weightState, 0, LPC_FILTERORDER*sizeof(float));

memset(mem、0、(CB_MEML-iLBCenc_inst->は_短い_lenを述べます)*sizeof(浮かべます))。 memcpy(mem+CB_MEML-iLBCenc_inst->は__短い_len、decresidual+スタートposを述べて、iLBCenc_inst->は州_短い_len*sizeof(浮く)です)。 memset(weightState、0、LPC_FILTERORDER*sizeof(浮かべます))。

           /* encode sub-frames */

/*エンコードサブフレーム*/

           iCBSearch(iLBCenc_inst, extra_cb_index, extra_gain_index,
               &residual[start_pos+iLBCenc_inst->state_short_len],
               mem+CB_MEML-stMemLTbl,
               stMemLTbl, diff, CB_NSTAGES,

iCBSearch、(iLBCenc_inst、余分な_cb_インデックス、余分な_利得_インデックス、および残り[__iLBCenc_inst pos+>州の短い_lenを始動する]の_mem+CB MEML-stMemLTbl、stMemLTbl、デフ、CB_NSTAGES

Andersen, et al.              Experimental                     [Page 56]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[56ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

               &weightdenum[start*(LPC_FILTERORDER+1)],
               weightState, 0);

&weightdenum[start*(LPC_FILTERORDER+1)], weightState, 0);

           /* construct decoded vector */

/* construct decoded vector */

           iCBConstruct(
               &decresidual[start_pos+iLBCenc_inst->state_short_len],
               extra_cb_index, extra_gain_index,
               mem+CB_MEML-stMemLTbl,
               stMemLTbl, diff, CB_NSTAGES);

iCBConstruct( &decresidual[start_pos+iLBCenc_inst->state_short_len], extra_cb_index, extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl, diff, CB_NSTAGES);

       }
       else { /* put adaptive part in the beginning */

} else { /* put adaptive part in the beginning */

           /* create reversed vectors for prediction */

/* create reversed vectors for prediction */

           for (k=0; k<diff; k++) {
               reverseResidual[k] = residual[(start+1)*SUBL-1
                   -(k+iLBCenc_inst->state_short_len)];
           }

for (k=0; k<diff; k++) { reverseResidual[k] = residual[(start+1)*SUBL-1 -(k+iLBCenc_inst->state_short_len)]; }

           /* setup memory */

/* setup memory */

           meml_gotten = iLBCenc_inst->state_short_len;
           for (k=0; k<meml_gotten; k++) {
               mem[CB_MEML-1-k] = decresidual[start_pos + k];
           }
           memset(mem, 0, (CB_MEML-k)*sizeof(float));
           memset(weightState, 0, LPC_FILTERORDER*sizeof(float));

meml_gotten = iLBCenc_inst->state_short_len; for (k=0; k<meml_gotten; k++) { mem[CB_MEML-1-k] = decresidual[start_pos + k]; } memset(mem, 0, (CB_MEML-k)*sizeof(float)); memset(weightState, 0, LPC_FILTERORDER*sizeof(float));

           /* encode sub-frames */

/* encode sub-frames */

           iCBSearch(iLBCenc_inst, extra_cb_index, extra_gain_index,
               reverseResidual, mem+CB_MEML-stMemLTbl, stMemLTbl,
               diff, CB_NSTAGES,
               &weightdenum[(start-1)*(LPC_FILTERORDER+1)],
               weightState, 0);

iCBSearch(iLBCenc_inst, extra_cb_index, extra_gain_index, reverseResidual, mem+CB_MEML-stMemLTbl, stMemLTbl, diff, CB_NSTAGES, &weightdenum[(start-1)*(LPC_FILTERORDER+1)], weightState, 0);

           /* construct decoded vector */

/* construct decoded vector */

           iCBConstruct(reverseDecresidual, extra_cb_index,
               extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl,
               diff, CB_NSTAGES);

iCBConstruct(reverseDecresidual, extra_cb_index, extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl, diff, CB_NSTAGES);

           /* get decoded residual from reversed vector */

/* get decoded residual from reversed vector */

           for (k=0; k<diff; k++) {
               decresidual[start_pos-1-k] = reverseDecresidual[k];

for (k=0; k<diff; k++) { decresidual[start_pos-1-k] = reverseDecresidual[k];

Andersen, et al.              Experimental                     [Page 57]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 57] RFC 3951 Internet Low Bit Rate Codec December 2004

           }
       }

} }

       /* counter for predicted sub-frames */

/* counter for predicted sub-frames */

       subcount=0;

subcount=0;

       /* forward prediction of sub-frames */

/* forward prediction of sub-frames */

       Nfor = iLBCenc_inst->nsub-start-1;

Nfor = iLBCenc_inst->nsub-start-1;

       if ( Nfor > 0 ) {

if ( Nfor > 0 ) {

           /* setup memory */

/* setup memory */

           memset(mem, 0, (CB_MEML-STATE_LEN)*sizeof(float));
           memcpy(mem+CB_MEML-STATE_LEN, decresidual+(start-1)*SUBL,
               STATE_LEN*sizeof(float));
           memset(weightState, 0, LPC_FILTERORDER*sizeof(float));

memset(mem, 0, (CB_MEML-STATE_LEN)*sizeof(float)); memcpy(mem+CB_MEML-STATE_LEN, decresidual+(start-1)*SUBL, STATE_LEN*sizeof(float)); memset(weightState, 0, LPC_FILTERORDER*sizeof(float));

           /* loop over sub-frames to encode */

/* loop over sub-frames to encode */

           for (subframe=0; subframe<Nfor; subframe++) {

for (subframe=0; subframe<Nfor; subframe++) {

               /* encode sub-frame */

/* encode sub-frame */

               iCBSearch(iLBCenc_inst, cb_index+subcount*CB_NSTAGES,
                   gain_index+subcount*CB_NSTAGES,
                   &residual[(start+1+subframe)*SUBL],
                   mem+CB_MEML-memLfTbl[subcount],
                   memLfTbl[subcount], SUBL, CB_NSTAGES,
                   &weightdenum[(start+1+subframe)*
                               (LPC_FILTERORDER+1)],
                   weightState, subcount+1);

iCBSearch(iLBCenc_inst, cb_index+subcount*CB_NSTAGES, gain_index+subcount*CB_NSTAGES, &residual[(start+1+subframe)*SUBL], mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount], SUBL, CB_NSTAGES, &weightdenum[(start+1+subframe)* (LPC_FILTERORDER+1)], weightState, subcount+1);

               /* construct decoded vector */

/* construct decoded vector */

               iCBConstruct(&decresidual[(start+1+subframe)*SUBL],
                   cb_index+subcount*CB_NSTAGES,
                   gain_index+subcount*CB_NSTAGES,
                   mem+CB_MEML-memLfTbl[subcount],
                   memLfTbl[subcount], SUBL, CB_NSTAGES);

iCBConstruct(&decresidual[(start+1+subframe)*SUBL], cb_index+subcount*CB_NSTAGES, gain_index+subcount*CB_NSTAGES, mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount], SUBL, CB_NSTAGES);

               /* update memory */

/* update memory */

               memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float));
               memcpy(mem+CB_MEML-SUBL,

memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float)); memcpy(mem+CB_MEML-SUBL,

Andersen, et al.              Experimental                     [Page 58]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 58] RFC 3951 Internet Low Bit Rate Codec December 2004

                   &decresidual[(start+1+subframe)*SUBL],
                   SUBL*sizeof(float));
               memset(weightState, 0, LPC_FILTERORDER*sizeof(float));

&decresidual[(start+1+subframe)*SUBL], SUBL*sizeof(float)); memset(weightState, 0, LPC_FILTERORDER*sizeof(float));

               subcount++;
           }
       }

subcount++; } }

       /* backward prediction of sub-frames */

/* backward prediction of sub-frames */

       Nback = start-1;

Nback = start-1;

       if ( Nback > 0 ) {

if ( Nback > 0 ) {

           /* create reverse order vectors */

/* create reverse order vectors */

           for (n=0; n<Nback; n++) {
               for (k=0; k<SUBL; k++) {
                   reverseResidual[n*SUBL+k] =
                       residual[(start-1)*SUBL-1-n*SUBL-k];
                   reverseDecresidual[n*SUBL+k] =
                       decresidual[(start-1)*SUBL-1-n*SUBL-k];
               }
           }

for (n=0; n<Nback; n++) { for (k=0; k<SUBL; k++) { reverseResidual[n*SUBL+k] = residual[(start-1)*SUBL-1-n*SUBL-k]; reverseDecresidual[n*SUBL+k] = decresidual[(start-1)*SUBL-1-n*SUBL-k]; } }

           /* setup memory */

/* setup memory */

           meml_gotten = SUBL*(iLBCenc_inst->nsub+1-start);

meml_gotten = SUBL*(iLBCenc_inst->nsub+1-start);

           if ( meml_gotten > CB_MEML ) {
               meml_gotten=CB_MEML;
           }
           for (k=0; k<meml_gotten; k++) {
               mem[CB_MEML-1-k] = decresidual[(start-1)*SUBL + k];
           }
           memset(mem, 0, (CB_MEML-k)*sizeof(float));
           memset(weightState, 0, LPC_FILTERORDER*sizeof(float));

if ( meml_gotten > CB_MEML ) { meml_gotten=CB_MEML; } for (k=0; k<meml_gotten; k++) { mem[CB_MEML-1-k] = decresidual[(start-1)*SUBL + k]; } memset(mem, 0, (CB_MEML-k)*sizeof(float)); memset(weightState, 0, LPC_FILTERORDER*sizeof(float));

           /* loop over sub-frames to encode */

/* loop over sub-frames to encode */

           for (subframe=0; subframe<Nback; subframe++) {

for (subframe=0; subframe<Nback; subframe++) {

               /* encode sub-frame */

/* encode sub-frame */

               iCBSearch(iLBCenc_inst, cb_index+subcount*CB_NSTAGES,

iCBSearch(iLBCenc_inst, cb_index+subcount*CB_NSTAGES,

Andersen, et al.              Experimental                     [Page 59]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 59] RFC 3951 Internet Low Bit Rate Codec December 2004

                   gain_index+subcount*CB_NSTAGES,
                   &reverseResidual[subframe*SUBL],
                   mem+CB_MEML-memLfTbl[subcount],
                   memLfTbl[subcount], SUBL, CB_NSTAGES,
                   &weightdenum[(start-2-subframe)*
                               (LPC_FILTERORDER+1)],
                   weightState, subcount+1);

gain_index+subcount*CB_NSTAGES, &reverseResidual[subframe*SUBL], mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount], SUBL, CB_NSTAGES, &weightdenum[(start-2-subframe)* (LPC_FILTERORDER+1)], weightState, subcount+1);

               /* construct decoded vector */

/* construct decoded vector */

               iCBConstruct(&reverseDecresidual[subframe*SUBL],
                   cb_index+subcount*CB_NSTAGES,
                   gain_index+subcount*CB_NSTAGES,
                   mem+CB_MEML-memLfTbl[subcount],
                   memLfTbl[subcount], SUBL, CB_NSTAGES);

iCBConstruct(&reverseDecresidual[subframe*SUBL], cb_index+subcount*CB_NSTAGES, gain_index+subcount*CB_NSTAGES, mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount], SUBL, CB_NSTAGES);

               /* update memory */

/* update memory */

               memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float));
               memcpy(mem+CB_MEML-SUBL,
                   &reverseDecresidual[subframe*SUBL],
                   SUBL*sizeof(float));
               memset(weightState, 0, LPC_FILTERORDER*sizeof(float));

memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float)); memcpy(mem+CB_MEML-SUBL, &reverseDecresidual[subframe*SUBL], SUBL*sizeof(float)); memset(weightState, 0, LPC_FILTERORDER*sizeof(float));

               subcount++;

subcount++;

           }

}

           /* get decoded residual from reversed vector */

/* get decoded residual from reversed vector */

           for (i=0; i<SUBL*Nback; i++) {
               decresidual[SUBL*Nback - i - 1] =
                   reverseDecresidual[i];
           }
       }
       /* end encoding part */

for (i=0; i<SUBL*Nback; i++) { decresidual[SUBL*Nback - i - 1] = reverseDecresidual[i]; } } /* end encoding part */

       /* adjust index */
       index_conv_enc(cb_index);

/* adjust index */ index_conv_enc(cb_index);

       /* pack bytes */

/* pack bytes */

       pbytes=bytes;
       pos=0;

pbytes=bytes; pos=0;

       /* loop over the 3 ULP classes */

/* loop over the 3 ULP classes */

       for (ulp=0; ulp<3; ulp++) {

for (ulp=0; ulp<3; ulp++) {

Andersen, et al.              Experimental                     [Page 60]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 60] RFC 3951 Internet Low Bit Rate Codec December 2004

           /* LSF */
           for (k=0; k<LSF_NSPLIT*iLBCenc_inst->lpc_n; k++) {
               packsplit(&lsf_i[k], &firstpart, &lsf_i[k],
                   iLBCenc_inst->ULP_inst->lsf_bits[k][ulp],
                   iLBCenc_inst->ULP_inst->lsf_bits[k][ulp]+
                   iLBCenc_inst->ULP_inst->lsf_bits[k][ulp+1]+
                   iLBCenc_inst->ULP_inst->lsf_bits[k][ulp+2]);
               dopack( &pbytes, firstpart,
                   iLBCenc_inst->ULP_inst->lsf_bits[k][ulp], &pos);
           }

/* LSF */ for (k=0; k<LSF_NSPLIT*iLBCenc_inst->lpc_n; k++) { packsplit(&lsf_i[k], &firstpart, &lsf_i[k], iLBCenc_inst->ULP_inst->lsf_bits[k][ulp], iLBCenc_inst->ULP_inst->lsf_bits[k][ulp]+ iLBCenc_inst->ULP_inst->lsf_bits[k][ulp+1]+ iLBCenc_inst->ULP_inst->lsf_bits[k][ulp+2]); dopack( &pbytes, firstpart, iLBCenc_inst->ULP_inst->lsf_bits[k][ulp], &pos); }

           /* Start block info */

/* Start block info */

           packsplit(&start, &firstpart, &start,
               iLBCenc_inst->ULP_inst->start_bits[ulp],
               iLBCenc_inst->ULP_inst->start_bits[ulp]+
               iLBCenc_inst->ULP_inst->start_bits[ulp+1]+
               iLBCenc_inst->ULP_inst->start_bits[ulp+2]);
           dopack( &pbytes, firstpart,
               iLBCenc_inst->ULP_inst->start_bits[ulp], &pos);

packsplit(&start, &firstpart, &start, iLBCenc_inst->ULP_inst->start_bits[ulp], iLBCenc_inst->ULP_inst->start_bits[ulp]+ iLBCenc_inst->ULP_inst->start_bits[ulp+1]+ iLBCenc_inst->ULP_inst->start_bits[ulp+2]); dopack( &pbytes, firstpart, iLBCenc_inst->ULP_inst->start_bits[ulp], &pos);

           packsplit(&state_first, &firstpart, &state_first,
               iLBCenc_inst->ULP_inst->startfirst_bits[ulp],
               iLBCenc_inst->ULP_inst->startfirst_bits[ulp]+
               iLBCenc_inst->ULP_inst->startfirst_bits[ulp+1]+
               iLBCenc_inst->ULP_inst->startfirst_bits[ulp+2]);
           dopack( &pbytes, firstpart,
               iLBCenc_inst->ULP_inst->startfirst_bits[ulp], &pos);

packsplit(&state_first, &firstpart, &state_first, iLBCenc_inst->ULP_inst->startfirst_bits[ulp], iLBCenc_inst->ULP_inst->startfirst_bits[ulp]+ iLBCenc_inst->ULP_inst->startfirst_bits[ulp+1]+ iLBCenc_inst->ULP_inst->startfirst_bits[ulp+2]); dopack( &pbytes, firstpart, iLBCenc_inst->ULP_inst->startfirst_bits[ulp], &pos);

           packsplit(&idxForMax, &firstpart, &idxForMax,
               iLBCenc_inst->ULP_inst->scale_bits[ulp],
               iLBCenc_inst->ULP_inst->scale_bits[ulp]+
               iLBCenc_inst->ULP_inst->scale_bits[ulp+1]+
               iLBCenc_inst->ULP_inst->scale_bits[ulp+2]);
           dopack( &pbytes, firstpart,
               iLBCenc_inst->ULP_inst->scale_bits[ulp], &pos);

packsplit(&idxForMax, &firstpart, &idxForMax, iLBCenc_inst->ULP_inst->scale_bits[ulp], iLBCenc_inst->ULP_inst->scale_bits[ulp]+ iLBCenc_inst->ULP_inst->scale_bits[ulp+1]+ iLBCenc_inst->ULP_inst->scale_bits[ulp+2]); dopack( &pbytes, firstpart, iLBCenc_inst->ULP_inst->scale_bits[ulp], &pos);

           for (k=0; k<iLBCenc_inst->state_short_len; k++) {
               packsplit(idxVec+k, &firstpart, idxVec+k,
                   iLBCenc_inst->ULP_inst->state_bits[ulp],
                   iLBCenc_inst->ULP_inst->state_bits[ulp]+
                   iLBCenc_inst->ULP_inst->state_bits[ulp+1]+
                   iLBCenc_inst->ULP_inst->state_bits[ulp+2]);
               dopack( &pbytes, firstpart,
                   iLBCenc_inst->ULP_inst->state_bits[ulp], &pos);
           }

for (k=0; k<iLBCenc_inst->state_short_len; k++) { packsplit(idxVec+k, &firstpart, idxVec+k, iLBCenc_inst->ULP_inst->state_bits[ulp], iLBCenc_inst->ULP_inst->state_bits[ulp]+ iLBCenc_inst->ULP_inst->state_bits[ulp+1]+ iLBCenc_inst->ULP_inst->state_bits[ulp+2]); dopack( &pbytes, firstpart, iLBCenc_inst->ULP_inst->state_bits[ulp], &pos); }

Andersen, et al.              Experimental                     [Page 61]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 61] RFC 3951 Internet Low Bit Rate Codec December 2004

           /* 23/22 (20ms/30ms) sample block */

/* 23/22 (20ms/30ms) sample block */

           for (k=0;k<CB_NSTAGES;k++) {
               packsplit(extra_cb_index+k, &firstpart,
                   extra_cb_index+k,
                   iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp],
                   iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp]+
                   iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp+1]+
                   iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp+2]);
               dopack( &pbytes, firstpart,
                   iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp],
                   &pos);
           }

for (k=0;k<CB_NSTAGES;k++) { packsplit(extra_cb_index+k, &firstpart, extra_cb_index+k, iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp], iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp]+ iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp+1]+ iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp+2]); dopack( &pbytes, firstpart, iLBCenc_inst->ULP_inst->extra_cb_index[k][ulp], &pos); }

           for (k=0;k<CB_NSTAGES;k++) {
               packsplit(extra_gain_index+k, &firstpart,
                   extra_gain_index+k,
                   iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp],
                   iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp]+
                   iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp+1]+
                   iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp+2]);
               dopack( &pbytes, firstpart,
                   iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp],
                   &pos);
           }

for (k=0;k<CB_NSTAGES;k++) { packsplit(extra_gain_index+k, &firstpart, extra_gain_index+k, iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp], iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp]+ iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp+1]+ iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp+2]); dopack( &pbytes, firstpart, iLBCenc_inst->ULP_inst->extra_cb_gain[k][ulp], &pos); }

           /* The two/four (20ms/30ms) 40 sample sub-blocks */

/* The two/four (20ms/30ms) 40 sample sub-blocks */

           for (i=0; i<iLBCenc_inst->nasub; i++) {
               for (k=0; k<CB_NSTAGES; k++) {
                   packsplit(cb_index+i*CB_NSTAGES+k, &firstpart,
                       cb_index+i*CB_NSTAGES+k,
                       iLBCenc_inst->ULP_inst->cb_index[i][k][ulp],
                       iLBCenc_inst->ULP_inst->cb_index[i][k][ulp]+
                       iLBCenc_inst->ULP_inst->cb_index[i][k][ulp+1]+
                       iLBCenc_inst->ULP_inst->cb_index[i][k][ulp+2]);
                   dopack( &pbytes, firstpart,
                       iLBCenc_inst->ULP_inst->cb_index[i][k][ulp],
                       &pos);
               }
           }

for (i=0; i<iLBCenc_inst->nasub; i++) { for (k=0; k<CB_NSTAGES; k++) { packsplit(cb_index+i*CB_NSTAGES+k, &firstpart, cb_index+i*CB_NSTAGES+k, iLBCenc_inst->ULP_inst->cb_index[i][k][ulp], iLBCenc_inst->ULP_inst->cb_index[i][k][ulp]+ iLBCenc_inst->ULP_inst->cb_index[i][k][ulp+1]+ iLBCenc_inst->ULP_inst->cb_index[i][k][ulp+2]); dopack( &pbytes, firstpart, iLBCenc_inst->ULP_inst->cb_index[i][k][ulp], &pos); } }

           for (i=0; i<iLBCenc_inst->nasub; i++) {
               for (k=0; k<CB_NSTAGES; k++) {
                   packsplit(gain_index+i*CB_NSTAGES+k, &firstpart,
                       gain_index+i*CB_NSTAGES+k,
                       iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp],
                       iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp]+

for (i=0; i<iLBCenc_inst->nasub; i++) { for (k=0; k<CB_NSTAGES; k++) { packsplit(gain_index+i*CB_NSTAGES+k, &firstpart, gain_index+i*CB_NSTAGES+k, iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp], iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp]+

Andersen, et al.              Experimental                     [Page 62]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 62] RFC 3951 Internet Low Bit Rate Codec December 2004

                       iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp+1]+
                       iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp+2]);
                   dopack( &pbytes, firstpart,
                       iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp],
                       &pos);
               }
           }
       }

iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp+1]+ iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp+2]); dopack( &pbytes, firstpart, iLBCenc_inst->ULP_inst->cb_gain[i][k][ulp], &pos); } } }

       /* set the last bit to zero (otherwise the decoder
          will treat it as a lost frame) */
       dopack( &pbytes, 0, 1, &pos);
   }

/* set the last bit to zero (otherwise the decoder will treat it as a lost frame) */ dopack( &pbytes, 0, 1, &pos); }

A.4.  iLBC_decode.h

A.4. iLBC_decode.h

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC Speech Coder ANSI-C Source Code

       iLBC_decode.h

iLBC_decode.h

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright (C) The Internet Society (2004). All Rights Reserved.

   ******************************************************************/

******************************************************************/

   #ifndef __iLBC_ILBCDECODE_H
   #define __iLBC_ILBCDECODE_H

#ifndef __iLBC_ILBCDECODE_H #define __iLBC_ILBCDECODE_H

   #include "iLBC_define.h"

#include "iLBC_define.h"

   short initDecode(                   /* (o) Number of decoded
                                              samples */
       iLBC_Dec_Inst_t *iLBCdec_inst,  /* (i/o) Decoder instance */
       int mode,                       /* (i) frame size mode */
       int use_enhancer                /* (i) 1 to use enhancer
                                              0 to run without
                                                enhancer */
   );

short initDecode( /* (o) Number of decoded samples */ iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) Decoder instance */ int mode, /* (i) frame size mode */ int use_enhancer /* (i) 1 to use enhancer 0 to run without enhancer */ );

   void iLBC_decode(
       float *decblock,            /* (o) decoded signal block */
       unsigned char *bytes,           /* (i) encoded signal bits */
       iLBC_Dec_Inst_t *iLBCdec_inst,  /* (i/o) the decoder state
                                                structure */
       int mode                    /* (i) 0: bad packet, PLC,
                                              1: normal */

void iLBC_decode( float *decblock, /* (o) decoded signal block */ unsigned char *bytes, /* (i) encoded signal bits */ iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) the decoder state structure */ int mode /* (i) 0: bad packet, PLC, 1: normal */

Andersen, et al.              Experimental                     [Page 63]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 63] RFC 3951 Internet Low Bit Rate Codec December 2004

   );

);

   #endif

#endif

A.5.  iLBC_decode.c

A.5. iLBC_decode.c

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC Speech Coder ANSI-C Source Code

       iLBC_decode.c

iLBC_decode.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright (C) The Internet Society (2004). All Rights Reserved.

   ******************************************************************/

******************************************************************/

   #include <math.h>
   #include <stdlib.h>

#include <math.h> #include <stdlib.h>

   #include "iLBC_define.h"
   #include "StateConstructW.h"
   #include "LPCdecode.h"
   #include "iCBConstruct.h"
   #include "doCPLC.h"
   #include "helpfun.h"
   #include "constants.h"
   #include "packing.h"
   #include "string.h"
   #include "enhancer.h"
   #include "hpOutput.h"
   #include "syntFilter.h"

#include "iLBC_define.h" #include "StateConstructW.h" #include "LPCdecode.h" #include "iCBConstruct.h" #include "doCPLC.h" #include "helpfun.h" #include "constants.h" #include "packing.h" #include "string.h" #include "enhancer.h" #include "hpOutput.h" #include "syntFilter.h"

   /*----------------------------------------------------------------*
    *  Initiation of decoder instance.
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * Initiation of decoder instance. *---------------------------------------------------------------*/

   short initDecode(                   /* (o) Number of decoded
                                              samples */
       iLBC_Dec_Inst_t *iLBCdec_inst,  /* (i/o) Decoder instance */
       int mode,                       /* (i) frame size mode */
       int use_enhancer                /* (i) 1 to use enhancer
                                              0 to run without
                                                enhancer */
   ){
       int i;

short initDecode( /* (o) Number of decoded samples */ iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) Decoder instance */ int mode, /* (i) frame size mode */ int use_enhancer /* (i) 1 to use enhancer 0 to run without enhancer */ ){ int i;

       iLBCdec_inst->mode = mode;

iLBCdec_inst->mode = mode;

Andersen, et al.              Experimental                     [Page 64]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 64] RFC 3951 Internet Low Bit Rate Codec December 2004

       if (mode==30) {
           iLBCdec_inst->blockl = BLOCKL_30MS;
           iLBCdec_inst->nsub = NSUB_30MS;
           iLBCdec_inst->nasub = NASUB_30MS;
           iLBCdec_inst->lpc_n = LPC_N_30MS;
           iLBCdec_inst->no_of_bytes = NO_OF_BYTES_30MS;
           iLBCdec_inst->no_of_words = NO_OF_WORDS_30MS;
           iLBCdec_inst->state_short_len=STATE_SHORT_LEN_30MS;
           /* ULP init */
           iLBCdec_inst->ULP_inst=&ULP_30msTbl;
       }
       else if (mode==20) {
           iLBCdec_inst->blockl = BLOCKL_20MS;
           iLBCdec_inst->nsub = NSUB_20MS;
           iLBCdec_inst->nasub = NASUB_20MS;
           iLBCdec_inst->lpc_n = LPC_N_20MS;
           iLBCdec_inst->no_of_bytes = NO_OF_BYTES_20MS;
           iLBCdec_inst->no_of_words = NO_OF_WORDS_20MS;
           iLBCdec_inst->state_short_len=STATE_SHORT_LEN_20MS;
           /* ULP init */
           iLBCdec_inst->ULP_inst=&ULP_20msTbl;
       }
       else {
           exit(2);
       }

if (mode==30) { iLBCdec_inst->blockl = BLOCKL_30MS; iLBCdec_inst->nsub = NSUB_30MS; iLBCdec_inst->nasub = NASUB_30MS; iLBCdec_inst->lpc_n = LPC_N_30MS; iLBCdec_inst->no_of_bytes = NO_OF_BYTES_30MS; iLBCdec_inst->no_of_words = NO_OF_WORDS_30MS; iLBCdec_inst->state_short_len=STATE_SHORT_LEN_30MS; /* ULP init */ iLBCdec_inst->ULP_inst=&ULP_30msTbl; } else if (mode==20) { iLBCdec_inst->blockl = BLOCKL_20MS; iLBCdec_inst->nsub = NSUB_20MS; iLBCdec_inst->nasub = NASUB_20MS; iLBCdec_inst->lpc_n = LPC_N_20MS; iLBCdec_inst->no_of_bytes = NO_OF_BYTES_20MS; iLBCdec_inst->no_of_words = NO_OF_WORDS_20MS; iLBCdec_inst->state_short_len=STATE_SHORT_LEN_20MS; /* ULP init */ iLBCdec_inst->ULP_inst=&ULP_20msTbl; } else { exit(2); }

       memset(iLBCdec_inst->syntMem, 0,
           LPC_FILTERORDER*sizeof(float));
       memcpy((*iLBCdec_inst).lsfdeqold, lsfmeanTbl,
           LPC_FILTERORDER*sizeof(float));

memset(iLBCdec_inst->syntMem, 0, LPC_FILTERORDER*sizeof(float)); memcpy((*iLBCdec_inst).lsfdeqold, lsfmeanTbl, LPC_FILTERORDER*sizeof(float));

       memset(iLBCdec_inst->old_syntdenum, 0,
           ((LPC_FILTERORDER + 1)*NSUB_MAX)*sizeof(float));
       for (i=0; i<NSUB_MAX; i++)
           iLBCdec_inst->old_syntdenum[i*(LPC_FILTERORDER+1)]=1.0;

memset(iLBCdec_inst->old_syntdenum, 0, ((LPC_FILTERORDER + 1)*NSUB_MAX)*sizeof(float)); for (i=0; i<NSUB_MAX; i++) iLBCdec_inst->old_syntdenum[i*(LPC_FILTERORDER+1)]=1.0;

       iLBCdec_inst->last_lag = 20;

iLBCdec_inst->last_lag = 20;

       iLBCdec_inst->prevLag = 120;
       iLBCdec_inst->per = 0.0;
       iLBCdec_inst->consPLICount = 0;
       iLBCdec_inst->prevPLI = 0;
       iLBCdec_inst->prevLpc[0] = 1.0;
       memset(iLBCdec_inst->prevLpc+1,0,
           LPC_FILTERORDER*sizeof(float));
       memset(iLBCdec_inst->prevResidual, 0, BLOCKL_MAX*sizeof(float));
       iLBCdec_inst->seed=777;

iLBCdec_inst->prevLag = 120; iLBCdec_inst->per = 0.0; iLBCdec_inst->consPLICount = 0; iLBCdec_inst->prevPLI = 0; iLBCdec_inst->prevLpc[0] = 1.0; memset(iLBCdec_inst->prevLpc+1,0, LPC_FILTERORDER*sizeof(float)); memset(iLBCdec_inst->prevResidual, 0, BLOCKL_MAX*sizeof(float)); iLBCdec_inst->seed=777;

Andersen, et al.              Experimental                     [Page 65]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 65] RFC 3951 Internet Low Bit Rate Codec December 2004

       memset(iLBCdec_inst->hpomem, 0, 4*sizeof(float));

memset(iLBCdec_inst->hpomem, 0, 4*sizeof(float));

       iLBCdec_inst->use_enhancer = use_enhancer;
       memset(iLBCdec_inst->enh_buf, 0, ENH_BUFL*sizeof(float));
       for (i=0;i<ENH_NBLOCKS_TOT;i++)
           iLBCdec_inst->enh_period[i]=(float)40.0;

iLBCdec_inst->use_enhancer = use_enhancer; memset(iLBCdec_inst->enh_buf, 0, ENH_BUFL*sizeof(float)); for (i=0;i<ENH_NBLOCKS_TOT;i++) iLBCdec_inst->enh_period[i]=(float)40.0;

       iLBCdec_inst->prev_enh_pl = 0;

iLBCdec_inst->prev_enh_pl = 0;

       return (iLBCdec_inst->blockl);
   }

return (iLBCdec_inst->blockl); }

   /*----------------------------------------------------------------*
    *  frame residual decoder function (subrutine to iLBC_decode)
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * frame residual decoder function (subrutine to iLBC_decode) *---------------------------------------------------------------*/

   void Decode(
       iLBC_Dec_Inst_t *iLBCdec_inst,  /* (i/o) the decoder state
                                                structure */
       float *decresidual,             /* (o) decoded residual frame */
       int start,                      /* (i) location of start
                                              state */
       int idxForMax,                  /* (i) codebook index for the
                                              maximum value */
       int *idxVec,                /* (i) codebook indexes for the
                                              samples  in the start
                                              state */
       float *syntdenum,               /* (i) the decoded synthesis
                                              filter coefficients */
       int *cb_index,                  /* (i) the indexes for the
                                              adaptive codebook */
       int *gain_index,            /* (i) the indexes for the
                                              corresponding gains */
       int *extra_cb_index,        /* (i) the indexes for the
                                              adaptive codebook part
                                              of start state */
       int *extra_gain_index,          /* (i) the indexes for the
                                              corresponding gains */
       int state_first                 /* (i) 1 if non adaptive part
                                              of start state comes
                                              first 0 if that part
                                              comes last */
   ){
       float reverseDecresidual[BLOCKL_MAX], mem[CB_MEML];
       int k, meml_gotten, Nfor, Nback, i;
       int diff, start_pos;
       int subcount, subframe;

void Decode( iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) the decoder state structure */ float *decresidual, /* (o) decoded residual frame */ int start, /* (i) location of start state */ int idxForMax, /* (i) codebook index for the maximum value */ int *idxVec, /* (i) codebook indexes for the samples in the start state */ float *syntdenum, /* (i) the decoded synthesis filter coefficients */ int *cb_index, /* (i) the indexes for the adaptive codebook */ int *gain_index, /* (i) the indexes for the corresponding gains */ int *extra_cb_index, /* (i) the indexes for the adaptive codebook part of start state */ int *extra_gain_index, /* (i) the indexes for the corresponding gains */ int state_first /* (i) 1 if non adaptive part of start state comes first 0 if that part comes last */ ){ float reverseDecresidual[BLOCKL_MAX], mem[CB_MEML]; int k, meml_gotten, Nfor, Nback, i; int diff, start_pos; int subcount, subframe;

Andersen, et al.              Experimental                     [Page 66]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 66] RFC 3951 Internet Low Bit Rate Codec December 2004

       diff = STATE_LEN - iLBCdec_inst->state_short_len;

diff = STATE_LEN - iLBCdec_inst->state_short_len;

       if (state_first == 1) {
           start_pos = (start-1)*SUBL;
       } else {
           start_pos = (start-1)*SUBL + diff;
       }

if (state_first == 1) { start_pos = (start-1)*SUBL; } else { start_pos = (start-1)*SUBL + diff; }

       /* decode scalar part of start state */

/* decode scalar part of start state */

       StateConstructW(idxForMax, idxVec,
           &syntdenum[(start-1)*(LPC_FILTERORDER+1)],
           &decresidual[start_pos], iLBCdec_inst->state_short_len);

StateConstructW(idxForMax, idxVec, &syntdenum[(start-1)*(LPC_FILTERORDER+1)], &decresidual[start_pos], iLBCdec_inst->state_short_len);

       if (state_first) { /* put adaptive part in the end */

if (state_first) { /* put adaptive part in the end */

           /* setup memory */

/* setup memory */

           memset(mem, 0,
               (CB_MEML-iLBCdec_inst->state_short_len)*sizeof(float));
           memcpy(mem+CB_MEML-iLBCdec_inst->state_short_len,
               decresidual+start_pos,
               iLBCdec_inst->state_short_len*sizeof(float));

memset(mem, 0, (CB_MEML-iLBCdec_inst->state_short_len)*sizeof(float)); memcpy(mem+CB_MEML-iLBCdec_inst->state_short_len, decresidual+start_pos, iLBCdec_inst->state_short_len*sizeof(float));

           /* construct decoded vector */

/* construct decoded vector */

           iCBConstruct(
               &decresidual[start_pos+iLBCdec_inst->state_short_len],
               extra_cb_index, extra_gain_index, mem+CB_MEML-stMemLTbl,
               stMemLTbl, diff, CB_NSTAGES);

iCBConstruct( &decresidual[start_pos+iLBCdec_inst->state_short_len], extra_cb_index, extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl, diff, CB_NSTAGES);

       }
       else {/* put adaptive part in the beginning */

} else {/* put adaptive part in the beginning */

           /* create reversed vectors for prediction */

/* create reversed vectors for prediction */

           for (k=0; k<diff; k++) {
               reverseDecresidual[k] =
                   decresidual[(start+1)*SUBL-1-
                           (k+iLBCdec_inst->state_short_len)];
           }

for (k=0; k<diff; k++) { reverseDecresidual[k] = decresidual[(start+1)*SUBL-1- (k+iLBCdec_inst->state_short_len)]; }

           /* setup memory */

/* setup memory */

           meml_gotten = iLBCdec_inst->state_short_len;
           for (k=0; k<meml_gotten; k++){
               mem[CB_MEML-1-k] = decresidual[start_pos + k];

meml_gotten = iLBCdec_inst->state_short_len; for (k=0; k<meml_gotten; k++){ mem[CB_MEML-1-k] = decresidual[start_pos + k];

Andersen, et al.              Experimental                     [Page 67]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 67] RFC 3951 Internet Low Bit Rate Codec December 2004

           }
           memset(mem, 0, (CB_MEML-k)*sizeof(float));

} memset(mem, 0, (CB_MEML-k)*sizeof(float));

           /* construct decoded vector */

/* construct decoded vector */

           iCBConstruct(reverseDecresidual, extra_cb_index,
               extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl,
               diff, CB_NSTAGES);

iCBConstruct(reverseDecresidual, extra_cb_index, extra_gain_index, mem+CB_MEML-stMemLTbl, stMemLTbl, diff, CB_NSTAGES);

           /* get decoded residual from reversed vector */

/* get decoded residual from reversed vector */

           for (k=0; k<diff; k++) {
               decresidual[start_pos-1-k] = reverseDecresidual[k];
           }
       }

for (k=0; k<diff; k++) { decresidual[start_pos-1-k] = reverseDecresidual[k]; } }

       /* counter for predicted sub-frames */

/* counter for predicted sub-frames */

       subcount=0;

subcount=0;

       /* forward prediction of sub-frames */

/* forward prediction of sub-frames */

       Nfor = iLBCdec_inst->nsub-start-1;

Nfor = iLBCdec_inst->nsub-start-1;

       if ( Nfor > 0 ){

if ( Nfor > 0 ){

           /* setup memory */

/* setup memory */

           memset(mem, 0, (CB_MEML-STATE_LEN)*sizeof(float));
           memcpy(mem+CB_MEML-STATE_LEN, decresidual+(start-1)*SUBL,
               STATE_LEN*sizeof(float));

memset(mem, 0, (CB_MEML-STATE_LEN)*sizeof(float)); memcpy(mem+CB_MEML-STATE_LEN, decresidual+(start-1)*SUBL, STATE_LEN*sizeof(float));

           /* loop over sub-frames to encode */

/* loop over sub-frames to encode */

           for (subframe=0; subframe<Nfor; subframe++) {

for (subframe=0; subframe<Nfor; subframe++) {

               /* construct decoded vector */

/* construct decoded vector */

               iCBConstruct(&decresidual[(start+1+subframe)*SUBL],
                   cb_index+subcount*CB_NSTAGES,
                   gain_index+subcount*CB_NSTAGES,
                   mem+CB_MEML-memLfTbl[subcount],
                   memLfTbl[subcount], SUBL, CB_NSTAGES);

iCBConstruct(&decresidual[(start+1+subframe)*SUBL], cb_index+subcount*CB_NSTAGES, gain_index+subcount*CB_NSTAGES, mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount], SUBL, CB_NSTAGES);

               /* update memory */

/* update memory */

               memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float));
               memcpy(mem+CB_MEML-SUBL,

memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float)); memcpy(mem+CB_MEML-SUBL,

Andersen, et al.              Experimental                     [Page 68]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 68] RFC 3951 Internet Low Bit Rate Codec December 2004

                   &decresidual[(start+1+subframe)*SUBL],
                   SUBL*sizeof(float));

&decresidual[(start+1+subframe)*SUBL], SUBL*sizeof(float));

               subcount++;

subcount++;

           }

}

       }

}

       /* backward prediction of sub-frames */

/* backward prediction of sub-frames */

       Nback = start-1;

Nback = start-1;

       if ( Nback > 0 ) {

if ( Nback > 0 ) {

           /* setup memory */

/* setup memory */

           meml_gotten = SUBL*(iLBCdec_inst->nsub+1-start);

meml_gotten = SUBL*(iLBCdec_inst->nsub+1-start);

           if ( meml_gotten > CB_MEML ) {
               meml_gotten=CB_MEML;
           }
           for (k=0; k<meml_gotten; k++) {
               mem[CB_MEML-1-k] = decresidual[(start-1)*SUBL + k];
           }
           memset(mem, 0, (CB_MEML-k)*sizeof(float));

if ( meml_gotten > CB_MEML ) { meml_gotten=CB_MEML; } for (k=0; k<meml_gotten; k++) { mem[CB_MEML-1-k] = decresidual[(start-1)*SUBL + k]; } memset(mem, 0, (CB_MEML-k)*sizeof(float));

           /* loop over subframes to decode */

/* loop over subframes to decode */

           for (subframe=0; subframe<Nback; subframe++) {

for (subframe=0; subframe<Nback; subframe++) {

               /* construct decoded vector */

/* construct decoded vector */

               iCBConstruct(&reverseDecresidual[subframe*SUBL],
                   cb_index+subcount*CB_NSTAGES,
                   gain_index+subcount*CB_NSTAGES,
                   mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount],
                   SUBL, CB_NSTAGES);

iCBConstruct(&reverseDecresidual[subframe*SUBL], cb_index+subcount*CB_NSTAGES, gain_index+subcount*CB_NSTAGES, mem+CB_MEML-memLfTbl[subcount], memLfTbl[subcount], SUBL, CB_NSTAGES);

               /* update memory */

/* update memory */

               memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float));
               memcpy(mem+CB_MEML-SUBL,
                   &reverseDecresidual[subframe*SUBL],
                   SUBL*sizeof(float));

memcpy(mem, mem+SUBL, (CB_MEML-SUBL)*sizeof(float)); memcpy(mem+CB_MEML-SUBL, &reverseDecresidual[subframe*SUBL], SUBL*sizeof(float));

               subcount++;
           }

subcount++; }

Andersen, et al.              Experimental                     [Page 69]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 69] RFC 3951 Internet Low Bit Rate Codec December 2004

           /* get decoded residual from reversed vector */

/* get decoded residual from reversed vector */

           for (i=0; i<SUBL*Nback; i++)
               decresidual[SUBL*Nback - i - 1] =
               reverseDecresidual[i];
       }
   }

for (i=0; i<SUBL*Nback; i++) decresidual[SUBL*Nback - i - 1] = reverseDecresidual[i]; } }

   /*----------------------------------------------------------------*
    *  main decoder function
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * main decoder function *---------------------------------------------------------------*/

   void iLBC_decode(
       float *decblock,            /* (o) decoded signal block */
       unsigned char *bytes,           /* (i) encoded signal bits */
       iLBC_Dec_Inst_t *iLBCdec_inst,  /* (i/o) the decoder state
                                                structure */
       int mode                    /* (i) 0: bad packet, PLC,
                                              1: normal */
   ){
       float data[BLOCKL_MAX];
       float lsfdeq[LPC_FILTERORDER*LPC_N_MAX];
       float PLCresidual[BLOCKL_MAX], PLClpc[LPC_FILTERORDER + 1];
       float zeros[BLOCKL_MAX], one[LPC_FILTERORDER + 1];
       int k, i, start, idxForMax, pos, lastpart, ulp;
       int lag, ilag;
       float cc, maxcc;
       int idxVec[STATE_LEN];
       int check;
       int gain_index[NASUB_MAX*CB_NSTAGES],
           extra_gain_index[CB_NSTAGES];
       int cb_index[CB_NSTAGES*NASUB_MAX], extra_cb_index[CB_NSTAGES];
       int lsf_i[LSF_NSPLIT*LPC_N_MAX];
       int state_first;
       int last_bit;
       unsigned char *pbytes;
       float weightdenum[(LPC_FILTERORDER + 1)*NSUB_MAX];
       int order_plus_one;
       float syntdenum[NSUB_MAX*(LPC_FILTERORDER+1)];
       float decresidual[BLOCKL_MAX];

void iLBC_decode( float *decblock, /* (o) decoded signal block */ unsigned char *bytes, /* (i) encoded signal bits */ iLBC_Dec_Inst_t *iLBCdec_inst, /* (i/o) the decoder state structure */ int mode /* (i) 0: bad packet, PLC, 1: normal */ ){ float data[BLOCKL_MAX]; float lsfdeq[LPC_FILTERORDER*LPC_N_MAX]; float PLCresidual[BLOCKL_MAX], PLClpc[LPC_FILTERORDER + 1]; float zeros[BLOCKL_MAX], one[LPC_FILTERORDER + 1]; int k, i, start, idxForMax, pos, lastpart, ulp; int lag, ilag; float cc, maxcc; int idxVec[STATE_LEN]; int check; int gain_index[NASUB_MAX*CB_NSTAGES], extra_gain_index[CB_NSTAGES]; int cb_index[CB_NSTAGES*NASUB_MAX], extra_cb_index[CB_NSTAGES]; int lsf_i[LSF_NSPLIT*LPC_N_MAX]; int state_first; int last_bit; unsigned char *pbytes; float weightdenum[(LPC_FILTERORDER + 1)*NSUB_MAX]; int order_plus_one; float syntdenum[NSUB_MAX*(LPC_FILTERORDER+1)]; float decresidual[BLOCKL_MAX];

       if (mode>0) { /* the data are good */

if (mode>0) { /* the data are good */

           /* decode data */

/* decode data */

           pbytes=bytes;
           pos=0;

pbytes=bytes; pos=0;

Andersen, et al.              Experimental                     [Page 70]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 70] RFC 3951 Internet Low Bit Rate Codec December 2004

           /* Set everything to zero before decoding */

/* Set everything to zero before decoding */

           for (k=0; k<LSF_NSPLIT*LPC_N_MAX; k++) {
               lsf_i[k]=0;
           }
           start=0;
           state_first=0;
           idxForMax=0;
           for (k=0; k<iLBCdec_inst->state_short_len; k++) {
               idxVec[k]=0;
           }
           for (k=0; k<CB_NSTAGES; k++) {
               extra_cb_index[k]=0;
           }
           for (k=0; k<CB_NSTAGES; k++) {
               extra_gain_index[k]=0;
           }
           for (i=0; i<iLBCdec_inst->nasub; i++) {
               for (k=0; k<CB_NSTAGES; k++) {
                   cb_index[i*CB_NSTAGES+k]=0;
               }
           }
           for (i=0; i<iLBCdec_inst->nasub; i++) {
               for (k=0; k<CB_NSTAGES; k++) {
                   gain_index[i*CB_NSTAGES+k]=0;
               }
           }

for (k=0; k<LSF_NSPLIT*LPC_N_MAX; k++) { lsf_i[k]=0; } start=0; state_first=0; idxForMax=0; for (k=0; k<iLBCdec_inst->state_short_len; k++) { idxVec[k]=0; } for (k=0; k<CB_NSTAGES; k++) { extra_cb_index[k]=0; } for (k=0; k<CB_NSTAGES; k++) { extra_gain_index[k]=0; } for (i=0; i<iLBCdec_inst->nasub; i++) { for (k=0; k<CB_NSTAGES; k++) { cb_index[i*CB_NSTAGES+k]=0; } } for (i=0; i<iLBCdec_inst->nasub; i++) { for (k=0; k<CB_NSTAGES; k++) { gain_index[i*CB_NSTAGES+k]=0; } }

           /* loop over ULP classes */

/* loop over ULP classes */

           for (ulp=0; ulp<3; ulp++) {

for (ulp=0; ulp<3; ulp++) {

               /* LSF */
               for (k=0; k<LSF_NSPLIT*iLBCdec_inst->lpc_n; k++){
                   unpack( &pbytes, &lastpart,
                       iLBCdec_inst->ULP_inst->lsf_bits[k][ulp], &pos);
                   packcombine(&lsf_i[k], lastpart,
                       iLBCdec_inst->ULP_inst->lsf_bits[k][ulp]);
               }

/* LSF */ for (k=0; k<LSF_NSPLIT*iLBCdec_inst->lpc_n; k++){ unpack( &pbytes, &lastpart, iLBCdec_inst->ULP_inst->lsf_bits[k][ulp], &pos); packcombine(&lsf_i[k], lastpart, iLBCdec_inst->ULP_inst->lsf_bits[k][ulp]); }

               /* Start block info */

/* Start block info */

               unpack( &pbytes, &lastpart,
                   iLBCdec_inst->ULP_inst->start_bits[ulp], &pos);
               packcombine(&start, lastpart,
                   iLBCdec_inst->ULP_inst->start_bits[ulp]);

unpack( &pbytes, &lastpart, iLBCdec_inst->ULP_inst->start_bits[ulp], &pos); packcombine(&start, lastpart, iLBCdec_inst->ULP_inst->start_bits[ulp]);

               unpack( &pbytes, &lastpart,

unpack( &pbytes, &lastpart,

Andersen, et al.              Experimental                     [Page 71]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 71] RFC 3951 Internet Low Bit Rate Codec December 2004

                   iLBCdec_inst->ULP_inst->startfirst_bits[ulp], &pos);
               packcombine(&state_first, lastpart,
                   iLBCdec_inst->ULP_inst->startfirst_bits[ulp]);

iLBCdec_inst->ULP_inst->startfirst_bits[ulp], &pos); packcombine(&state_first, lastpart, iLBCdec_inst->ULP_inst->startfirst_bits[ulp]);

               unpack( &pbytes, &lastpart,
                   iLBCdec_inst->ULP_inst->scale_bits[ulp], &pos);
               packcombine(&idxForMax, lastpart,
                   iLBCdec_inst->ULP_inst->scale_bits[ulp]);

unpack( &pbytes, &lastpart, iLBCdec_inst->ULP_inst->scale_bits[ulp], &pos); packcombine(&idxForMax, lastpart, iLBCdec_inst->ULP_inst->scale_bits[ulp]);

               for (k=0; k<iLBCdec_inst->state_short_len; k++) {
                   unpack( &pbytes, &lastpart,
                       iLBCdec_inst->ULP_inst->state_bits[ulp], &pos);
                   packcombine(idxVec+k, lastpart,
                       iLBCdec_inst->ULP_inst->state_bits[ulp]);
               }

for (k=0; k<iLBCdec_inst->state_short_len; k++) { unpack( &pbytes, &lastpart, iLBCdec_inst->ULP_inst->state_bits[ulp], &pos); packcombine(idxVec+k, lastpart, iLBCdec_inst->ULP_inst->state_bits[ulp]); }

               /* 23/22 (20ms/30ms) sample block */

/* 23/22 (20ms/30ms) sample block */

               for (k=0; k<CB_NSTAGES; k++) {
                   unpack( &pbytes, &lastpart,
                       iLBCdec_inst->ULP_inst->extra_cb_index[k][ulp],
                       &pos);
                   packcombine(extra_cb_index+k, lastpart,
                       iLBCdec_inst->ULP_inst->extra_cb_index[k][ulp]);
               }
               for (k=0; k<CB_NSTAGES; k++) {
                   unpack( &pbytes, &lastpart,
                       iLBCdec_inst->ULP_inst->extra_cb_gain[k][ulp],
                       &pos);
                   packcombine(extra_gain_index+k, lastpart,
                       iLBCdec_inst->ULP_inst->extra_cb_gain[k][ulp]);
               }

(k=0; k<CB_NSTAGES; k++)に関しては、(k=0; k<CB_NSTAGES; k++)のためにpackcombine(余分な_cb_インデックス+k、lastpart、inst>のiLBCdecのULP_inst>の余分な__cb_インデックス[k][ulp])に荷を解いてください(pbytes、およびlastpart、iLBCdec_inst->ULP_inst>の余分な_cb_インデックス[k][ulp]、およびpos)。荷を解いてください(pbytes、およびlastpart、iLBCdec_inst->ULP_inst>の余分な_cb_利得[k][ulp]、およびpos); packcombine(余分な_は_インデックス+k、lastpartを獲得して、iLBCdec_inst->は余分な_cb_が[k]を獲得するULP_inst->[ulp]です)

               /* The two/four (20ms/30ms) 40 sample sub-blocks */

/*は2/4(20ms/30ms)40サンプルサブブロック*/です。

               for (i=0; i<iLBCdec_inst->nasub; i++) {
                   for (k=0; k<CB_NSTAGES; k++) {
                       unpack( &pbytes, &lastpart,
                       iLBCdec_inst->ULP_inst->cb_index[i][k][ulp],
                           &pos);
                       packcombine(cb_index+i*CB_NSTAGES+k, lastpart,
                       iLBCdec_inst->ULP_inst->cb_index[i][k][ulp]);
                   }
               }

(i=0; i<の_のinst>のiLBCdec nasub; i++)のために荷を解いてください(pbytes、およびlastpart、iLBCdec_inst->ULP_inst>cb_インデックス[i][k][ulp]、およびpos); (k=0; k<CB_NSTAGES; k++)に関するpackcombine(cb_インデックス+i*CB_NSTAGES+k、lastpart、iLBCdecのinst>のULP_inst>のcb_インデックス_[i][k][ulp])

               for (i=0; i<iLBCdec_inst->nasub; i++) {
                   for (k=0; k<CB_NSTAGES; k++) {
                       unpack( &pbytes, &lastpart,

(i=0; i<の_のinst>のiLBCdec nasub; i++)、(k=0; k<CB_NSTAGES; k++)、荷を解く、(pbytes、およびlastpart

Andersen, et al.              Experimental                     [Page 72]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[72ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

                       iLBCdec_inst->ULP_inst->cb_gain[i][k][ulp],
                           &pos);
                       packcombine(gain_index+i*CB_NSTAGES+k, lastpart,
                           iLBCdec_inst->ULP_inst->cb_gain[i][k][ulp]);
                   }
               }
           }
           /* Extract last bit. If it is 1 this indicates an
              empty/lost frame */
           unpack( &pbytes, &last_bit, 1, &pos);

iLBCdec_inst->ULP_inst>cb_利得[i][k][ulp]、およびpos)、。 packcombine(_インデックス+i*CB_NSTAGES+k、lastpart、iLBCdec_inst->にcb_が[i] [k][ulp]を獲得するULP_inst->を獲得します)。 /*抽出に最後に噛み付きました。 それが1であるなら、これは、空の、または、無くなっているフレーム*/が荷を解くのを(pbytes、および最後の_ビット、1、およびpos)示します。

           /* Check for bit errors or empty/lost frames */
           if (start<1)
               mode = 0;
           if (iLBCdec_inst->mode==20 && start>3)
               mode = 0;
           if (iLBCdec_inst->mode==30 && start>5)
               mode = 0;
           if (last_bit==1)
               mode = 0;

ビット誤りか空の/のための/*チェックは(<1を始動します)モード=0であるならフレーム*/を失いました。 (iLBCdecの_のinst>のモード=20、スタート>3) モード=0。 (iLBCdecの_のinst>のモード=30、スタート>5) モード=0。 (最後の_ビット=1)モード=0であるなら。

           if (mode==1) { /* No bit errors was detected,
                             continue decoding */

(モード=1)である、/*いいえの噛み付いている誤りは検出されて、*/を解読し続けてください。

               /* adjust index */
               index_conv_dec(cb_index);

/*はインデックス*/インデックス_conv_DEC社(cb_インデックス)を調整します。

               /* decode the lsf */

/*はlsf*/を解読します。

               SimplelsfDEQ(lsfdeq, lsf_i, iLBCdec_inst->lpc_n);
               check=LSF_check(lsfdeq, LPC_FILTERORDER,
                   iLBCdec_inst->lpc_n);
               DecoderInterpolateLSF(syntdenum, weightdenum,
                   lsfdeq, LPC_FILTERORDER, iLBCdec_inst);

SimplelsfDEQ(lsfdeqであって、lsfな_i、iLBCdecの_のinst>のlpc)。 =LSF_チェック(lsfdeq、LPC_FILTERORDER、iLBCdecの_のinst>のlpc)をチェックしてください。 DecoderInterpolateLSF(syntdenum、weightdenum、lsfdeq、LPC_FILTERORDER、iLBCdec_inst)。

               Decode(iLBCdec_inst, decresidual, start, idxForMax,
                   idxVec, syntdenum, cb_index, gain_index,
                   extra_cb_index, extra_gain_index,
                   state_first);

解読してください(余分な_cb_インデックス、余分な_利得_インデックスは、_最初に、idxForMax、iLBCdec_inst、decresidualが始動して、idxVec(syntdenum、cb_インデックス)が_インデックスを獲得すると述べます)。

               /* preparing the plc for a future loss! */

将来の損失のためにplcを準備する/*! */

               doThePLC(PLCresidual, PLClpc, 0, decresidual,
                   syntdenum +
                   (LPC_FILTERORDER + 1)*(iLBCdec_inst->nsub - 1),
                   (*iLBCdec_inst).last_lag, iLBCdec_inst);

doThePLC(PLCresidual(PLClpc、0、decresidual)は+ (LPC_FILTERORDER+1)*(_のinst>のiLBCdec nsub--1)、.last_立ち遅れ、(*iLBCdec_inst)iLBCdec_instをsyntdenumします)。

Andersen, et al.              Experimental                     [Page 73]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[73ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

               memcpy(decresidual, PLCresidual,
                   iLBCdec_inst->blockl*sizeof(float));
           }

memcpy(decresidualに、PLCresidual、iLBCdecの_のinst>のblockl*をsizeofされます(浮いてください))。 }

       }

}

       if (mode == 0) {
           /* the data is bad (either a PLC call
            * was made or a severe bit error was detected)
            */

(モード=0)である、/、*データは悪い(a PLC電話*をかけたか、または厳しい噛み付いている誤りを検出した)*/です。

           /* packet loss conceal */

/*パケット損失は*/を隠します。

           memset(zeros, 0, BLOCKL_MAX*sizeof(float));

memset(ゼロ、0、BLOCKL_MAX*sizeof(浮かべます))。

           one[0] = 1;
           memset(one+1, 0, LPC_FILTERORDER*sizeof(float));

1[0]=1。 memset(1つ+1、0、LPC_FILTERORDER*sizeof(浮かべます))。

           start=0;

=0を始めてください。

           doThePLC(PLCresidual, PLClpc, 1, zeros, one,
               (*iLBCdec_inst).last_lag, iLBCdec_inst);
           memcpy(decresidual, PLCresidual,
               iLBCdec_inst->blockl*sizeof(float));

doThePLC(PLCresidual、PLClpc、1、ゼロ、1、.last_立ち遅れ、(*iLBCdec_inst)iLBCdec_inst)。 memcpy(decresidualに、PLCresidual、iLBCdecの_のinst>のblockl*をsizeofされます(浮いてください))。

           order_plus_one = LPC_FILTERORDER + 1;
           for (i = 0; i < iLBCdec_inst->nsub; i++) {
               memcpy(syntdenum+(i*order_plus_one), PLClpc,
                   order_plus_one*sizeof(float));
           }
       }

オーダー_と_1はLPC_FILTERORDER+1と等しいです。 (i=0; i<の_のinst>のiLBCdec nsub; i++)、memcpy(syntdenum+(i*オーダー_と_1)、PLClpc、オーダー_、および_1つ*はsizeofされます(浮いてください))。

       if (iLBCdec_inst->use_enhancer == 1) {

(iLBCdecの_のinst>の使用_エンハンサ=1)です。

           /* post filtering */

*/をフィルターにかける/*ポスト

           iLBCdec_inst->last_lag =
               enhancerInterface(data, decresidual, iLBCdec_inst);

iLBCdec_inst->は_立ち遅れ=enhancerInterface(データ、decresidual、iLBCdec_inst)を持続します。

           /* synthesis filtering */

/*統合フィルタリング*/

           if (iLBCdec_inst->mode==20) {
               /* Enhancer has 40 samples delay */
               i=0;
               syntFilter(data + i*SUBL,
                   iLBCdec_inst->old_syntdenum +
                   (i+iLBCdec_inst->nsub-1)*(LPC_FILTERORDER+1),
                   SUBL, iLBCdec_inst->syntMem);

(iLBCdecの_のinst>のモード=20)である、/*エンハンサで、40個のサンプルが*/i=0を遅らせます; syntFilter(+ データi*SUBL、>の古い_syntdenum+(iLBCdec_inst i+>nsub-1)*(LPC_FILTERORDER+1)、SUBL、iLBCdec_inst->をinstしている_iLBCdec syntMem)

Andersen, et al.              Experimental                     [Page 74]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[74ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

               for (i=1; i < iLBCdec_inst->nsub; i++) {
                   syntFilter(data + i*SUBL,
                       syntdenum + (i-1)*(LPC_FILTERORDER+1),
                       SUBL, iLBCdec_inst->syntMem);
               }
           } else if (iLBCdec_inst->mode==30) {
               /* Enhancer has 80 samples delay */
               for (i=0; i < 2; i++) {
                   syntFilter(data + i*SUBL,
                       iLBCdec_inst->old_syntdenum +
                       (i+iLBCdec_inst->nsub-2)*(LPC_FILTERORDER+1),
                       SUBL, iLBCdec_inst->syntMem);
               }
               for (i=2; i < iLBCdec_inst->nsub; i++) {
                   syntFilter(data + i*SUBL,
                       syntdenum + (i-2)*(LPC_FILTERORDER+1), SUBL,
                       iLBCdec_inst->syntMem);
               }
           }

(i=1; i<の_のinst>のiLBCdec nsub; i++)、syntFilter(+ データi*SUBL、syntdenum+(i-1)*(LPC_FILTERORDER+1)、SUBL、_のinst>のiLBCdec syntMem);、ほか、(iLBCdecの_のinst>のモード=30)です。エンハンサ..持つ..サンプル..遅れ..データ..古い..データ

       } else {

ほか

           /* Find last lag */
           lag = 20;
           maxcc = xCorrCoef(&decresidual[BLOCKL_MAX-ENH_BLOCKL],
               &decresidual[BLOCKL_MAX-ENH_BLOCKL-lag], ENH_BLOCKL);

/*掘り出し物の最後の立ち遅れ*/立ち遅れ=20。 maxccはxCorrCoef(decresidual[BLOCKL_マックスENH_BLOCKL]、およびdecresidual[BLOCKL_マックスENH_BLOCKL-立ち遅れ]、ENH_BLOCKL)と等しいです。

           for (ilag=21; ilag<120; ilag++) {
               cc = xCorrCoef(&decresidual[BLOCKL_MAX-ENH_BLOCKL],
                   &decresidual[BLOCKL_MAX-ENH_BLOCKL-ilag],
                   ENH_BLOCKL);

(ilag=21; ilag<120; ilag++)、ccはxCorrCoef(decresidual[BLOCKL_マックスENH_BLOCKL]であって、decresidualな[BLOCKL_マックスENH_BLOCKL-ilag]ENH_BLOCKL)と等しいです。

               if (cc > maxcc) {
                   maxcc = cc;
                   lag = ilag;
               }
           }
           iLBCdec_inst->last_lag = lag;

maxccはccと等しいです; 立ち遅れ=ilag、(cc>maxcc)であるならiLBCdec_inst>の最終_立ち遅れ=立ち遅れ。

           /* copy data and run synthesis filter */

/*コピーデータと走行統合フィルタ*/

           memcpy(data, decresidual,
               iLBCdec_inst->blockl*sizeof(float));
           for (i=0; i < iLBCdec_inst->nsub; i++) {
               syntFilter(data + i*SUBL,
                   syntdenum + i*(LPC_FILTERORDER+1), SUBL,
                   iLBCdec_inst->syntMem);
           }

memcpy(データ、decresidual、iLBCdecの_のinst>のblockl*sizeof(浮かべます))。 (i=0; i<の_のinst>のiLBCdec nsub; i++)のためにsyntFilter(+ データi*SUBL、syntdenum+i*(LPC_FILTERORDER+1)、SUBL、_のinst>のiLBCdec syntMem)。

Andersen, et al.              Experimental                     [Page 75]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[75ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       }

}

       /* high pass filtering on output if desired, otherwise
          copy to out */

望まれているなら/*高いパスが出力のときにフィルターにかけられて、さもなければ、出かけている*/にコピーしてください。

       hpOutput(data, iLBCdec_inst->blockl,
                   decblock,iLBCdec_inst->hpomem);

hpOutput(データ(_のinst>のiLBCdec blockl)はdecblockされて、iLBCdec_inst->はhpomemです)。

       /* memcpy(decblock,data,iLBCdec_inst->blockl*sizeof(float));*/

/*はmemcpyされます(decblockに、データ、iLBCdecの_のinst>のblockl*はsizeofされます(浮いてください)); */

       memcpy(iLBCdec_inst->old_syntdenum, syntdenum,

memcpy、(syntdenumに_のinst>のiLBCdec老人_syntdenum

           iLBCdec_inst->nsub*(LPC_FILTERORDER+1)*sizeof(float));

iLBCdec_inst>のnsub*(LPC_FILTERORDER+1)*sizeof(浮かべます)。

       iLBCdec_inst->prev_enh_pl=0;

_のinst>の_iLBCdec prev_enh pl=0。

       if (mode==0) { /* PLC was used */
           iLBCdec_inst->prev_enh_pl=1;
       }
   }

(モード=0)である、/*PLCは中古のiLBCdec_inst*/>のprev_enh_pl=1でした。

A.6.  iLBC_define.h

A.6iLBC_define.h

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       iLBC_define.h

iLBC_define.h

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/
   #include <string.h>

******************************************************************/#は<string.h>を含んでいます。

   #ifndef __iLBC_ILBCDEFINE_H
   #define __iLBC_ILBCDEFINE_H

#ifndef__iLBC_ILBCDEFINE_H#は__iLBC_ILBCDEFINE_Hを定義します。

   /* general codec settings */

/*一般的なコーデック設定*/

   #define FS                      (float)8000.0
   #define BLOCKL_20MS             160
   #define BLOCKL_30MS             240
   #define BLOCKL_MAX              240
   #define NSUB_20MS               4
   #define NSUB_30MS               6
   #define NSUB_MAX            6
   #define NASUB_20MS              2

#FSを定義してください、(浮いてください)8000.0、#、定義、BLOCKL_20MS160#、が240#、が定義するBLOCKL_30MSを定義する、BLOCKL_MAX240#、が4#、が定義するNSUB_20MSを定義する、NSUB_30MS6#、がMAX6#、が定義するNSUB_を定義する、NASUB_20MS2

Andersen, et al.              Experimental                     [Page 76]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[76ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   #define NASUB_30MS              4
   #define NASUB_MAX               4
   #define SUBL                40
   #define STATE_LEN               80
   #define STATE_SHORT_LEN_30MS    58
   #define STATE_SHORT_LEN_20MS    57

#定義、NASUB_30MS4#、がMAX4#、が定義するNASUB_を定義する、SUBL40#、がLEN80#、が定義する州_を定義する、州_SHORT_LEN_30MS58#、は州_SHORT_LEN_20MS57を定義します。

   /* LPC settings */

/*LPC設定*/

   #define LPC_FILTERORDER         10
   #define LPC_CHIRP_SYNTDENUM     (float)0.9025
   #define LPC_CHIRP_WEIGHTDENUM   (float)0.4222
   #define LPC_LOOKBACK        60
   #define LPC_N_20MS              1
   #define LPC_N_30MS              2
   #define LPC_N_MAX               2
   #define LPC_ASYMDIFF        20
   #define LPC_BW                  (float)60.0
   #define LPC_WN                  (float)1.0001
   #define LSF_NSPLIT              3
   #define LSF_NUMBER_OF_STEPS     4
   #define LPC_HALFORDER           (LPC_FILTERORDER/2)

#定義..定義..浮く..定義..浮く..定義..定義..定義..定義..定義..定義..浮く..定義..浮く..定義..定義..定義(LPC_FILTERORDER/2)

   /* cb settings */

/*cb設定*/

   #define CB_NSTAGES              3
   #define CB_EXPAND               2
   #define CB_MEML                 147
   #define CB_FILTERLEN        2*4
   #define CB_HALFFILTERLEN    4
   #define CB_RESRANGE             34
   #define CB_MAXGAIN              (float)1.3

#定義、CB_NSTAGES3#、がEXPAND2#、が定義するCB_を定義する、CB_MEML147#、がFILTERLEN2*4#、が定義するCB_を定義する、CB_HALFFILTERLEN4#、はRESRANGE34#、がCB_MAXGAIN(浮かべる)1.3に定義するCB_を定義します。

   /* enhancer */

/*エンハンサ*/

   #define ENH_BLOCKL              80  /* block length */
   #define ENH_BLOCKL_HALF         (ENH_BLOCKL/2)
   #define ENH_HL                  3   /* 2*ENH_HL+1 is number blocks
                                          in said second sequence */
   #define ENH_SLOP            2   /* max difference estimated and
                                          correct pitch period */
   #define ENH_PLOCSL              20  /* pitch-estimates and pitch-
                                          locations buffer length */
   #define ENH_OVERHANG        2
   #define ENH_UPS0            4   /* upsampling rate */
   #define ENH_FL0                 3   /* 2*FLO+1 is the length of
                                          each filter */
   #define ENH_VECTL               (ENH_BLOCKL+2*ENH_FL0)

#定義..ブロック長..定義..定義..数..ブロック..言う..系列..定義..最大..違い..概算..正しい..ピッチ..期間..定義..ピッチ..見積り..ピッチ..位置..バッファ長..定義..定義..レート..定義..長さ..フィルタ..定義(ENH_BLOCKL+2*ENH_FL0)

Andersen, et al.              Experimental                     [Page 77]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[77ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   #define ENH_CORRDIM             (2*ENH_SLOP+1)
   #define ENH_NBLOCKS             (BLOCKL_MAX/ENH_BLOCKL)
   #define ENH_NBLOCKS_EXTRA       5
   #define ENH_NBLOCKS_TOT         8   /* ENH_NBLOCKS +
                                          ENH_NBLOCKS_EXTRA */
   #define ENH_BUFL            (ENH_NBLOCKS_TOT)*ENH_BLOCKL
   #define ENH_ALPHA0              (float)0.05

#定義..定義..マックス..定義..定義..定義..定義..浮かべる

   /* Down sampling */

/*下に標本抽出*/

   #define FILTERORDER_DS          7
   #define DELAY_DS            3
   #define FACTOR_DS               2

#定義、FILTERORDER_DS7#、が#、が定義するDELAY_DS3を定義する、FACTOR_DS2

   /* bit stream defs */

/*ビットストリームdefs*/

   #define NO_OF_BYTES_20MS    38
   #define NO_OF_BYTES_30MS    50
   #define NO_OF_WORDS_20MS    19
   #define NO_OF_WORDS_30MS    25
   #define STATE_BITS              3
   #define BYTE_LEN            8
   #define ULP_CLASSES             3

#定義、どんな_OF_BYTES_20MS38#もOF_BYTES_30MS50#、が定義しない_を全く定義しない、どんな_OF_ワーズ_20MS19#もOF_ワーズ_30MS25#、が定義しない_を全く定義しない、州_BITS3#、がLEN8#、が定義するBYTE_を定義する、ULP_CLASSES3

   /* help parameters */

/*助けパラメタ*/

   #define FLOAT_MAX               (float)1.0e37
   #define EPS                     (float)2.220446049250313e-016
   #define PI                      (float)3.14159265358979323846
   #define MIN_SAMPLE              -32768
   #define MAX_SAMPLE              32767
   #define TWO_PI                  (float)6.283185307
   #define PI2                     (float)0.159154943

#定義、FLOAT_MAX(浮かべる)1.0e37#が2.220446049250313e-016#が定義するEPS(浮かべる)を定義する、PI(浮かべる)、3.14159265358979323846、#、MIN_SAMPLEを定義してください、-32768、#、定義、マックス_SAMPLE32767#、がTWO_PIを定義する、(浮いてください)6.283185307、#、PI2(浮かべる)0.159154943を定義してください。

   /* type definition encoder instance */
   typedef struct iLBC_ULP_Inst_t_ {
       int lsf_bits[6][ULP_CLASSES+2];
       int start_bits[ULP_CLASSES+2];
       int startfirst_bits[ULP_CLASSES+2];
       int scale_bits[ULP_CLASSES+2];
       int state_bits[ULP_CLASSES+2];
       int extra_cb_index[CB_NSTAGES][ULP_CLASSES+2];
       int extra_cb_gain[CB_NSTAGES][ULP_CLASSES+2];
       int cb_index[NSUB_MAX][CB_NSTAGES][ULP_CLASSES+2];
       int cb_gain[NSUB_MAX][CB_NSTAGES][ULP_CLASSES+2];
   } iLBC_ULP_Inst_t;

/* type definition encoder instance */ typedef struct iLBC_ULP_Inst_t_ { int lsf_bits[6][ULP_CLASSES+2]; int start_bits[ULP_CLASSES+2]; int startfirst_bits[ULP_CLASSES+2]; int scale_bits[ULP_CLASSES+2]; int state_bits[ULP_CLASSES+2]; int extra_cb_index[CB_NSTAGES][ULP_CLASSES+2]; int extra_cb_gain[CB_NSTAGES][ULP_CLASSES+2]; int cb_index[NSUB_MAX][CB_NSTAGES][ULP_CLASSES+2]; int cb_gain[NSUB_MAX][CB_NSTAGES][ULP_CLASSES+2]; } iLBC_ULP_Inst_t;

   /* type definition encoder instance */

/*型定義エンコーダ例*/

Andersen, et al.              Experimental                     [Page 78]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[78ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   typedef struct iLBC_Enc_Inst_t_ {

typedef struct iLBC_Enc_Inst_t_

       /* flag for frame size mode */
       int mode;

フレーム・サイズモード*/intモードのための/*旗。

       /* basic parameters for different frame sizes */
       int blockl;
       int nsub;
       int nasub;
       int no_of_bytes, no_of_words;
       int lpc_n;
       int state_short_len;
       const iLBC_ULP_Inst_t *ULP_inst;

異なったフレーム・サイズ*/int blocklのための/*基本のパラメタ。 int nsub。 int nasub。 _バイトのintノー_、_単語の_がありません。 int lpc。 _int州の短い_len。 const iLBC_ULP_Inst_t*ULP_inst。

       /* analysis filter state */
       float anaMem[LPC_FILTERORDER];

/*分析フィルタ州の*/浮遊物のanaMem[LPC_FILTERORDER]。

       /* old lsf parameters for interpolation */
       float lsfold[LPC_FILTERORDER];
       float lsfdeqold[LPC_FILTERORDER];

挿入*/浮遊物のlsfold[LPC_FILTERORDER]のための/*古いlsfパラメタ。 lsfdeqold[LPC_FILTERORDER]を浮かべてください。

       /* signal buffer for LP analysis */
       float lpc_buffer[LPC_LOOKBACK + BLOCKL_MAX];

LP分析*/浮遊物のlpc_バッファ[LPC_LOOKBACK+BLOCKL_MAX]のための/*信号バッファ。

       /* state of input HP filter */
       float hpimem[4];

入力HPフィルタ*/浮遊物のhpimem[4]の/*状態。

   } iLBC_Enc_Inst_t;

iLBC_Enc_Inst_t。

   /* type definition decoder instance */
   typedef struct iLBC_Dec_Inst_t_ {

_/*型定義デコーダ例*/typedef struct iLBCの_12月のInst_t_

       /* flag for frame size mode */
       int mode;

フレーム・サイズモード*/intモードのための/*旗。

       /* basic parameters for different frame sizes */
       int blockl;
       int nsub;
       int nasub;
       int no_of_bytes, no_of_words;
       int lpc_n;
       int state_short_len;
       const iLBC_ULP_Inst_t *ULP_inst;

異なったフレーム・サイズ*/int blocklのための/*基本のパラメタ。 int nsub。 int nasub。 _バイトのintノー_、_単語の_がありません。 int lpc。 _int州の短い_len。 const iLBC_ULP_Inst_t*ULP_inst。

       /* synthesis filter state */
       float syntMem[LPC_FILTERORDER];

/*統合フィルタ州の*/浮遊物のsyntMem[LPC_FILTERORDER]。

       /* old LSF for interpolation */

挿入*/のための/*古いLSF

Andersen, et al.              Experimental                     [Page 79]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[79ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       float lsfdeqold[LPC_FILTERORDER];

lsfdeqold[LPC_FILTERORDER]を浮かべてください。

       /* pitch lag estimated in enhancer and used in PLC */
       int last_lag;

エンハンサで見積もられていて、PLC*/int最終_立ち遅れに使用される/*ピッチ立ち遅れ。

       /* PLC state information */
       int prevLag, consPLICount, prevPLI, prev_enh_pl;
       float prevLpc[LPC_FILTERORDER+1];
       float prevResidual[NSUB_MAX*SUBL];
       float per;
       unsigned long seed;

_/*PLCは情報*/int prevLag、consPLICount、prevPLIを述べて、prev_enhはplです。 prevLpc[LPC_FILTERORDER+1]を浮かべてください。 prevResidual[NSUB_マックス*SUBL]を浮かべてください。 浮く、。 無記名の長い種子。

       /* previous synthesis filter parameters */
       float old_syntdenum[(LPC_FILTERORDER + 1)*NSUB_MAX];

/*前の統合フィルタパラメタ*/浮遊物古い_syntdenum[(LPC_FILTERORDER+1)*NSUB_MAX]。

       /* state of output HP filter */
       float hpomem[4];

出力HPフィルタ*/浮遊物のhpomem[4]の/*状態。

       /* enhancer state information */
       int use_enhancer;
       float enh_buf[ENH_BUFL];
       float enh_period[ENH_NBLOCKS_TOT];

/*エンハンサ州の情報*/int使用_エンハンサ。 enh_buf[ENH_BUFL]を浮かべてください。 enh_の期間[ENH_NBLOCKS_TOT]を浮かべてください。

   } iLBC_Dec_Inst_t;

iLBC_12月の_Inst_t。

   #endif

#endif

A.7.  constants.h

A.7constants.h

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       constants.h

constants.h

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #ifndef __iLBC_CONSTANTS_H
   #define __iLBC_CONSTANTS_H

#ifndef__iLBC_CONSTANTS_H#は__iLBC_CONSTANTS_Hを定義します。

   #include "iLBC_define.h"

#「iLBC_define.h」を含めてください。

   /* ULP bit allocation */

/*ULPビット配分*/

Andersen, et al.              Experimental                     [Page 80]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[80ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   extern const iLBC_ULP_Inst_t ULP_20msTbl;
   extern const iLBC_ULP_Inst_t ULP_30msTbl;

通いの人const iLBC_ULP_Inst_t ULP_20msTbl。 通いの人const iLBC_ULP_Inst_t ULP_30msTbl。

   /* high pass filters */

/*ハイパスフィルタ*/

   extern float hpi_zero_coefsTbl[];
   extern float hpi_pole_coefsTbl[];
   extern float hpo_zero_coefsTbl[];
   extern float hpo_pole_coefsTbl[];

通いの人浮遊物のhpi_ゼロ_coefsTbl[]。 通いの人浮遊物のhpi_ポール_coefsTbl[]。 通いの人浮遊物のhpo_ゼロ_coefsTbl[]。 通いの人浮遊物のhpo_ポール_coefsTbl[]。

   /* low pass filters */
   extern float lpFilt_coefsTbl[];

/*ローパスフィルタ*/通いの人はlpFilt_coefsTbl[]を浮かべます。

   /* LPC analysis and quantization */

/*LPC分析と量子化*/

   extern float lpc_winTbl[];
   extern float lpc_asymwinTbl[];
   extern float lpc_lagwinTbl[];
   extern float lsfCbTbl[];
   extern float lsfmeanTbl[];
   extern int   dim_lsfCbTbl[];
   extern int   size_lsfCbTbl[];
   extern float lsf_weightTbl_30ms[];
   extern float lsf_weightTbl_20ms[];

通いの人浮遊物のlpc_winTbl[]。 通いの人浮遊物のlpc_asymwinTbl[]。 通いの人浮遊物のlpc_lagwinTbl[]。 通いの人浮遊物のlsfCbTbl[]。 通いの人浮遊物のlsfmeanTbl[]。 通いの人のintの薄暗い_lsfCbTbl[]。 通いの人intサイズ_lsfCbTbl[]。 通いの人浮遊物のlsf_weightTbl_30ms[]。 通いの人浮遊物のlsf_weightTbl_20ms[]。

   /* state quantization tables */

/*州の量子化テーブル*/

   extern float state_sq3Tbl[];
   extern float state_frgqTbl[];

通いの人浮遊物の状態_sq3Tbl[]。 通いの人浮遊物の状態_frgqTbl[]。

   /* gain quantization tables */

/*利得量子化テーブル*/

   extern float gain_sq3Tbl[];
   extern float gain_sq4Tbl[];
   extern float gain_sq5Tbl[];

通いの人浮遊物の利得_sq3Tbl[]。 通いの人浮遊物の利得_sq4Tbl[]。 通いの人浮遊物の利得_sq5Tbl[]。

   /* adaptive codebook definitions */

/*適応型の符号表定義*/

   extern int search_rangeTbl[5][CB_NSTAGES];
   extern int memLfTbl[];
   extern int stMemLTbl;
   extern float cbfiltersTbl[CB_FILTERLEN];

通いの人int検索_rangeTbl[5][CB_NSTAGES]。 通いの人int memLfTbl[]。 通いの人int stMemLTbl。 通いの人浮遊物のcbfiltersTbl[CB_FILTERLEN]。

   /* enhancer definitions */

/*エンハンサ定義*/

   extern float polyphaserTbl[];
   extern float enh_plocsTbl[];

通いの人浮遊物のpolyphaserTbl[]。 通いの人浮遊物のenh_plocsTbl[]。

Andersen, et al.              Experimental                     [Page 81]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[81ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   #endif

#endif

A.8.  constants.c

A.8constants.c

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       constants.c

constants.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #include "iLBC_define.h"

#「iLBC_define.h」を含めてください。

   /* ULP bit allocation */

/*ULPビット配分*/

       /* 20 ms frame */

/*20msフレーム*/

   const iLBC_ULP_Inst_t ULP_20msTbl = {
       /* LSF */
       {   {6,0,0,0,0}, {7,0,0,0,0}, {7,0,0,0,0},
           {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}},
       /* Start state location, gain and samples */
       {2,0,0,0,0},
       {1,0,0,0,0},
       {6,0,0,0,0},
       {0,1,2,0,0},
       /* extra CB index and extra CB gain */
       {{6,0,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}},
       {{2,0,3,0,0}, {1,1,2,0,0}, {0,0,3,0,0}},
       /* CB index and CB gain */
       {   {{7,0,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}},
           {{0,0,8,0,0}, {0,0,8,0,0}, {0,0,8,0,0}},
           {{0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}},
           {{0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}},
       {   {{1,2,2,0,0}, {1,1,2,0,0}, {0,0,3,0,0}},
           {{1,1,3,0,0}, {0,2,2,0,0}, {0,0,3,0,0}},
           {{0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}},
           {{0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}}}
   };

const iLBC_ULP_Inst_t ULP_20msTbl=; { } 。

       /* 30 ms frame */

/*30msフレーム*/

   const iLBC_ULP_Inst_t ULP_30msTbl = {
       /* LSF */

const iLBC_ULP_Inst_t ULP_30msTbl=、/*LSF*/

Andersen, et al.              Experimental                     [Page 82]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[82ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       {   {6,0,0,0,0}, {7,0,0,0,0}, {7,0,0,0,0},
           {6,0,0,0,0}, {7,0,0,0,0}, {7,0,0,0,0}},
       /* Start state location, gain and samples */
       {3,0,0,0,0},
       {1,0,0,0,0},
       {6,0,0,0,0},
       {0,1,2,0,0},
       /* extra CB index and extra CB gain */
       {{4,2,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}},
       {{1,1,3,0,0}, {1,1,2,0,0}, {0,0,3,0,0}},
       /* CB index and CB gain */
       {   {{6,1,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}},
           {{0,7,1,0,0}, {0,0,8,0,0}, {0,0,8,0,0}},
           {{0,7,1,0,0}, {0,0,8,0,0}, {0,0,8,0,0}},
           {{0,7,1,0,0}, {0,0,8,0,0}, {0,0,8,0,0}}},
       {   {{1,2,2,0,0}, {1,2,1,0,0}, {0,0,3,0,0}},
           {{0,2,3,0,0}, {0,2,2,0,0}, {0,0,3,0,0}},
           {{0,1,4,0,0}, {0,1,3,0,0}, {0,0,3,0,0}},
           {{0,1,4,0,0}, {0,1,3,0,0}, {0,0,3,0,0}}}
   };

{ {6,0,0,0,0}, {7,0,0,0,0}, {7,0,0,0,0}, {6,0,0,0,0}, {7,0,0,0,0}, {7,0,0,0,0}}, /* Start state location, gain and samples */ {3,0,0,0,0}, {1,0,0,0,0}, {6,0,0,0,0}, {0,1,2,0,0}, /* extra CB index and extra CB gain */ {{4,2,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}}, {{1,1,3,0,0}, {1,1,2,0,0}, {0,0,3,0,0}}, /* CB index and CB gain */ { {{6,1,1,0,0}, {0,0,7,0,0}, {0,0,7,0,0}}, {{0,7,1,0,0}, {0,0,8,0,0}, {0,0,8,0,0}}, {{0,7,1,0,0}, {0,0,8,0,0}, {0,0,8,0,0}}, {{0,7,1,0,0}, {0,0,8,0,0}, {0,0,8,0,0}}}, { {{1,2,2,0,0}, {1,2,1,0,0}, {0,0,3,0,0}}, {{0,2,3,0,0}, {0,2,2,0,0}, {0,0,3,0,0}}, {{0,1,4,0,0}, {0,1,3,0,0}, {0,0,3,0,0}}, {{0,1,4,0,0}, {0,1,3,0,0}, {0,0,3,0,0}}} };

   /* HP Filters */

/*hpフィルタ*/

   float hpi_zero_coefsTbl[3] = {
       (float)0.92727436, (float)-1.8544941, (float)0.92727436
   };
   float hpi_pole_coefsTbl[3] = {
       (float)1.0, (float)-1.9059465, (float)0.9114024
   };
   float hpo_zero_coefsTbl[3] = {
       (float)0.93980581, (float)-1.8795834, (float)0.93980581
   };
   float hpo_pole_coefsTbl[3] = {
       (float)1.0, (float)-1.9330735, (float)0.93589199
   };

(浮遊物)0.92727436、(浮遊物)-1.8544941、(浮かべます)浮遊物のhpi_ゼロ_coefsTbl[3]=0.92727436。 (浮遊物)1.0、(浮遊物)-1.9059465、(浮かべます)hpi_ポール_coefsTbl[3]=0.9114024を浮かべてください。 (浮遊物)0.93980581、(浮遊物)-1.8795834、(浮かべます)浮遊物のhpo_ゼロ_coefsTbl[3]=0.93980581。 (浮遊物)1.0、(浮遊物)-1.9330735、(浮かべます)hpo_ポール_coefsTbl[3]=0.93589199を浮かべてください。

   /* LP Filter */

/*LPフィルタ*/

   float lpFilt_coefsTbl[FILTERORDER_DS]={
       (float)-0.066650, (float)0.125000, (float)0.316650,
       (float)0.414063, (float)0.316650,
       (float)0.125000, (float)-0.066650
   };

(浮遊物)-0.066650、(浮遊物)0.125000、(浮遊物)0.316650、(浮遊物)0.414063、(浮遊物)0.316650、(浮遊物)0.125000、(浮かべます)lpFilt_coefsTbl[FILTERORDER_DS]=-0.066650を浮かべてください。

   /* State quantization tables */

/*州の量子化テーブル*/

   float state_sq3Tbl[8] = {
       (float)-3.719849, (float)-2.177490, (float)-1.130005,

状態_sq3Tbl[8]=を浮かべてください、(浮かべます) -3.719849 (浮かべます) -2.177490 (浮かべます) -1.130005

Andersen, et al.              Experimental                     [Page 83]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[83ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       (float)-0.309692, (float)0.444214, (float)1.329712,
       (float)2.436279, (float)3.983887
   };

(浮遊物)-0.309692、(浮遊物)0.444214、(浮遊物)1.329712、(浮遊物)2.436279、(浮かべます)3.983887、。

   float state_frgqTbl[64] = {
       (float)1.000085, (float)1.071695, (float)1.140395,
       (float)1.206868, (float)1.277188, (float)1.351503,
       (float)1.429380, (float)1.500727, (float)1.569049,
       (float)1.639599, (float)1.707071, (float)1.781531,
       (float)1.840799, (float)1.901550, (float)1.956695,
       (float)2.006750, (float)2.055474, (float)2.102787,
       (float)2.142819, (float)2.183592, (float)2.217962,
       (float)2.257177, (float)2.295739, (float)2.332967,
       (float)2.369248, (float)2.402792, (float)2.435080,
       (float)2.468598, (float)2.503394, (float)2.539284,
       (float)2.572944, (float)2.605036, (float)2.636331,
       (float)2.668939, (float)2.698780, (float)2.729101,
       (float)2.759786, (float)2.789834, (float)2.818679,
       (float)2.848074, (float)2.877470, (float)2.906899,
       (float)2.936655, (float)2.967804, (float)3.000115,
       (float)3.033367, (float)3.066355, (float)3.104231,
       (float)3.141499, (float)3.183012, (float)3.222952,
       (float)3.265433, (float)3.308441, (float)3.350823,
       (float)3.395275, (float)3.442793, (float)3.490801,
       (float)3.542514, (float)3.604064, (float)3.666050,
       (float)3.740994, (float)3.830749, (float)3.938770,
       (float)4.101764
   };

float state_frgqTbl[64] = { (float)1.000085, (float)1.071695, (float)1.140395, (float)1.206868, (float)1.277188, (float)1.351503, (float)1.429380, (float)1.500727, (float)1.569049, (float)1.639599, (float)1.707071, (float)1.781531, (float)1.840799, (float)1.901550, (float)1.956695, (float)2.006750, (float)2.055474, (float)2.102787, (float)2.142819, (float)2.183592, (float)2.217962, (float)2.257177, (float)2.295739, (float)2.332967, (float)2.369248, (float)2.402792, (float)2.435080, (float)2.468598, (float)2.503394, (float)2.539284, (float)2.572944, (float)2.605036, (float)2.636331, (float)2.668939, (float)2.698780, (float)2.729101, (float)2.759786, (float)2.789834, (float)2.818679, (float)2.848074, (float)2.877470, (float)2.906899, (float)2.936655, (float)2.967804, (float)3.000115, (float)3.033367, (float)3.066355, (float)3.104231, (float)3.141499, (float)3.183012, (float)3.222952, (float)3.265433, (float)3.308441, (float)3.350823, (float)3.395275, (float)3.442793, (float)3.490801, (float)3.542514, (float)3(浮かべます)3.666050と、(浮かべます)3.740994と、(浮かべます)3.830749と、(浮かべます)3.938770と、(浮かべます)4.101764の.604064、。

   /* CB tables */

/*CBテーブル*/

   int search_rangeTbl[5][CB_NSTAGES]={{58,58,58}, {108,44,44},
               {108,108,108}, {108,108,108}, {108,108,108}};
   int stMemLTbl=85;
   int memLfTbl[NASUB_MAX]={147,147,147,147};

int検索_rangeTbl[5][CB_NSTAGES]が等しい、58、58、58、108、44、44、1億810万8108 1億810万8108、1億810万8108、。 int stMemLTbl=85。 int memLfTbl[NASUB_MAX]=1471億4714万7147。

   /* expansion filter(s) */

/*拡大フィルタ*/

   float cbfiltersTbl[CB_FILTERLEN]={
       (float)-0.034180, (float)0.108887, (float)-0.184326,
       (float)0.806152,  (float)0.713379, (float)-0.144043,
       (float)0.083740,  (float)-0.033691
   };

(浮遊物)-0.034180、(浮遊物)0.108887、(浮遊物)-0.184326、(浮遊物)0.806152、(浮遊物)0.713379、(浮遊物)-0.144043、(浮遊物)0.083740、(浮かべます)cbfiltersTbl[CB_FILTERLEN]=-0.033691を浮かべてください。

   /* Gain Quantization */

/*利得量子化*/

   float gain_sq3Tbl[8]={
       (float)-1.000000,  (float)-0.659973,  (float)-0.330017,

利得_sq3Tbl[8]=を浮かべてください、(浮かべます) -1.000000 (浮かべます) -0.659973 (浮かべます) -0.330017

Andersen, et al.              Experimental                     [Page 84]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[84ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       (float)0.000000, (float)0.250000, (float)0.500000,
       (float)0.750000, (float)1.00000};

(浮遊物)0.000000、(浮遊物)0.250000、(浮遊物)0.500000、(浮遊物)0.750000、(浮かべます)1.00000、。

   float gain_sq4Tbl[16]={
       (float)-1.049988, (float)-0.900024, (float)-0.750000,
       (float)-0.599976, (float)-0.450012, (float)-0.299988,
       (float)-0.150024, (float)0.000000, (float)0.150024,
       (float)0.299988, (float)0.450012, (float)0.599976,
       (float)0.750000, (float)0.900024, (float)1.049988,
       (float)1.200012};

(浮遊物)-1.049988、(浮遊物)-0.900024、(浮遊物)-0.750000、(浮遊物)-0.599976、(浮遊物)-0.450012、(浮遊物)-0.299988、(浮遊物)-0.150024、(浮遊物)0.000000、(浮遊物)0.150024、(浮遊物)0.299988、(浮遊物)0.450012、(浮遊物)0.599976、(浮遊物)0.750000、(浮遊物)0.900024、(浮遊物)1.049988、(浮かべます)利得_sq4Tbl[16]=1.200012を浮かべてください。

   float gain_sq5Tbl[32]={
       (float)0.037476, (float)0.075012, (float)0.112488,
       (float)0.150024, (float)0.187500, (float)0.224976,
       (float)0.262512, (float)0.299988, (float)0.337524,
       (float)0.375000, (float)0.412476, (float)0.450012,
       (float)0.487488, (float)0.525024, (float)0.562500,
       (float)0.599976, (float)0.637512, (float)0.674988,
       (float)0.712524, (float)0.750000, (float)0.787476,
       (float)0.825012, (float)0.862488, (float)0.900024,
       (float)0.937500, (float)0.974976, (float)1.012512,
       (float)1.049988, (float)1.087524, (float)1.125000,
       (float)1.162476, (float)1.200012};

浮遊物; _sq5Tbl32=を獲得してください、(浮かべます)0.037476、(浮かべます)0.075012、(浮かべます)0.112488、(浮かべます)0.150024、(浮かべます)0.187500、(浮かべます)0.224976、(浮かべます)0.262512、(浮かべます)0.299988、(浮かべます)0.337524、(浮かべます)0.375000、(浮かべます)0.412476、(浮かべます)0.450012、(浮かべます)0.487488、(浮かべます)0.525024、(浮かべます)0.562500、(浮遊物); 0.599976と、(浮かべます)0.637512と、(浮かべます)0.674988と、(浮かべます)0.712524と、(浮かべます)0.750000と、(浮かべます)0.787476と、(浮かべます)0.825012と、(浮かべます)0.862488と、(浮かべます)0.900024と、(浮かべます)0.937500と、(浮かべます)0.974976と、(浮かべます)1.012512と、(浮かべます)1.049988と、(浮かべます)1.087524と、(浮かべます)1.125000と、(浮かべます)1.162476と、(浮かべます)1.200012、。

   /* Enhancer - Upsamling a factor 4 (ENH_UPS0 = 4) */
   float polyphaserTbl[ENH_UPS0*(2*ENH_FL0+1)]={
       (float)0.000000, (float)0.000000, (float)0.000000,
   (float)1.000000,
           (float)0.000000, (float)0.000000, (float)0.000000,
       (float)0.015625, (float)-0.076904, (float)0.288330,
   (float)0.862061,
           (float)-0.106445, (float)0.018799, (float)-0.015625,
       (float)0.023682, (float)-0.124268, (float)0.601563,
   (float)0.601563,
           (float)-0.124268, (float)0.023682, (float)-0.023682,
       (float)0.018799, (float)-0.106445, (float)0.862061,
   (float)0.288330,
           (float)-0.076904, (float)0.015625, (float)-0.018799};

/*エンハンサ--Upsamling a要素4(ENH_UPS0=4)*/浮遊物; polyphaserTblENH_UPS0*(2*ENH_FL0+1)が等しい、(浮かべます)0.000000、(浮かべます)0.000000、(浮かべます)0.000000、(浮かべます)1.000000、(浮かべます)0.000000、(浮かべます)0.000000、(浮かべます)0.000000、(浮かべます)0.015625、(浮かべます)-0.076904、(浮かべます)0.288330、(浮かべます)0.862061、(浮かべます)-0.106445、(浮かべます)0.018799、(浮遊物); -0.015625と、(浮かべます)0.023682と、(浮かべます)-0.124268と、(浮かべます)0.601563と、(浮かべます)0.601563と、(浮かべます)-0.124268と、(浮かべます)0.023682と、(浮かべます)-0.023682と、(浮かべます)0.018799と、(浮かべます)-0.106445と、(浮かべます)0.862061と、(浮かべます)0.288330と、(浮かべます)-0.076904と、(浮かべます)0.015625と、(浮かべます)-0.018799、。

   float enh_plocsTbl[ENH_NBLOCKS_TOT] = {(float)40.0, (float)120.0,
               (float)200.0, (float)280.0, (float)360.0,
               (float)440.0, (float)520.0, (float)600.0};

(浮遊物)40.0、(浮遊物)120.0、(浮遊物)200.0、(浮遊物)280.0、(浮遊物)360.0、(浮遊物)440.0、(浮遊物)520.0、(浮かべます)enh_plocsTbl[ENH_NBLOCKS_TOT]=600.0を浮かべてください。

   /* LPC analysis and quantization */

/*LPC分析と量子化*/

   int dim_lsfCbTbl[LSF_NSPLIT] = {3, 3, 4};
   int size_lsfCbTbl[LSF_NSPLIT] = {64,128,128};

3、3、intの薄暗い_lsfCbTbl[LSF_NSPLIT]=4。 intサイズ_lsfCbTbl[LSF_NSPLIT]=6412万8128。

Andersen, et al.              Experimental                     [Page 85]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[85ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   float lsfmeanTbl[LPC_FILTERORDER] = {
       (float)0.281738, (float)0.445801, (float)0.663330,
       (float)0.962524, (float)1.251831, (float)1.533081,
       (float)1.850586, (float)2.137817, (float)2.481445,
       (float)2.777344};

(浮遊物)0.281738、(浮遊物)0.445801、(浮遊物)0.663330、(浮遊物)0.962524、(浮遊物)1.251831、(浮遊物)1.533081、(浮遊物)1.850586、(浮遊物)2.137817、(浮遊物)2.481445、(浮かべます)lsfmeanTbl[LPC_FILTERORDER]=2.777344を浮かべてください。

   float lsf_weightTbl_30ms[6] = {(float)(1.0/2.0), (float)1.0,
   (float)(2.0/3.0),
       (float)(1.0/3.0), (float)0.0, (float)0.0};

(浮遊物)(1.0/2.0)、(浮遊物)1.0、(浮遊物)(2.0/3.0)、(浮遊物)(1.0/3.0)、(浮遊物)0.0、(浮かべます)lsf_weightTbl_30ms[6]=0.0を浮かべてください。

   float lsf_weightTbl_20ms[4] = {(float)(3.0/4.0), (float)(2.0/4.0),
       (float)(1.0/4.0), (float)(0.0)};

(浮遊物)(3.0/4.0)、(浮遊物)(2.0/4.0)、(浮遊物)(1.0/4.0)、(浮遊物)lsf_weightTbl_20ms[4]=(0.0)を浮かべてください。

   /* Hanning LPC window */
   float lpc_winTbl[BLOCKL_MAX]={
       (float)0.000183, (float)0.000671, (float)0.001526,
       (float)0.002716, (float)0.004242, (float)0.006104,
       (float)0.008301, (float)0.010834, (float)0.013702,
       (float)0.016907, (float)0.020416, (float)0.024261,
       (float)0.028442, (float)0.032928, (float)0.037750,
       (float)0.042877, (float)0.048309, (float)0.054047,
       (float)0.060089, (float)0.066437, (float)0.073090,
       (float)0.080017, (float)0.087219, (float)0.094727,
       (float)0.102509, (float)0.110535, (float)0.118835,
       (float)0.127411, (float)0.136230, (float)0.145294,
       (float)0.154602, (float)0.164154, (float)0.173920,
       (float)0.183899, (float)0.194122, (float)0.204529,
       (float)0.215149, (float)0.225952, (float)0.236938,
       (float)0.248108, (float)0.259460, (float)0.270966,
       (float)0.282654, (float)0.294464, (float)0.306396,
       (float)0.318481, (float)0.330688, (float)0.343018,
       (float)0.355438, (float)0.367981, (float)0.380585,
       (float)0.393280, (float)0.406067, (float)0.418884,
       (float)0.431763, (float)0.444702, (float)0.457672,
       (float)0.470673, (float)0.483704, (float)0.496735,
       (float)0.509766, (float)0.522797, (float)0.535828,
       (float)0.548798, (float)0.561768, (float)0.574677,
       (float)0.587524, (float)0.600342, (float)0.613068,
       (float)0.625732, (float)0.638306, (float)0.650787,
       (float)0.663147, (float)0.675415, (float)0.687561,
       (float)0.699585, (float)0.711487, (float)0.723206,
       (float)0.734802, (float)0.746216, (float)0.757477,
       (float)0.768585, (float)0.779480, (float)0.790192,
       (float)0.800720, (float)0.811005, (float)0.821106,
       (float)0.830994, (float)0.840668, (float)0.850067,
       (float)0.859253, (float)0.868225, (float)0.876892,
       (float)0.885345, (float)0.893524, (float)0.901428,
       (float)0.909058, (float)0.916412, (float)0.923492,

118835 (浮かべます) 0.127411 (浮かべます) 0.136230 (浮かべます) 0.145294 (浮かべます) 0.154602 (浮かべます) 0.164154 (浮かべます) 0.173920 (浮かべます) 0.183899 (浮かべます) 0.194122 (浮かべます) 0.204529 (浮かべます) 0.215149 (浮かべます) 0.225952 (浮かべます) 0.236938 (浮かべます) 0.248108 (浮かべます) 0.259460 (浮かべます) 0; 270966 (浮遊物)0.282654、(浮遊物)0.294464、(浮遊物)0.306396、(浮遊物)0.318481、(浮遊物)0.330688、(浮遊物)0.343018、(浮遊物)0.355438、(浮遊物)0.367981、(浮遊物)0.380585、(浮遊物)0.393280、(浮遊物)0.406067、(浮遊物)0.418884、(浮遊物)0.431763、(浮遊物)0.444702、(浮かべます)0.457672 (浮かべます) 0.470673 (浮かべます) 0.483704 (浮かべます) 0.496735 (浮かべます) 0.509766 (浮かべます) 0.522797 (浮かべます) 0.535828 (浮かべます) 0.548798 (浮かべます) 0.561768 (浮かべます) 0.574677 (浮かべます) 0.587524 (浮かべます) 0.600342 (浮かべます) 0.613068 (浮かべます) 0.625732 (浮かべます) 0.638306 (浮かべます) 0.650787 (浮かべます) 0.663147 (浮かべます) 0.675415 (浮かべます) 0.687561 (浮かべます) 0.699585 (浮かべます) 0.711487 (浮かべます) 0; 723206 (浮かべます) 0.734802 (浮かべます) 0.746216 (浮かべます) 0.757477 (浮かべます) 0.768585 (浮かべます) 0.779480 (浮かべます) 0.790192 (浮かべます) 0.800720 (浮かべます) 0.811005 (浮かべます) 0.821106 (浮かべます) 0.830994 (浮かべます) 0.840668 (浮かべます) 0.850067 (浮かべます) 0.859253 (浮かべます) 0.868225 (浮かべます) 0.876892 (浮かべます) 0.885345 (浮かべます) 0.893524 (浮かべます) 0.901428 (浮かべます) 0.909058 (浮かべます) 0.916412 (浮かべます) 0.923492

Andersen, et al.              Experimental                     [Page 86]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[86ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       (float)0.930267, (float)0.936768, (float)0.942963,
       (float)0.948853, (float)0.954437, (float)0.959717,
       (float)0.964691, (float)0.969360, (float)0.973694,
       (float)0.977692, (float)0.981384, (float)0.984741,
       (float)0.987762, (float)0.990479, (float)0.992828,
       (float)0.994873, (float)0.996552, (float)0.997925,
       (float)0.998932, (float)0.999603, (float)0.999969,
       (float)0.999969, (float)0.999603, (float)0.998932,
       (float)0.997925, (float)0.996552, (float)0.994873,
       (float)0.992828, (float)0.990479, (float)0.987762,
       (float)0.984741, (float)0.981384, (float)0.977692,
       (float)0.973694, (float)0.969360, (float)0.964691,
       (float)0.959717, (float)0.954437, (float)0.948853,
       (float)0.942963, (float)0.936768, (float)0.930267,
       (float)0.923492, (float)0.916412, (float)0.909058,
       (float)0.901428, (float)0.893524, (float)0.885345,
       (float)0.876892, (float)0.868225, (float)0.859253,
       (float)0.850067, (float)0.840668, (float)0.830994,
       (float)0.821106, (float)0.811005, (float)0.800720,
       (float)0.790192, (float)0.779480, (float)0.768585,
       (float)0.757477, (float)0.746216, (float)0.734802,
       (float)0.723206, (float)0.711487, (float)0.699585,
       (float)0.687561, (float)0.675415, (float)0.663147,
       (float)0.650787, (float)0.638306, (float)0.625732,
       (float)0.613068, (float)0.600342, (float)0.587524,
       (float)0.574677, (float)0.561768, (float)0.548798,
       (float)0.535828, (float)0.522797, (float)0.509766,
       (float)0.496735, (float)0.483704, (float)0.470673,
       (float)0.457672, (float)0.444702, (float)0.431763,
       (float)0.418884, (float)0.406067, (float)0.393280,
       (float)0.380585, (float)0.367981, (float)0.355438,
       (float)0.343018, (float)0.330688, (float)0.318481,
       (float)0.306396, (float)0.294464, (float)0.282654,
       (float)0.270966, (float)0.259460, (float)0.248108,
       (float)0.236938, (float)0.225952, (float)0.215149,
       (float)0.204529, (float)0.194122, (float)0.183899,
       (float)0.173920, (float)0.164154, (float)0.154602,
       (float)0.145294, (float)0.136230, (float)0.127411,
       (float)0.118835, (float)0.110535, (float)0.102509,
       (float)0.094727, (float)0.087219, (float)0.080017,
       (float)0.073090, (float)0.066437, (float)0.060089,
       (float)0.054047, (float)0.048309, (float)0.042877,
       (float)0.037750, (float)0.032928, (float)0.028442,
       (float)0.024261, (float)0.020416, (float)0.016907,
       (float)0.013702, (float)0.010834, (float)0.008301,
       (float)0.006104, (float)0.004242, (float)0.002716,
       (float)0.001526, (float)0.000671, (float)0.000183
   };

987762 (浮かべます) 0.984741 (浮かべます) 0.981384 (浮かべます) 0.977692 (浮かべます) 0.973694 (浮かべます) 0.969360 (浮かべます) 0.964691 (浮かべます) 0.959717 (浮かべます) 0.954437 (浮かべます) 0.948853 (浮かべます) 0.942963 (浮かべます) 0.936768 (浮かべます) 0.930267 (浮かべます) 0.923492 (浮かべます) 0.916412 (浮かべます) 0; 909058 (浮かべます) 0.901428 (浮かべます) 0.893524 (浮かべます) 0.885345 (浮かべます) 0.876892 (浮かべます) 0.868225 (浮かべます) 0.859253 (浮かべます) 0.850067 (浮かべます) 0.840668 (浮かべます) 0.830994 (浮かべます) 0.821106 (浮かべます) 0.811005 (浮かべます) 0.800720 (浮かべます) 0.790192 (浮かべます) 0.779480 (浮かべます) 0.768585(浮遊物)0.757477, (float)0.746216, (float)0.734802, (float)0.723206, (float)0.711487, (float)0.699585, (float)0.687561, (float)0.675415, (float)0.663147, (float)0.650787, (float)0.638306, (float)0.625732, (float)0.613068, (float)0.600342, (float)0.587524, (float)0.574677, (float)0.561768, (float)0.548798, (float)0.535828, (float)0.522797, (float)0.509766, (float)0.496735, (float)0.483704, (float)0.470673, (float)0.457672, (float)0.444702, (float)0.431763, (float)0.418884, (float)0.406067, (float)0.393280, (float)0.380585, (float)0.367981, (float)0.355438, (float)0.343018, (float)0.330688, (float)0.318481, (float)0.306396, (float)0.294464, (float)0.282654, (float)0.270966, (float)0.259460, (float)0.248108, (float)0.236938, (float)0.225952, (float)0.215149, (float)0.204529, (float)0.194122, (float)0.183899, (float)0.173920, (float)0.164154, (float)0.154602, (float)0.145294, (float)0.136230, (float)0.127411, (float)0.118835, (float)0.110535, (float)0.102509, (float)0.094727, (float)0.087219, (float)0.080017, (float)0.07(浮かべます)0.066437と、(浮かべます)0.060089と、(浮かべます)0.054047と、(浮かべます)0.048309と、(浮かべます)0.042877と、(浮かべます)0.037750と、(浮かべます)0.032928と、(浮かべます)0.028442と、(浮かべます)0.024261と、(浮かべます)0.020416と、(浮かべます)0.016907と、(浮かべます)0.013702と、(浮かべます)0.010834と、(浮かべます)0.008301と、(浮かべます)0.006104と、(浮かべます)0.004242と、(浮かべます)0.002716と、(浮かべます)0.001526と、(浮かべます)0.000671と、(浮かべます)0.000183の3090、。

Andersen, et al.              Experimental                     [Page 87]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[87ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   /* Asymmetric LPC window */
   float lpc_asymwinTbl[BLOCKL_MAX]={
       (float)0.000061, (float)0.000214, (float)0.000458,
       (float)0.000824, (float)0.001282, (float)0.001831,
       (float)0.002472, (float)0.003235, (float)0.004120,
       (float)0.005066, (float)0.006134, (float)0.007294,
       (float)0.008545, (float)0.009918, (float)0.011383,
       (float)0.012939, (float)0.014587, (float)0.016357,
       (float)0.018219, (float)0.020172, (float)0.022217,
       (float)0.024353, (float)0.026611, (float)0.028961,
       (float)0.031372, (float)0.033905, (float)0.036530,
       (float)0.039276, (float)0.042084, (float)0.044983,
       (float)0.047974, (float)0.051086, (float)0.054260,
       (float)0.057526, (float)0.060883, (float)0.064331,
       (float)0.067871, (float)0.071503, (float)0.075226,
       (float)0.079010, (float)0.082916, (float)0.086884,
       (float)0.090942, (float)0.095062, (float)0.099304,
       (float)0.103607, (float)0.107971, (float)0.112427,
       (float)0.116974, (float)0.121582, (float)0.126282,
       (float)0.131073, (float)0.135895, (float)0.140839,
       (float)0.145813, (float)0.150879, (float)0.156006,
       (float)0.161224, (float)0.166504, (float)0.171844,
       (float)0.177246, (float)0.182709, (float)0.188263,
       (float)0.193848, (float)0.199524, (float)0.205231,
       (float)0.211029, (float)0.216858, (float)0.222778,
       (float)0.228729, (float)0.234741, (float)0.240814,
       (float)0.246918, (float)0.253082, (float)0.259308,
       (float)0.265564, (float)0.271881, (float)0.278259,
       (float)0.284668, (float)0.291107, (float)0.297607,
       (float)0.304138, (float)0.310730, (float)0.317322,
       (float)0.323975, (float)0.330658, (float)0.337372,
       (float)0.344147, (float)0.350922, (float)0.357727,
       (float)0.364594, (float)0.371460, (float)0.378357,
       (float)0.385284, (float)0.392212, (float)0.399170,
       (float)0.406158, (float)0.413177, (float)0.420197,
       (float)0.427246, (float)0.434296, (float)0.441376,
       (float)0.448456, (float)0.455536, (float)0.462646,
       (float)0.469757, (float)0.476868, (float)0.483978,
       (float)0.491089, (float)0.498230, (float)0.505341,
       (float)0.512451, (float)0.519592, (float)0.526703,
       (float)0.533813, (float)0.540924, (float)0.548004,
       (float)0.555084, (float)0.562164, (float)0.569244,
       (float)0.576294, (float)0.583313, (float)0.590332,
       (float)0.597321, (float)0.604309, (float)0.611267,
       (float)0.618195, (float)0.625092, (float)0.631989,
       (float)0.638855, (float)0.645660, (float)0.652466,
       (float)0.659241, (float)0.665985, (float)0.672668,
       (float)0.679352, (float)0.685974, (float)0.692566,

/* Asymmetric LPC window */ float lpc_asymwinTbl[BLOCKL_MAX]={ (float)0.000061, (float)0.000214, (float)0.000458, (float)0.000824, (float)0.001282, (float)0.001831, (float)0.002472, (float)0.003235, (float)0.004120, (float)0.005066, (float)0.006134, (float)0.007294, (float)0.008545, (float)0.009918, (float)0.011383, (float)0.012939, (float)0.014587, (float)0.016357, (float)0.018219, (float)0.020172, (float)0.022217, (float)0.024353, (float)0.026611, (float)0.028961, (float)0.031372, (float)0.033905, (float)0.036530, (float)0.039276, (float)0.042084, (float)0.044983, (float)0.047974, (float)0.051086, (float)0.054260, (float)0.057526, (float)0.060883, (float)0.064331, (float)0.067871, (float)0.071503, (float)0.075226, (float)0.079010, (float)0.082916, (float)0.086884, (float)0.090942, (float)0.095062, (float)0.099304, (float)0.103607, (float)0.107971, (float)0.112427, (float)0.116974, (float)0.121582, (float)0.126282, (float)0.131073, (float)0.135895, (float)0.140839, (float)0.145813, (float)0.150879, (float) 0.156006 (浮かべます) 0.161224 (浮かべます) 0.166504 (浮かべます) 0.171844 (浮かべます) 0.177246 (浮かべます) 0.182709 (浮かべます) 0.188263 (浮かべます) 0.193848 (浮かべます) 0.199524 (浮かべます) 0.205231 (浮かべます) 0.211029 (浮かべます) 0.216858 (浮かべます) 0.222778 (浮かべます) 0.228729 (浮かべます) 0.234741 (浮かべます) 0; 240814 (浮かべます) 0.246918 (浮かべます) 0.253082 (浮かべます) 0.259308 (浮かべます) 0.265564 (浮かべます) 0.271881 (浮かべます) 0.278259 (浮かべます) 0.284668 (浮かべます) 0.291107 (浮かべます) 0.297607 (浮かべます) 0.304138 (浮かべます) 0.310730 (浮かべます) 0.317322 (浮かべます) 0.323975 (浮かべます) 0.330658 (浮かべます) 0; )、0.548004 (浮かべます) 0.555084 (浮かべます) 0.562164 (浮かべます) 0.569244 (浮かべます) 0.576294 (浮かべます) 0.583313 (浮かべます) 0.590332 (浮かべます) 0.597321 (浮かべます) 0.604309 (浮かべます) 0.611267 (浮かべます) 0.618195 (浮かべます) 0.625092 (浮かべます) 0.631989 (浮かべます) 0.638855 (浮かべます) 0.645660 (浮かべます) 0.652466 (浮かべます) 0.659241 (浮かべます) 0.665985 (浮かべます) 0.672668 (浮かべます) 0.679352 (浮かべます) 0.685974 (浮かべます) 0.692566

Andersen, et al.              Experimental                     [Page 88]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[88ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       (float)0.699127, (float)0.705658, (float)0.712128,
       (float)0.718536, (float)0.724945, (float)0.731262,
       (float)0.737549, (float)0.743805, (float)0.750000,
       (float)0.756134, (float)0.762238, (float)0.768280,
       (float)0.774261, (float)0.780182, (float)0.786072,
       (float)0.791870, (float)0.797638, (float)0.803314,
       (float)0.808960, (float)0.814514, (float)0.820038,
       (float)0.825470, (float)0.830841, (float)0.836151,
       (float)0.841400, (float)0.846558, (float)0.851654,
       (float)0.856689, (float)0.861633, (float)0.866516,
       (float)0.871338, (float)0.876068, (float)0.880737,
       (float)0.885315, (float)0.889801, (float)0.894226,
       (float)0.898560, (float)0.902832, (float)0.907013,
       (float)0.911102, (float)0.915100, (float)0.919037,
       (float)0.922882, (float)0.926636, (float)0.930328,
       (float)0.933899, (float)0.937408, (float)0.940796,
       (float)0.944122, (float)0.947357, (float)0.950470,
       (float)0.953522, (float)0.956482, (float)0.959351,
       (float)0.962097, (float)0.964783, (float)0.967377,
       (float)0.969849, (float)0.972229, (float)0.974518,
       (float)0.976715, (float)0.978821, (float)0.980835,
       (float)0.982727, (float)0.984528, (float)0.986237,
       (float)0.987854, (float)0.989380, (float)0.990784,
       (float)0.992096, (float)0.993317, (float)0.994415,
       (float)0.995422, (float)0.996338, (float)0.997162,
       (float)0.997864, (float)0.998474, (float)0.998962,
       (float)0.999390, (float)0.999695, (float)0.999878,
       (float)0.999969, (float)0.999969, (float)0.996918,
       (float)0.987701, (float)0.972382, (float)0.951050,
       (float)0.923889, (float)0.891022, (float)0.852631,
       (float)0.809021, (float)0.760406, (float)0.707092,
       (float)0.649445, (float)0.587799, (float)0.522491,
       (float)0.453979, (float)0.382690, (float)0.309021,
       (float)0.233459, (float)0.156433, (float)0.078461
   };

866516 (浮かべます) 0.871338 (浮かべます) 0.876068 (浮かべます) 0.880737 (浮かべます) 0.885315 (浮かべます) 0.889801 (浮かべます) 0.894226 (浮かべます) 0.898560 (浮かべます) 0.902832 (浮かべます) 0.907013 (浮かべます) 0.911102 (浮かべます) 0.915100 (浮かべます) 0.919037 (浮かべます) 0.922882 (浮かべます) 0.926636 (浮かべます) 0; 930328 (浮かべます) 0.933899 (浮かべます) 0.937408 (浮かべます) 0.940796 (浮かべます) 0.944122 (浮かべます) 0.947357 (浮かべます) 0.950470 (浮かべます) 0.953522 (浮かべます) 0.956482 (浮かべます) 0.959351 (浮かべます) 0.962097 (浮かべます) 0.964783 (浮かべます) 0.967377 (浮かべます) 0.969849 (浮かべます) 0.972229 (浮かべます) 0.974518(浮遊物)0.976715 (浮かべます) 0.978821 (浮かべます) 0.980835 (浮かべます) 0.982727 (浮かべます) 0.984528 (浮かべます) 0.986237 (浮かべます) 0.987854 (浮かべます) 0.989380 (浮かべます) 0.990784 (浮かべます) 0.992096 (浮かべます) 0.993317 (浮かべます) 0.994415 (浮かべます) 0.995422 (浮かべます) 0.996338 (浮かべます) 0.997162 (浮かべます) 0.997864 (浮かべます) 0.998474 (浮かべます) 0.998962 (浮かべます) 0.999390 (浮かべます) 0.999695 (浮かべます) 0.999878 (浮かべます) 0; (浮かべます)0.999969と、(浮かべます)0.996918と、(浮かべます)0.987701と、(浮かべます)0.972382と、(浮かべます)0.951050と、(浮かべます)0.923889と、(浮かべます)0.891022と、(浮かべます)0.852631と、(浮かべます)0.809021と、(浮かべます)0.760406と、(浮かべます)0.707092と、(浮かべます)0.649445と、(浮かべます)0.587799と、(浮かべます)0.522491と、(浮かべます)0.453979と、(浮かべます)0.382690と、(浮かべます)0.309021と、(浮かべます)0.233459と、(浮かべます)0.156433と、(浮かべます)0.078461の999969、。

   /* Lag window for LPC */
   float lpc_lagwinTbl[LPC_FILTERORDER + 1]={
       (float)1.000100, (float)0.998890, (float)0.995569,
           (float)0.990057, (float)0.982392,
       (float)0.972623, (float)0.960816, (float)0.947047,
           (float)0.931405, (float)0.913989, (float)0.894909};

LPC*/浮遊物のlpc_lagwinTbl[LPC_FILTERORDER+1]のための/*立ち遅れウィンドウは(浮遊物)1.000100、(浮遊物)0.998890、(浮遊物)0.995569、(浮遊物)0.990057、(浮遊物)0.982392、(浮遊物)0.972623、(浮遊物)0.960816、(浮遊物)0.947047、(浮遊物)0.931405、(浮遊物)0.913989、(浮かべます)0.894909と等しいです。

   /* LSF quantization*/
   float lsfCbTbl[64 * 3 + 128 * 3 + 128 * 4] = {
   (float)0.155396, (float)0.273193, (float)0.451172,
   (float)0.390503, (float)0.648071, (float)1.002075,
   (float)0.440186, (float)0.692261, (float)0.955688,

/*LSF量子化*/浮遊物のlsfCbTbl[64*3+128*3+128*4]が等しい、(浮かべます) 0.155396 (浮かべます) 0.273193 (浮かべます) 0.451172 (浮かべます) 0.390503 (浮かべます) 0.648071 (浮かべます) 1.002075 (浮かべます) 0.440186 (浮かべます) 0.692261 (浮かべます) 0.955688

Andersen, et al.              Experimental                     [Page 89]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[89ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   (float)0.343628, (float)0.642334, (float)1.071533,
   (float)0.318359, (float)0.491577, (float)0.670532,
   (float)0.193115, (float)0.375488, (float)0.725708,
   (float)0.364136, (float)0.510376, (float)0.658691,
   (float)0.297485, (float)0.527588, (float)0.842529,
   (float)0.227173, (float)0.365967, (float)0.563110,
   (float)0.244995, (float)0.396729, (float)0.636475,
   (float)0.169434, (float)0.300171, (float)0.520264,
   (float)0.312866, (float)0.464478, (float)0.643188,
   (float)0.248535, (float)0.429932, (float)0.626099,
   (float)0.236206, (float)0.491333, (float)0.817139,
   (float)0.334961, (float)0.625122, (float)0.895752,
   (float)0.343018, (float)0.518555, (float)0.698608,
   (float)0.372803, (float)0.659790, (float)0.945435,
   (float)0.176880, (float)0.316528, (float)0.581421,
   (float)0.416382, (float)0.625977, (float)0.805176,
   (float)0.303223, (float)0.568726, (float)0.915039,
   (float)0.203613, (float)0.351440, (float)0.588135,
   (float)0.221191, (float)0.375000, (float)0.614746,
   (float)0.199951, (float)0.323364, (float)0.476074,
   (float)0.300781, (float)0.433350, (float)0.566895,
   (float)0.226196, (float)0.354004, (float)0.507568,
   (float)0.300049, (float)0.508179, (float)0.711670,
   (float)0.312012, (float)0.492676, (float)0.763428,
   (float)0.329956, (float)0.541016, (float)0.795776,
   (float)0.373779, (float)0.604614, (float)0.928833,
   (float)0.210571, (float)0.452026, (float)0.755249,
   (float)0.271118, (float)0.473267, (float)0.662476,
   (float)0.285522, (float)0.436890, (float)0.634399,
   (float)0.246704, (float)0.565552, (float)0.859009,
   (float)0.270508, (float)0.406250, (float)0.553589,
   (float)0.361450, (float)0.578491, (float)0.813843,
   (float)0.342651, (float)0.482788, (float)0.622437,
   (float)0.340332, (float)0.549438, (float)0.743164,
   (float)0.200439, (float)0.336304, (float)0.540894,
   (float)0.407837, (float)0.644775, (float)0.895142,
   (float)0.294678, (float)0.454834, (float)0.699097,
   (float)0.193115, (float)0.344482, (float)0.643188,
   (float)0.275757, (float)0.420776, (float)0.598755,
   (float)0.380493, (float)0.608643, (float)0.861084,
   (float)0.222778, (float)0.426147, (float)0.676514,
   (float)0.407471, (float)0.700195, (float)1.053101,
   (float)0.218384, (float)0.377197, (float)0.669922,
   (float)0.313232, (float)0.454102, (float)0.600952,
   (float)0.347412, (float)0.571533, (float)0.874146,
   (float)0.238037, (float)0.405396, (float)0.729492,
   (float)0.223877, (float)0.412964, (float)0.822021,
   (float)0.395264, (float)0.582153, (float)0.743896,

626099 (浮かべます) 0.236206 (浮かべます) 0.491333 (浮かべます) 0.817139 (浮かべます) 0.334961 (浮かべます) 0.625122 (浮かべます) 0.895752 (浮かべます) 0.343018 (浮かべます) 0.518555 (浮かべます) 0.698608 (浮かべます) 0.372803 (浮かべます) 0.659790 (浮かべます) 0.945435 (浮かべます) 0.176880 (浮かべます) 0.316528 (浮かべます) 0; 581421 (浮かべます) 0.416382 (浮かべます) 0.625977 (浮かべます) 0.805176 (浮かべます) 0.303223 (浮かべます) 0.568726 (浮かべます) 0.915039 (浮かべます) 0.203613 (浮かべます) 0.351440 (浮かべます) 0.588135 (浮かべます) 0.221191 (浮かべます) 0.375000 (浮かべます) 0.614746 (浮かべます) 0.199951 (浮かべます) 0.323364 (浮かべます) 0.476074(浮遊物)0.300781, (float)0.433350, (float)0.566895, (float)0.226196, (float)0.354004, (float)0.507568, (float)0.300049, (float)0.508179, (float)0.711670, (float)0.312012, (float)0.492676, (float)0.763428, (float)0.329956, (float)0.541016, (float)0.795776, (float)0.373779, (float)0.604614, (float)0.928833, (float)0.210571, (float)0.452026, (float)0.755249, (float)0.271118, (float)0.473267, (float)0.662476, (float)0.285522, (float)0.436890, (float)0.634399, (float)0.246704, (float)0.565552, (float)0.859009, (float)0.270508, (float)0.406250, (float)0.553589, (float)0.361450, (float)0.578491, (float)0.813843, (float)0.342651, (float)0.482788, (float)0.622437, (float)0.340332, (float)0.549438, (float)0.743164, (float)0.200439, (float)0.336304, (float)0.540894, (float)0.407837, (float)0.644775, (float)0.895142, (float)0.294678, (float)0.454834, (float)0.699097, (float)0.193115, (float)0.344482, (float)0.643188, (float)0.275757, (float)0.420776, (float)0.598755, (float)0.380493, (float)0.608643, (float)0.861084, (float)0.222778 (浮かべます) 0.426147 (浮かべます) 0.676514 (浮かべます) 0.407471 (浮かべます) 0.700195 (浮かべます) 1.053101 (浮かべます) 0.218384 (浮かべます) 0.377197 (浮かべます) 0.669922 (浮かべます) 0.313232 (浮かべます) 0.454102 (浮かべます) 0.600952 (浮かべます) 0.347412 (浮かべます) 0.571533 (浮かべます) 0.874146 (浮かべます) 0.238037 (浮かべます) 0.405396 (浮かべます) 0.729492 (浮かべます) 0.223877 (浮かべます) 0.412964 (浮かべます) 0.822021 (浮かべます) 0.395264 (浮かべます) 0.582153 (浮かべます) 0.743896

Andersen, et al.              Experimental                     [Page 90]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[90ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   (float)0.247925, (float)0.485596, (float)0.720581,
   (float)0.229126, (float)0.496582, (float)0.907715,
   (float)0.260132, (float)0.566895, (float)1.012695,
   (float)0.337402, (float)0.611572, (float)0.978149,
   (float)0.267822, (float)0.447632, (float)0.769287,
   (float)0.250610, (float)0.381714, (float)0.530029,
   (float)0.430054, (float)0.805054, (float)1.221924,
   (float)0.382568, (float)0.544067, (float)0.701660,
   (float)0.383545, (float)0.710327, (float)1.149170,
   (float)0.271362, (float)0.529053, (float)0.775513,
   (float)0.246826, (float)0.393555, (float)0.588623,
   (float)0.266846, (float)0.422119, (float)0.676758,
   (float)0.311523, (float)0.580688, (float)0.838623,
   (float)1.331177, (float)1.576782, (float)1.779541,
   (float)1.160034, (float)1.401978, (float)1.768188,
   (float)1.161865, (float)1.525146, (float)1.715332,
   (float)0.759521, (float)0.913940, (float)1.119873,
   (float)0.947144, (float)1.121338, (float)1.282471,
   (float)1.015015, (float)1.557007, (float)1.804932,
   (float)1.172974, (float)1.402100, (float)1.692627,
   (float)1.087524, (float)1.474243, (float)1.665405,
   (float)0.899536, (float)1.105225, (float)1.406250,
   (float)1.148438, (float)1.484741, (float)1.796265,
   (float)0.785645, (float)1.209839, (float)1.567749,
   (float)0.867798, (float)1.166504, (float)1.450684,
   (float)0.922485, (float)1.229858, (float)1.420898,
   (float)0.791260, (float)1.123291, (float)1.409546,
   (float)0.788940, (float)0.966064, (float)1.340332,
   (float)1.051147, (float)1.272827, (float)1.556641,
   (float)0.866821, (float)1.181152, (float)1.538818,
   (float)0.906738, (float)1.373535, (float)1.607910,
   (float)1.244751, (float)1.581421, (float)1.933838,
   (float)0.913940, (float)1.337280, (float)1.539673,
   (float)0.680542, (float)0.959229, (float)1.662720,
   (float)0.887207, (float)1.430542, (float)1.800781,
   (float)0.912598, (float)1.433594, (float)1.683960,
   (float)0.860474, (float)1.060303, (float)1.455322,
   (float)1.005127, (float)1.381104, (float)1.706909,
   (float)0.800781, (float)1.363892, (float)1.829102,
   (float)0.781860, (float)1.124390, (float)1.505981,
   (float)1.003662, (float)1.471436, (float)1.684692,
   (float)0.981323, (float)1.309570, (float)1.618042,
   (float)1.228760, (float)1.554321, (float)1.756470,
   (float)0.734375, (float)0.895752, (float)1.225586,
   (float)0.841797, (float)1.055664, (float)1.249268,
   (float)0.920166, (float)1.119385, (float)1.486206,
   (float)0.894409, (float)1.539063, (float)1.828979,
   (float)1.283691, (float)1.543335, (float)1.858276,

775513 (浮かべます) 0.246826 (浮かべます) 0.393555 (浮かべます) 0.588623 (浮かべます) 0.266846 (浮かべます) 0.422119 (浮かべます) 0.676758 (浮かべます) 0.311523 (浮かべます) 0.580688 (浮かべます) 0.838623 (浮かべます) 1.331177 (浮かべます) 1.576782 (浮かべます) 1.779541 (浮かべます) 1.160034 (浮かべます) 1.401978 (浮かべます) 1; 768188 (浮かべます) 1.161865 (浮かべます) 1.525146 (浮かべます) 1.715332 (浮かべます) 0.759521 (浮かべます) 0.913940 (浮かべます) 1.119873 (浮かべます) 0.947144 (浮かべます) 1.121338 (浮かべます) 1.282471 (浮かべます) 1.015015 (浮かべます) 1.557007 (浮かべます) 1.804932 (浮かべます) 1.172974 (浮かべます) 1.402100 (浮かべます) 1.692627(浮遊物)1.087524, (float)1.474243, (float)1.665405, (float)0.899536, (float)1.105225, (float)1.406250, (float)1.148438, (float)1.484741, (float)1.796265, (float)0.785645, (float)1.209839, (float)1.567749, (float)0.867798, (float)1.166504, (float)1.450684, (float)0.922485, (float)1.229858, (float)1.420898, (float)0.791260, (float)1.123291, (float)1.409546, (float)0.788940, (float)0.966064, (float)1.340332, (float)1.051147, (float)1.272827, (float)1.556641, (float)0.866821, (float)1.181152, (float)1.538818, (float)0.906738, (float)1.373535, (float)1.607910, (float)1.244751, (float)1.581421, (float)1.933838, (float)0.913940, (float)1.337280, (float)1.539673, (float)0.680542, (float)0.959229, (float)1.662720, (float)0.887207, (float)1.430542, (float)1.800781, (float)0.912598, (float)1.433594, (float)1.683960, (float)0.860474, (float)1.060303, (float)1.455322, (float)1.005127, (float)1.381104, (float)1.706909, (float)0.800781, (float)1.363892, (float)1.829102, (float)0.781860, (float)1.124390, (float)1.505981, (float)1.003662 (浮かべます) 1.471436 (浮かべます) 1.684692 (浮かべます) 0.981323 (浮かべます) 1.309570 (浮かべます) 1.618042 (浮かべます) 1.228760 (浮かべます) 1.554321 (浮かべます) 1.756470 (浮かべます) 0.734375 (浮かべます) 0.895752 (浮かべます) 1.225586 (浮かべます) 0.841797 (浮かべます) 1.055664 (浮かべます) 1.249268 (浮かべます) 0.920166 (浮かべます) 1.119385 (浮かべます) 1.486206 (浮かべます) 0.894409 (浮かべます) 1.539063 (浮かべます) 1.828979 (浮かべます) 1.283691 (浮かべます) 1.543335 (浮かべます) 1.858276

Andersen, et al.              Experimental                     [Page 91]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[91ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   (float)0.676025, (float)0.933105, (float)1.490845,
   (float)0.821289, (float)1.491821, (float)1.739868,
   (float)0.923218, (float)1.144653, (float)1.580566,
   (float)1.057251, (float)1.345581, (float)1.635864,
   (float)0.888672, (float)1.074951, (float)1.353149,
   (float)0.942749, (float)1.195435, (float)1.505493,
   (float)1.492310, (float)1.788086, (float)2.039673,
   (float)1.070313, (float)1.634399, (float)1.860962,
   (float)1.253296, (float)1.488892, (float)1.686035,
   (float)0.647095, (float)0.864014, (float)1.401855,
   (float)0.866699, (float)1.254883, (float)1.453369,
   (float)1.063965, (float)1.532593, (float)1.731323,
   (float)1.167847, (float)1.521484, (float)1.884033,
   (float)0.956055, (float)1.502075, (float)1.745605,
   (float)0.928711, (float)1.288574, (float)1.479614,
   (float)1.088013, (float)1.380737, (float)1.570801,
   (float)0.905029, (float)1.186768, (float)1.371948,
   (float)1.057861, (float)1.421021, (float)1.617432,
   (float)1.108276, (float)1.312500, (float)1.501465,
   (float)0.979492, (float)1.416992, (float)1.624268,
   (float)1.276001, (float)1.661011, (float)2.007935,
   (float)0.993042, (float)1.168579, (float)1.331665,
   (float)0.778198, (float)0.944946, (float)1.235962,
   (float)1.223755, (float)1.491333, (float)1.815674,
   (float)0.852661, (float)1.350464, (float)1.722290,
   (float)1.134766, (float)1.593140, (float)1.787354,
   (float)1.051392, (float)1.339722, (float)1.531006,
   (float)0.803589, (float)1.271240, (float)1.652100,
   (float)0.755737, (float)1.143555, (float)1.639404,
   (float)0.700928, (float)0.837280, (float)1.130371,
   (float)0.942749, (float)1.197876, (float)1.669800,
   (float)0.993286, (float)1.378296, (float)1.566528,
   (float)0.801025, (float)1.095337, (float)1.298950,
   (float)0.739990, (float)1.032959, (float)1.383667,
   (float)0.845703, (float)1.072266, (float)1.543823,
   (float)0.915649, (float)1.072266, (float)1.224487,
   (float)1.021973, (float)1.226196, (float)1.481323,
   (float)0.999878, (float)1.204102, (float)1.555908,
   (float)0.722290, (float)0.913940, (float)1.340210,
   (float)0.673340, (float)0.835938, (float)1.259521,
   (float)0.832397, (float)1.208374, (float)1.394165,
   (float)0.962158, (float)1.576172, (float)1.912842,
   (float)1.166748, (float)1.370850, (float)1.556763,
   (float)0.946289, (float)1.138550, (float)1.400391,
   (float)1.035034, (float)1.218262, (float)1.386475,
   (float)1.393799, (float)1.717773, (float)2.000244,
   (float)0.972656, (float)1.260986, (float)1.760620,
   (float)1.028198, (float)1.288452, (float)1.484619,

401855 (浮かべます) 0.866699 (浮かべます) 1.254883 (浮かべます) 1.453369 (浮かべます) 1.063965 (浮かべます) 1.532593 (浮かべます) 1.731323 (浮かべます) 1.167847 (浮かべます) 1.521484 (浮かべます) 1.884033 (浮かべます) 0.956055 (浮かべます) 1.502075 (浮かべます) 1.745605 (浮かべます) 0.928711 (浮かべます) 1.288574 (浮かべます) 1; 479614 (浮かべます) 1.088013 (浮かべます) 1.380737 (浮かべます) 1.570801 (浮かべます) 0.905029 (浮かべます) 1.186768 (浮かべます) 1.371948 (浮かべます) 1.057861 (浮かべます) 1.421021 (浮かべます) 1.617432 (浮かべます) 1.108276 (浮かべます) 1.312500 (浮かべます) 1.501465 (浮かべます) 0.979492 (浮かべます) 1.416992 (浮かべます) 1.624268(浮遊物)1.276001, (float)1.661011, (float)2.007935, (float)0.993042, (float)1.168579, (float)1.331665, (float)0.778198, (float)0.944946, (float)1.235962, (float)1.223755, (float)1.491333, (float)1.815674, (float)0.852661, (float)1.350464, (float)1.722290, (float)1.134766, (float)1.593140, (float)1.787354, (float)1.051392, (float)1.339722, (float)1.531006, (float)0.803589, (float)1.271240, (float)1.652100, (float)0.755737, (float)1.143555, (float)1.639404, (float)0.700928, (float)0.837280, (float)1.130371, (float)0.942749, (float)1.197876, (float)1.669800, (float)0.993286, (float)1.378296, (float)1.566528, (float)0.801025, (float)1.095337, (float)1.298950, (float)0.739990, (float)1.032959, (float)1.383667, (float)0.845703, (float)1.072266, (float)1.543823, (float)0.915649, (float)1.072266, (float)1.224487, (float)1.021973, (float)1.226196, (float)1.481323, (float)0.999878, (float)1.204102, (float)1.555908, (float)0.722290, (float)0.913940, (float)1.340210, (float)0.673340, (float)0.835938, (float)1.259521, (float)0.832397 (浮かべます) 1.208374 (浮かべます) 1.394165 (浮かべます) 0.962158 (浮かべます) 1.576172 (浮かべます) 1.912842 (浮かべます) 1.166748 (浮かべます) 1.370850 (浮かべます) 1.556763 (浮かべます) 0.946289 (浮かべます) 1.138550 (浮かべます) 1.400391 (浮かべます) 1.035034 (浮かべます) 1.218262 (浮かべます) 1.386475 (浮かべます) 1.393799 (浮かべます) 1.717773 (浮かべます) 2.000244 (浮かべます) 0.972656 (浮かべます) 1.260986 (浮かべます) 1.760620 (浮かべます) 1.028198 (浮かべます) 1.288452 (浮かべます) 1.484619

Andersen, et al.              Experimental                     [Page 92]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[92ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   (float)0.773560, (float)1.258057, (float)1.756714,
   (float)1.080322, (float)1.328003, (float)1.742676,
   (float)0.823975, (float)1.450806, (float)1.917725,
   (float)0.859009, (float)1.016602, (float)1.191895,
   (float)0.843994, (float)1.131104, (float)1.645020,
   (float)1.189697, (float)1.702759, (float)1.894409,
   (float)1.346680, (float)1.763184, (float)2.066040,
   (float)0.980469, (float)1.253784, (float)1.441650,
   (float)1.338135, (float)1.641968, (float)1.932739,
   (float)1.223267, (float)1.424194, (float)1.626465,
   (float)0.765747, (float)1.004150, (float)1.579102,
   (float)1.042847, (float)1.269165, (float)1.647461,
   (float)0.968750, (float)1.257568, (float)1.555786,
   (float)0.826294, (float)0.993408, (float)1.275146,
   (float)0.742310, (float)0.950439, (float)1.430542,
   (float)1.054321, (float)1.439819, (float)1.828003,
   (float)1.072998, (float)1.261719, (float)1.441895,
   (float)0.859375, (float)1.036377, (float)1.314819,
   (float)0.895752, (float)1.267212, (float)1.605591,
   (float)0.805420, (float)0.962891, (float)1.142334,
   (float)0.795654, (float)1.005493, (float)1.468506,
   (float)1.105347, (float)1.313843, (float)1.584839,
   (float)0.792236, (float)1.221802, (float)1.465698,
   (float)1.170532, (float)1.467651, (float)1.664063,
   (float)0.838257, (float)1.153198, (float)1.342163,
   (float)0.968018, (float)1.198242, (float)1.391235,
   (float)1.250122, (float)1.623535, (float)1.823608,
   (float)0.711670, (float)1.058350, (float)1.512085,
   (float)1.204834, (float)1.454468, (float)1.739136,
   (float)1.137451, (float)1.421753, (float)1.620117,
   (float)0.820435, (float)1.322754, (float)1.578247,
   (float)0.798706, (float)1.005005, (float)1.213867,
   (float)0.980713, (float)1.324951, (float)1.512939,
   (float)1.112305, (float)1.438843, (float)1.735596,
   (float)1.135498, (float)1.356689, (float)1.635742,
   (float)1.101318, (float)1.387451, (float)1.686523,
   (float)0.849854, (float)1.276978, (float)1.523438,
   (float)1.377930, (float)1.627563, (float)1.858154,
   (float)0.884888, (float)1.095459, (float)1.287476,
   (float)1.289795, (float)1.505859, (float)1.756592,
   (float)0.817505, (float)1.384155, (float)1.650513,
   (float)1.446655, (float)1.702148, (float)1.931885,
   (float)0.835815, (float)1.023071, (float)1.385376,
   (float)0.916626, (float)1.139038, (float)1.335327,
   (float)0.980103, (float)1.174072, (float)1.453735,
   (float)1.705688, (float)2.153809, (float)2.398315, (float)2.743408,
   (float)1.797119, (float)2.016846, (float)2.445679, (float)2.701904,
   (float)1.990356, (float)2.219116, (float)2.576416, (float)2.813477,

翻訳結果

Andersen, et al.              Experimental                     [Page 93]

RFC 3951              Internet Low Bit Rate Codec          December 2004
   (float)1.849365, (float)2.190918, (float)2.611572, (float)2.835083,
   (float)1.657959, (float)1.854370, (float)2.159058, (float)2.726196,
   (float)1.437744, (float)1.897705, (float)2.253174, (float)2.655396,
   (float)2.028687, (float)2.247314, (float)2.542358, (float)2.875854,
   (float)1.736938, (float)1.922119, (float)2.185913, (float)2.743408,
   (float)1.521606, (float)1.870972, (float)2.526855, (float)2.786987,
   (float)1.841431, (float)2.050659, (float)2.463623, (float)2.857666,
   (float)1.590088, (float)2.067261, (float)2.427979, (float)2.794434,
   (float)1.746826, (float)2.057373, (float)2.320190, (float)2.800781,
   (float)1.734619, (float)1.940552, (float)2.306030, (float)2.826416,
   (float)1.786255, (float)2.204468, (float)2.457520, (float)2.795288,
   (float)1.861084, (float)2.170532, (float)2.414551, (float)2.763672,
   (float)2.001465, (float)2.307617, (float)2.552734, (float)2.811890,
   (float)1.784424, (float)2.124146, (float)2.381592, (float)2.645508,
   (float)1.888794, (float)2.135864, (float)2.418579, (float)2.861206,
   (float)2.301147, (float)2.531250, (float)2.724976, (float)2.913086,
   (float)1.837769, (float)2.051270, (float)2.261963, (float)2.553223,
   (float)2.012939, (float)2.221191, (float)2.440186, (float)2.678101,
   (float)1.429565, (float)1.858276, (float)2.582275, (float)2.845703,
   (float)1.622803, (float)1.897705, (float)2.367310, (float)2.621094,
   (float)1.581543, (float)1.960449, (float)2.515869, (float)2.736450,
   (float)1.419434, (float)1.933960, (float)2.394653, (float)2.746704,
   (float)1.721924, (float)2.059570, (float)2.421753, (float)2.769653,
   (float)1.911011, (float)2.220703, (float)2.461060, (float)2.740723,
   (float)1.581177, (float)1.860840, (float)2.516968, (float)2.874634,
   (float)1.870361, (float)2.098755, (float)2.432373, (float)2.656494,
   (float)2.059692, (float)2.279785, (float)2.495605, (float)2.729370,
   (float)1.815674, (float)2.181519, (float)2.451538, (float)2.680542,
   (float)1.407959, (float)1.768311, (float)2.343018, (float)2.668091,
   (float)2.168701, (float)2.394653, (float)2.604736, (float)2.829346,
   (float)1.636230, (float)1.865723, (float)2.329102, (float)2.824219,
   (float)1.878906, (float)2.139526, (float)2.376709, (float)2.679810,
   (float)1.765381, (float)1.971802, (float)2.195435, (float)2.586914,
   (float)2.164795, (float)2.410889, (float)2.673706, (float)2.903198,
   (float)2.071899, (float)2.331055, (float)2.645874, (float)2.907104,
   (float)2.026001, (float)2.311523, (float)2.594849, (float)2.863892,
   (float)1.948975, (float)2.180786, (float)2.514893, (float)2.797852,
   (float)1.881836, (float)2.130859, (float)2.478149, (float)2.804199,
   (float)2.238159, (float)2.452759, (float)2.652832, (float)2.868286,
   (float)1.897949, (float)2.101685, (float)2.524292, (float)2.880127,
   (float)1.856445, (float)2.074585, (float)2.541016, (float)2.791748,
   (float)1.695557, (float)2.199097, (float)2.506226, (float)2.742676,
   (float)1.612671, (float)1.877075, (float)2.435425, (float)2.732910,
   (float)1.568848, (float)1.786499, (float)2.194580, (float)2.768555,
   (float)1.953369, (float)2.164551, (float)2.486938, (float)2.874023,
   (float)1.388306, (float)1.725342, (float)2.384521, (float)2.771851,
   (float)2.115356, (float)2.337769, (float)2.592896, (float)2.864014,
   (float)1.905762, (float)2.111328, (float)2.363525, (float)2.789307,
Andersen, et al.              Experimental                     [Page 94]

RFC 3951              Internet Low Bit Rate Codec          December 2004
   (float)1.882568, (float)2.332031, (float)2.598267, (float)2.827637,
   (float)1.683594, (float)2.088745, (float)2.361938, (float)2.608643,
   (float)1.874023, (float)2.182129, (float)2.536133, (float)2.766968,
   (float)1.861938, (float)2.070435, (float)2.309692, (float)2.700562,
   (float)1.722168, (float)2.107422, (float)2.477295, (float)2.837646,
   (float)1.926880, (float)2.184692, (float)2.442627, (float)2.663818,
   (float)2.123901, (float)2.337280, (float)2.553101, (float)2.777466,
   (float)1.588135, (float)1.911499, (float)2.212769, (float)2.543945,
   (float)2.053955, (float)2.370850, (float)2.712158, (float)2.939941,
   (float)2.210449, (float)2.519653, (float)2.770386, (float)2.958618,
   (float)2.199463, (float)2.474731, (float)2.718262, (float)2.919922,
   (float)1.960083, (float)2.175415, (float)2.608032, (float)2.888794,
   (float)1.953735, (float)2.185181, (float)2.428223, (float)2.809570,
   (float)1.615234, (float)2.036499, (float)2.576538, (float)2.834595,
   (float)1.621094, (float)2.028198, (float)2.431030, (float)2.664673,
   (float)1.824951, (float)2.267456, (float)2.514526, (float)2.747925,
   (float)1.994263, (float)2.229126, (float)2.475220, (float)2.833984,
   (float)1.746338, (float)2.011353, (float)2.588257, (float)2.826904,
   (float)1.562866, (float)2.135986, (float)2.471680, (float)2.687256,
   (float)1.748901, (float)2.083496, (float)2.460938, (float)2.686279,
   (float)1.758057, (float)2.131470, (float)2.636597, (float)2.891602,
   (float)2.071289, (float)2.299072, (float)2.550781, (float)2.814331,
   (float)1.839600, (float)2.094360, (float)2.496460, (float)2.723999,
   (float)1.882202, (float)2.088257, (float)2.636841, (float)2.923096,
   (float)1.957886, (float)2.153198, (float)2.384399, (float)2.615234,
   (float)1.992920, (float)2.351196, (float)2.654419, (float)2.889771,
   (float)2.012817, (float)2.262451, (float)2.643799, (float)2.903076,
   (float)2.025635, (float)2.254761, (float)2.508423, (float)2.784058,
   (float)2.316040, (float)2.589355, (float)2.794189, (float)2.963623,
   (float)1.741211, (float)2.279541, (float)2.578491, (float)2.816284,
   (float)1.845337, (float)2.055786, (float)2.348511, (float)2.822021,
   (float)1.679932, (float)1.926514, (float)2.499756, (float)2.835693,
   (float)1.722534, (float)1.946899, (float)2.448486, (float)2.728760,
   (float)1.829834, (float)2.043213, (float)2.580444, (float)2.867676,
   (float)1.676636, (float)2.071655, (float)2.322510, (float)2.704834,
   (float)1.791504, (float)2.113525, (float)2.469727, (float)2.784058,
   (float)1.977051, (float)2.215088, (float)2.497437, (float)2.726929,
   (float)1.800171, (float)2.106689, (float)2.357788, (float)2.738892,
   (float)1.827759, (float)2.170166, (float)2.525879, (float)2.852417,
   (float)1.918335, (float)2.132813, (float)2.488403, (float)2.728149,
   (float)1.916748, (float)2.225098, (float)2.542603, (float)2.857666,
   (float)1.761230, (float)1.976074, (float)2.507446, (float)2.884521,
   (float)2.053711, (float)2.367432, (float)2.608032, (float)2.837646,
   (float)1.595337, (float)2.000977, (float)2.307129, (float)2.578247,
   (float)1.470581, (float)2.031250, (float)2.375854, (float)2.647583,
   (float)1.801392, (float)2.128052, (float)2.399780, (float)2.822876,
   (float)1.853638, (float)2.066650, (float)2.429199, (float)2.751465,
   (float)1.956299, (float)2.163696, (float)2.394775, (float)2.734253,
Andersen, et al.              Experimental                     [Page 95]

RFC 3951              Internet Low Bit Rate Codec          December 2004
   (float)1.963623, (float)2.275757, (float)2.585327, (float)2.865234,
   (float)1.887451, (float)2.105469, (float)2.331787, (float)2.587402,
   (float)2.120117, (float)2.443359, (float)2.733887, (float)2.941406,
   (float)1.506348, (float)1.766968, (float)2.400513, (float)2.851807,
   (float)1.664551, (float)1.981079, (float)2.375732, (float)2.774414,
   (float)1.720703, (float)1.978882, (float)2.391479, (float)2.640991,
   (float)1.483398, (float)1.814819, (float)2.434448, (float)2.722290,
   (float)1.769043, (float)2.136597, (float)2.563721, (float)2.774414,
   (float)1.810791, (float)2.049316, (float)2.373901, (float)2.613647,
   (float)1.788330, (float)2.005981, (float)2.359131, (float)2.723145,
   (float)1.785156, (float)1.993164, (float)2.399780, (float)2.832520,
   (float)1.695313, (float)2.022949, (float)2.522583, (float)2.745117,
   (float)1.584106, (float)1.965576, (float)2.299927, (float)2.715576,
   (float)1.894897, (float)2.249878, (float)2.655884, (float)2.897705,
   (float)1.720581, (float)1.995728, (float)2.299438, (float)2.557007,
   (float)1.619385, (float)2.173950, (float)2.574219, (float)2.787964,
   (float)1.883179, (float)2.220459, (float)2.474365, (float)2.825073,
   (float)1.447632, (float)2.045044, (float)2.555542, (float)2.744873,
   (float)1.502686, (float)2.156616, (float)2.653320, (float)2.846558,
   (float)1.711548, (float)1.944092, (float)2.282959, (float)2.685791,
   (float)1.499756, (float)1.867554, (float)2.341064, (float)2.578857,
   (float)1.916870, (float)2.135132, (float)2.568237, (float)2.826050,
   (float)1.498047, (float)1.711182, (float)2.223267, (float)2.755127,
   (float)1.808716, (float)1.997559, (float)2.256470, (float)2.758545,
   (float)2.088501, (float)2.402710, (float)2.667358, (float)2.890259,
   (float)1.545044, (float)1.819214, (float)2.324097, (float)2.692993,
   (float)1.796021, (float)2.012573, (float)2.505737, (float)2.784912,
   (float)1.786499, (float)2.041748, (float)2.290405, (float)2.650757,
   (float)1.938232, (float)2.264404, (float)2.529053, (float)2.796143
   };
A.9.  anaFilter.h
   /******************************************************************
       iLBC Speech Coder ANSI-C Source Code
       anaFilter.h
       Copyright (C) The Internet Society (2004).
       All Rights Reserved.
   ******************************************************************/
   #ifndef __iLBC_ANAFILTER_H
   #define __iLBC_ANAFILTER_H
   void anaFilter(
Andersen, et al.              Experimental                     [Page 96]

RFC 3951              Internet Low Bit Rate Codec          December 2004
       float *In,  /* (i) Signal to be filtered */
       float *a,   /* (i) LP parameters */
       int len,/* (i) Length of signal */
       float *Out, /* (o) Filtered signal */
       float *mem  /* (i/o) Filter state */
   );
   #endif
A.10.  anaFilter.c
   /******************************************************************
       iLBC Speech Coder ANSI-C Source Code
       anaFilter.c
       Copyright (C) The Internet Society (2004).
       All Rights Reserved.
   ******************************************************************/
   #include <string.h>
   #include "iLBC_define.h"
   /*----------------------------------------------------------------*
    *  LP analysis filter.
    *---------------------------------------------------------------*/
   void anaFilter(
       float *In,  /* (i) Signal to be filtered */
       float *a,   /* (i) LP parameters */
       int len,/* (i) Length of signal */
       float *Out, /* (o) Filtered signal */
       float *mem  /* (i/o) Filter state */
   ){
       int i, j;
       float *po, *pi, *pm, *pa;
       po = Out;
       /* Filter first part using memory from past */
       for (i=0; i<LPC_FILTERORDER; i++) {
           pi = &In[i];
           pm = &mem[LPC_FILTERORDER-1];
           pa = a;
           *po=0.0;
Andersen, et al.              Experimental                     [Page 97]

RFC 3951              Internet Low Bit Rate Codec          December 2004
           for (j=0; j<=i; j++) {
               *po+=(*pa++)*(*pi--);
           }
           for (j=i+1; j<LPC_FILTERORDER+1; j++) {
               *po+=(*pa++)*(*pm--);
           }
           po++;
       }
       /* Filter last part where the state is entirely
          in the input vector */
       for (i=LPC_FILTERORDER; i<len; i++) {
           pi = &In[i];
           pa = a;
           *po=0.0;
           for (j=0; j<LPC_FILTERORDER+1; j++) {
               *po+=(*pa++)*(*pi--);
           }
           po++;
       }
       /* Update state vector */
       memcpy(mem, &In[len-LPC_FILTERORDER],
           LPC_FILTERORDER*sizeof(float));
   }
A.11.  createCB.h
   /******************************************************************
       iLBC Speech Coder ANSI-C Source Code
       createCB.h
       Copyright (C) The Internet Society (2004).
       All Rights Reserved.
   ******************************************************************/
   #ifndef __iLBC_CREATECB_H
   #define __iLBC_CREATECB_H

#ifndef __iLBC_CREATECB_H #define __iLBC_CREATECB_H

   void filteredCBvecs(
       float *cbvectors,   /* (o) Codebook vector for the
                                  higher section */

void filteredCBvecs( float *cbvectors, /* (o) Codebook vector for the higher section */

Andersen, et al.              Experimental                     [Page 98]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 98] RFC 3951 Internet Low Bit Rate Codec December 2004

       float *mem,         /* (i) Buffer to create codebook
                                  vectors from */
       int lMem        /* (i) Length of buffer */
   );

float *mem, /* (i) Buffer to create codebook vectors from */ int lMem /* (i) Length of buffer */ );

   void searchAugmentedCB(
       int low,        /* (i) Start index for the search */
       int high,           /* (i) End index for the search */
       int stage,          /* (i) Current stage */
       int startIndex,     /* (i) CB index for the first
                                  augmented vector */
       float *target,      /* (i) Target vector for encoding */
       float *buffer,      /* (i) Pointer to the end of the
                                  buffer for augmented codebook
                                  construction */
       float *max_measure, /* (i/o) Currently maximum measure */
       int *best_index,/* (o) Currently the best index */
       float *gain,    /* (o) Currently the best gain */
       float *energy,      /* (o) Energy of augmented
                                  codebook vectors */
       float *invenergy/* (o) Inv energy of aug codebook
                                  vectors */
   );

void searchAugmentedCB( int low, /* (i) Start index for the search */ int high, /* (i) End index for the search */ int stage, /* (i) Current stage */ int startIndex, /* (i) CB index for the first augmented vector */ float *target, /* (i) Target vector for encoding */ float *buffer, /* (i) Pointer to the end of the buffer for augmented codebook construction */ float *max_measure, /* (i/o) Currently maximum measure */ int *best_index,/* (o) Currently the best index */ float *gain, /* (o) Currently the best gain */ float *energy, /* (o) Energy of augmented codebook vectors */ float *invenergy/* (o) Inv energy of aug codebook vectors */ );

   void createAugmentedVec(
       int index,          /* (i) Index for the aug vector
                                  to be created */
       float *buffer,      /* (i) Pointer to the end of the
                                  buffer for augmented codebook
                                  construction */
       float *cbVec    /* (o) The construced codebook vector */
   );

void createAugmentedVec( int index, /* (i) Index for the aug vector to be created */ float *buffer, /* (i) Pointer to the end of the buffer for augmented codebook construction */ float *cbVec /* (o) The construced codebook vector */ );

   #endif

#endif

A.12.  createCB.c

A.12. createCB.c

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC Speech Coder ANSI-C Source Code

       createCB.c

createCB.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright (C) The Internet Society (2004). All Rights Reserved.

   ******************************************************************/

******************************************************************/

Andersen, et al.              Experimental                     [Page 99]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 99] RFC 3951 Internet Low Bit Rate Codec December 2004

   #include "iLBC_define.h"
   #include "constants.h"
   #include <string.h>
   #include <math.h>

#include "iLBC_define.h" #include "constants.h" #include <string.h> #include <math.h>

   /*----------------------------------------------------------------*
    *  Construct an additional codebook vector by filtering the
    *  initial codebook buffer. This vector is then used to expand
    *  the codebook with an additional section.
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * Construct an additional codebook vector by filtering the * initial codebook buffer. This vector is then used to expand * the codebook with an additional section. *---------------------------------------------------------------*/

   void filteredCBvecs(
       float *cbvectors,   /* (o) Codebook vectors for the
                                  higher section */
       float *mem,         /* (i) Buffer to create codebook
                                  vector from */
       int lMem        /* (i) Length of buffer */
   ){
       int j, k;
       float *pp, *pp1;
       float tempbuff2[CB_MEML+CB_FILTERLEN];
       float *pos;

void filteredCBvecs( float *cbvectors, /* (o) Codebook vectors for the higher section */ float *mem, /* (i) Buffer to create codebook vector from */ int lMem /* (i) Length of buffer */ ){ int j, k; float *pp, *pp1; float tempbuff2[CB_MEML+CB_FILTERLEN]; float *pos;

       memset(tempbuff2, 0, (CB_HALFFILTERLEN-1)*sizeof(float));
       memcpy(&tempbuff2[CB_HALFFILTERLEN-1], mem, lMem*sizeof(float));
       memset(&tempbuff2[lMem+CB_HALFFILTERLEN-1], 0,
           (CB_HALFFILTERLEN+1)*sizeof(float));

memset(tempbuff2, 0, (CB_HALFFILTERLEN-1)*sizeof(float)); memcpy(&tempbuff2[CB_HALFFILTERLEN-1], mem, lMem*sizeof(float)); memset(&tempbuff2[lMem+CB_HALFFILTERLEN-1], 0, (CB_HALFFILTERLEN+1)*sizeof(float));

       /* Create codebook vector for higher section by filtering */

/* Create codebook vector for higher section by filtering */

       /* do filtering */
       pos=cbvectors;
       memset(pos, 0, lMem*sizeof(float));
       for (k=0; k<lMem; k++) {
           pp=&tempbuff2[k];
           pp1=&cbfiltersTbl[CB_FILTERLEN-1];
           for (j=0;j<CB_FILTERLEN;j++) {
               (*pos)+=(*pp++)*(*pp1--);
           }
           pos++;
       }
   }

/* do filtering */ pos=cbvectors; memset(pos, 0, lMem*sizeof(float)); for (k=0; k<lMem; k++) { pp=&tempbuff2[k]; pp1=&cbfiltersTbl[CB_FILTERLEN-1]; for (j=0;j<CB_FILTERLEN;j++) { (*pos)+=(*pp++)*(*pp1--); } pos++; } }

   /*----------------------------------------------------------------*
    *  Search the augmented part of the codebook to find the best
    *  measure.
    *----------------------------------------------------------------*/

/*----------------------------------------------------------------* * Search the augmented part of the codebook to find the best * measure. *----------------------------------------------------------------*/

Andersen, et al.              Experimental                    [Page 100]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 100] RFC 3951 Internet Low Bit Rate Codec December 2004

   void searchAugmentedCB(
       int low,        /* (i) Start index for the search */
       int high,           /* (i) End index for the search */
       int stage,          /* (i) Current stage */
       int startIndex,     /* (i) Codebook index for the first
                                  aug vector */
       float *target,      /* (i) Target vector for encoding */
       float *buffer,      /* (i) Pointer to the end of the buffer for
                                  augmented codebook construction */
       float *max_measure, /* (i/o) Currently maximum measure */
       int *best_index,/* (o) Currently the best index */
       float *gain,    /* (o) Currently the best gain */
       float *energy,      /* (o) Energy of augmented codebook
                                  vectors */
       float *invenergy/* (o) Inv energy of augmented codebook
                                  vectors */
   ) {
       int icount, ilow, j, tmpIndex;
       float *pp, *ppo, *ppi, *ppe, crossDot, alfa;
       float weighted, measure, nrjRecursive;
       float ftmp;

void searchAugmentedCB( int low, /* (i) Start index for the search */ int high, /* (i) End index for the search */ int stage, /* (i) Current stage */ int startIndex, /* (i) Codebook index for the first aug vector */ float *target, /* (i) Target vector for encoding */ float *buffer, /* (i) Pointer to the end of the buffer for augmented codebook construction */ float *max_measure, /* (i/o) Currently maximum measure */ int *best_index,/* (o) Currently the best index */ float *gain, /* (o) Currently the best gain */ float *energy, /* (o) Energy of augmented codebook vectors */ float *invenergy/* (o) Inv energy of augmented codebook vectors */ ) { int icount, ilow, j, tmpIndex; float *pp, *ppo, *ppi, *ppe, crossDot, alfa; float weighted, measure, nrjRecursive; float ftmp;

       /* Compute the energy for the first (low-5)
          noninterpolated samples */
       nrjRecursive = (float) 0.0;
       pp = buffer - low + 1;
       for (j=0; j<(low-5); j++) {
           nrjRecursive += ( (*pp)*(*pp) );
           pp++;
       }
       ppe = buffer - low;

/* Compute the energy for the first (low-5) noninterpolated samples */ nrjRecursive = (float) 0.0; pp = buffer - low + 1; for (j=0; j<(low-5); j++) { nrjRecursive += ( (*pp)*(*pp) ); pp++; } ppe = buffer - low;

       for (icount=low; icount<=high; icount++) {

for (icount=low; icount<=high; icount++) {

           /* Index of the codebook vector used for retrieving
              energy values */
           tmpIndex = startIndex+icount-20;

/* Index of the codebook vector used for retrieving energy values */ tmpIndex = startIndex+icount-20;

           ilow = icount-4;

ilow = icount-4;

           /* Update the energy recursively to save complexity */
           nrjRecursive = nrjRecursive + (*ppe)*(*ppe);
           ppe--;
           energy[tmpIndex] = nrjRecursive;

/* Update the energy recursively to save complexity */ nrjRecursive = nrjRecursive + (*ppe)*(*ppe); ppe--; energy[tmpIndex] = nrjRecursive;

           /* Compute cross dot product for the first (low-5)
              samples */

/* Compute cross dot product for the first (low-5) samples */

Andersen, et al.              Experimental                    [Page 101]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 101] RFC 3951 Internet Low Bit Rate Codec December 2004

           crossDot = (float) 0.0;
           pp = buffer-icount;
           for (j=0; j<ilow; j++) {
               crossDot += target[j]*(*pp++);
           }

crossDot = (float) 0.0; pp = buffer-icount; for (j=0; j<ilow; j++) { crossDot += target[j]*(*pp++); }

           /* interpolation */
           alfa = (float) 0.2;
           ppo = buffer-4;
           ppi = buffer-icount-4;
           for (j=ilow; j<icount; j++) {
               weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi);
               ppo++;
               ppi++;
               energy[tmpIndex] += weighted*weighted;
               crossDot += target[j]*weighted;
               alfa += (float)0.2;
           }

/* interpolation */ alfa = (float) 0.2; ppo = buffer-4; ppi = buffer-icount-4; for (j=ilow; j<icount; j++) { weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi); ppo++; ppi++; energy[tmpIndex] += weighted*weighted; crossDot += target[j]*weighted; alfa += (float)0.2; }

           /* Compute energy and cross dot product for the
              remaining samples */
           pp = buffer - icount;
           for (j=icount; j<SUBL; j++) {
               energy[tmpIndex] += (*pp)*(*pp);
               crossDot += target[j]*(*pp++);
           }

/* Compute energy and cross dot product for the remaining samples */ pp = buffer - icount; for (j=icount; j<SUBL; j++) { energy[tmpIndex] += (*pp)*(*pp); crossDot += target[j]*(*pp++); }

           if (energy[tmpIndex]>0.0) {
               invenergy[tmpIndex]=(float)1.0/(energy[tmpIndex]+EPS);
           } else {
               invenergy[tmpIndex] = (float) 0.0;
           }

if (energy[tmpIndex]>0.0) { invenergy[tmpIndex]=(float)1.0/(energy[tmpIndex]+EPS); } else { invenergy[tmpIndex] = (float) 0.0; }

           if (stage==0) {
               measure = (float)-10000000.0;

if (stage==0) { measure = (float)-10000000.0;

               if (crossDot > 0.0) {
                   measure = crossDot*crossDot*invenergy[tmpIndex];
               }
           }
           else {
               measure = crossDot*crossDot*invenergy[tmpIndex];
           }

if (crossDot > 0.0) { measure = crossDot*crossDot*invenergy[tmpIndex]; } } else { measure = crossDot*crossDot*invenergy[tmpIndex]; }

           /* check if measure is better */
           ftmp = crossDot*invenergy[tmpIndex];

/* check if measure is better */ ftmp = crossDot*invenergy[tmpIndex];

           if ((measure>*max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {

if ((measure>*max_measure) && (fabs(ftmp)<CB_MAXGAIN)) {

Andersen, et al.              Experimental                    [Page 102]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 102] RFC 3951 Internet Low Bit Rate Codec December 2004

               *best_index = tmpIndex;
               *max_measure = measure;
               *gain = ftmp;
           }
       }
   }

*best_index = tmpIndex; *max_measure = measure; *gain = ftmp; } } }

   /*----------------------------------------------------------------*
    *  Recreate a specific codebook vector from the augmented part.
    *
    *----------------------------------------------------------------*/

/*----------------------------------------------------------------* * Recreate a specific codebook vector from the augmented part. * *----------------------------------------------------------------*/

   void createAugmentedVec(
       int index,      /* (i) Index for the augmented vector
                              to be created */
       float *buffer,  /* (i) Pointer to the end of the buffer for
                              augmented codebook construction */
       float *cbVec/* (o) The construced codebook vector */
   ) {
       int ilow, j;
       float *pp, *ppo, *ppi, alfa, alfa1, weighted;

void createAugmentedVec( int index, /* (i) Index for the augmented vector to be created */ float *buffer, /* (i) Pointer to the end of the buffer for augmented codebook construction */ float *cbVec/* (o) The construced codebook vector */ ) { int ilow, j; float *pp, *ppo, *ppi, alfa, alfa1, weighted;

       ilow = index-5;

ilow = index-5;

       /* copy the first noninterpolated part */

/* copy the first noninterpolated part */

       pp = buffer-index;
       memcpy(cbVec,pp,sizeof(float)*index);

pp = buffer-index; memcpy(cbVec,pp,sizeof(float)*index);

       /* interpolation */

/* interpolation */

       alfa1 = (float)0.2;
       alfa = 0.0;
       ppo = buffer-5;
       ppi = buffer-index-5;
       for (j=ilow; j<index; j++) {
           weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi);
           ppo++;
           ppi++;
           cbVec[j] = weighted;
           alfa += alfa1;
       }

alfa1 = (float)0.2; alfa = 0.0; ppo = buffer-5; ppi = buffer-index-5; for (j=ilow; j<index; j++) { weighted = ((float)1.0-alfa)*(*ppo)+alfa*(*ppi); ppo++; ppi++; cbVec[j] = weighted; alfa += alfa1; }

       /* copy the second noninterpolated part */

/* copy the second noninterpolated part */

       pp = buffer - index;
       memcpy(cbVec+index,pp,sizeof(float)*(SUBL-index));

pp = buffer - index; memcpy(cbVec+index,pp,sizeof(float)*(SUBL-index));

Andersen, et al.              Experimental                    [Page 103]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 103] RFC 3951 Internet Low Bit Rate Codec December 2004

   }

}

A.13.  doCPLC.h

A.13. doCPLC.h

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC Speech Coder ANSI-C Source Code

       doCPLC.h

doCPLC.h

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright (C) The Internet Society (2004). All Rights Reserved.

   ******************************************************************/

******************************************************************/

   #ifndef __iLBC_DOLPC_H
   #define __iLBC_DOLPC_H

#ifndef __iLBC_DOLPC_H #define __iLBC_DOLPC_H

   void doThePLC(
       float *PLCresidual, /* (o) concealed residual */
       float *PLClpc,      /* (o) concealed LP parameters */
       int PLI,        /* (i) packet loss indicator
                                  0 - no PL, 1 = PL */
       float *decresidual, /* (i) decoded residual */
       float *lpc,         /* (i) decoded LPC (only used for no PL) */
       int inlag,          /* (i) pitch lag */
       iLBC_Dec_Inst_t *iLBCdec_inst
                           /* (i/o) decoder instance */
   );

void doThePLC( float *PLCresidual, /* (o) concealed residual */ float *PLClpc, /* (o) concealed LP parameters */ int PLI, /* (i) packet loss indicator 0 - no PL, 1 = PL */ float *decresidual, /* (i) decoded residual */ float *lpc, /* (i) decoded LPC (only used for no PL) */ int inlag, /* (i) pitch lag */ iLBC_Dec_Inst_t *iLBCdec_inst /* (i/o) decoder instance */ );

   #endif

#endif

A.14.  doCPLC.c

A.14. doCPLC.c

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC Speech Coder ANSI-C Source Code

       doCPLC.c

doCPLC.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright (C) The Internet Society (2004). All Rights Reserved.

   ******************************************************************/

******************************************************************/

   #include <math.h>
   #include <string.h>
   #include <stdio.h>

#include <math.h> #include <string.h> #include <stdio.h>

Andersen, et al.              Experimental                    [Page 104]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 104] RFC 3951 Internet Low Bit Rate Codec December 2004

   #include "iLBC_define.h"

#include "iLBC_define.h"

   /*----------------------------------------------------------------*
    *  Compute cross correlation and pitch gain for pitch prediction
    *  of last subframe at given lag.
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * Compute cross correlation and pitch gain for pitch prediction * of last subframe at given lag. *---------------------------------------------------------------*/

   void compCorr(
       float *cc,      /* (o) cross correlation coefficient */
       float *gc,      /* (o) gain */
       float *pm,
       float *buffer,  /* (i) signal buffer */
       int lag,    /* (i) pitch lag */
       int bLen,       /* (i) length of buffer */
       int sRange      /* (i) correlation search length */
   ){
       int i;
       float ftmp1, ftmp2, ftmp3;

void compCorr( float *cc, /* (o) cross correlation coefficient */ float *gc, /* (o) gain */ float *pm, float *buffer, /* (i) signal buffer */ int lag, /* (i) pitch lag */ int bLen, /* (i) length of buffer */ int sRange /* (i) correlation search length */ ){ int i; float ftmp1, ftmp2, ftmp3;

       /* Guard against getting outside buffer */
       if ((bLen-sRange-lag)<0) {
           sRange=bLen-lag;
       }

/* Guard against getting outside buffer */ if ((bLen-sRange-lag)<0) { sRange=bLen-lag; }

       ftmp1 = 0.0;
       ftmp2 = 0.0;
       ftmp3 = 0.0;
       for (i=0; i<sRange; i++) {
           ftmp1 += buffer[bLen-sRange+i] *
               buffer[bLen-sRange+i-lag];
           ftmp2 += buffer[bLen-sRange+i-lag] *
                   buffer[bLen-sRange+i-lag];
           ftmp3 += buffer[bLen-sRange+i] *
                   buffer[bLen-sRange+i];
       }

ftmp1 = 0.0; ftmp2 = 0.0; ftmp3 = 0.0; for (i=0; i<sRange; i++) { ftmp1 += buffer[bLen-sRange+i] * buffer[bLen-sRange+i-lag]; ftmp2 += buffer[bLen-sRange+i-lag] * buffer[bLen-sRange+i-lag]; ftmp3 += buffer[bLen-sRange+i] * buffer[bLen-sRange+i]; }

       if (ftmp2 > 0.0) {
           *cc = ftmp1*ftmp1/ftmp2;
           *gc = (float)fabs(ftmp1/ftmp2);
           *pm=(float)fabs(ftmp1)/
               ((float)sqrt(ftmp2)*(float)sqrt(ftmp3));
       }
       else {
           *cc = 0.0;
           *gc = 0.0;
           *pm=0.0;
       }
   }

if (ftmp2 > 0.0) { *cc = ftmp1*ftmp1/ftmp2; *gc = (float)fabs(ftmp1/ftmp2); *pm=(float)fabs(ftmp1)/ ((float)sqrt(ftmp2)*(float)sqrt(ftmp3)); } else { *cc = 0.0; *gc = 0.0; *pm=0.0; } }

Andersen, et al.              Experimental                    [Page 105]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 105] RFC 3951 Internet Low Bit Rate Codec December 2004

   /*----------------------------------------------------------------*
    *  Packet loss concealment routine. Conceals a residual signal
    *  and LP parameters. If no packet loss, update state.
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * Packet loss concealment routine. Conceals a residual signal * and LP parameters. If no packet loss, update state. *---------------------------------------------------------------*/

   void doThePLC(
       float *PLCresidual, /* (o) concealed residual */
       float *PLClpc,      /* (o) concealed LP parameters */
       int PLI,        /* (i) packet loss indicator
                                  0 - no PL, 1 = PL */
       float *decresidual, /* (i) decoded residual */
       float *lpc,         /* (i) decoded LPC (only used for no PL) */
       int inlag,          /* (i) pitch lag */
       iLBC_Dec_Inst_t *iLBCdec_inst
                           /* (i/o) decoder instance */
   ){
       int lag=20, randlag;
       float gain, maxcc;
       float use_gain;
       float gain_comp, maxcc_comp, per, max_per;
       int i, pick, use_lag;
       float ftmp, randvec[BLOCKL_MAX], pitchfact, energy;

void doThePLC( float *PLCresidual, /* (o) concealed residual */ float *PLClpc, /* (o) concealed LP parameters */ int PLI, /* (i) packet loss indicator 0 - no PL, 1 = PL */ float *decresidual, /* (i) decoded residual */ float *lpc, /* (i) decoded LPC (only used for no PL) */ int inlag, /* (i) pitch lag */ iLBC_Dec_Inst_t *iLBCdec_inst /* (i/o) decoder instance */ ){ int lag=20, randlag; float gain, maxcc; float use_gain; float gain_comp, maxcc_comp, per, max_per; int i, pick, use_lag; float ftmp, randvec[BLOCKL_MAX], pitchfact, energy;

       /* Packet Loss */

/* Packet Loss */

       if (PLI == 1) {

if (PLI == 1) {

           iLBCdec_inst->consPLICount += 1;

iLBCdec_inst->consPLICount += 1;

           /* if previous frame not lost,
              determine pitch pred. gain */

/* if previous frame not lost, determine pitch pred. gain */

           if (iLBCdec_inst->prevPLI != 1) {

if (iLBCdec_inst->prevPLI != 1) {

               /* Search around the previous lag to find the
                  best pitch period */

/* Search around the previous lag to find the best pitch period */

               lag=inlag-3;
               compCorr(&maxcc, &gain, &max_per,
                   iLBCdec_inst->prevResidual,
                   lag, iLBCdec_inst->blockl, 60);
               for (i=inlag-2;i<=inlag+3;i++) {
                   compCorr(&maxcc_comp, &gain_comp, &per,
                       iLBCdec_inst->prevResidual,
                       i, iLBCdec_inst->blockl, 60);

lag=inlag-3; compCorr(&maxcc, &gain, &max_per, iLBCdec_inst->prevResidual, lag, iLBCdec_inst->blockl, 60); for (i=inlag-2;i<=inlag+3;i++) { compCorr(&maxcc_comp, &gain_comp, &per, iLBCdec_inst->prevResidual, i, iLBCdec_inst->blockl, 60);

                   if (maxcc_comp>maxcc) {
                       maxcc=maxcc_comp;

if (maxcc_comp>maxcc) { maxcc=maxcc_comp;

Andersen, et al.              Experimental                    [Page 106]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 106] RFC 3951 Internet Low Bit Rate Codec December 2004

                       gain=gain_comp;
                       lag=i;
                       max_per=per;
                   }
               }

gain=gain_comp; lag=i; max_per=per; } }

           }

}

           /* previous frame lost, use recorded lag and periodicity */

/* previous frame lost, use recorded lag and periodicity */

           else {
               lag=iLBCdec_inst->prevLag;
               max_per=iLBCdec_inst->per;
           }

else { lag=iLBCdec_inst->prevLag; max_per=iLBCdec_inst->per; }

           /* downscaling */

/* downscaling */

           use_gain=1.0;
           if (iLBCdec_inst->consPLICount*iLBCdec_inst->blockl>320)
               use_gain=(float)0.9;
           else if (iLBCdec_inst->consPLICount*
                           iLBCdec_inst->blockl>2*320)
               use_gain=(float)0.7;
           else if (iLBCdec_inst->consPLICount*
                           iLBCdec_inst->blockl>3*320)
               use_gain=(float)0.5;
           else if (iLBCdec_inst->consPLICount*
                           iLBCdec_inst->blockl>4*320)
               use_gain=(float)0.0;

use_gain=1.0; if (iLBCdec_inst->consPLICount*iLBCdec_inst->blockl>320) use_gain=(float)0.9; else if (iLBCdec_inst->consPLICount* iLBCdec_inst->blockl>2*320) use_gain=(float)0.7; else if (iLBCdec_inst->consPLICount* iLBCdec_inst->blockl>3*320) use_gain=(float)0.5; else if (iLBCdec_inst->consPLICount* iLBCdec_inst->blockl>4*320) use_gain=(float)0.0;

           /* mix noise and pitch repeatition */
           ftmp=(float)sqrt(max_per);
           if (ftmp>(float)0.7)
               pitchfact=(float)1.0;
           else if (ftmp>(float)0.4)
               pitchfact=(ftmp-(float)0.4)/((float)0.7-(float)0.4);
           else
               pitchfact=0.0;

/* mix noise and pitch repeatition */ ftmp=(float)sqrt(max_per); if (ftmp>(float)0.7) pitchfact=(float)1.0; else if (ftmp>(float)0.4) pitchfact=(ftmp-(float)0.4)/((float)0.7-(float)0.4); else pitchfact=0.0;

           /* avoid repetition of same pitch cycle */
           use_lag=lag;
           if (lag<80) {
               use_lag=2*lag;
           }

/* avoid repetition of same pitch cycle */ use_lag=lag; if (lag<80) { use_lag=2*lag; }

           /* compute concealed residual */

/* compute concealed residual */

Andersen, et al.              Experimental                    [Page 107]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 107] RFC 3951 Internet Low Bit Rate Codec December 2004

           energy = 0.0;
           for (i=0; i<iLBCdec_inst->blockl; i++) {

energy = 0.0; for (i=0; i<iLBCdec_inst->blockl; i++) {

               /* noise component */

/* noise component */

               iLBCdec_inst->seed=(iLBCdec_inst->seed*69069L+1) &
                   (0x80000000L-1);
               randlag = 50 + ((signed long) iLBCdec_inst->seed)%70;
               pick = i - randlag;

iLBCdec_inst->seed=(iLBCdec_inst->seed*69069L+1) & (0x80000000L-1); randlag = 50 + ((signed long) iLBCdec_inst->seed)%70; pick = i - randlag;

               if (pick < 0) {
                   randvec[i] =
                       iLBCdec_inst->prevResidual[
                                   iLBCdec_inst->blockl+pick];
               } else {
                   randvec[i] =  randvec[pick];
               }

if (pick < 0) { randvec[i] = iLBCdec_inst->prevResidual[ iLBCdec_inst->blockl+pick]; } else { randvec[i] = randvec[pick]; }

               /* pitch repeatition component */
               pick = i - use_lag;

/* pitch repeatition component */ pick = i - use_lag;

               if (pick < 0) {
                   PLCresidual[i] =
                       iLBCdec_inst->prevResidual[
                                   iLBCdec_inst->blockl+pick];
               } else {
                   PLCresidual[i] = PLCresidual[pick];
               }

if (pick < 0) { PLCresidual[i] = iLBCdec_inst->prevResidual[ iLBCdec_inst->blockl+pick]; } else { PLCresidual[i] = PLCresidual[pick]; }

               /* mix random and periodicity component */

/* mix random and periodicity component */

               if (i<80)
                   PLCresidual[i] = use_gain*(pitchfact *
                               PLCresidual[i] +
                               ((float)1.0 - pitchfact) * randvec[i]);
               else if (i<160)
                   PLCresidual[i] = (float)0.95*use_gain*(pitchfact *
                               PLCresidual[i] +
                               ((float)1.0 - pitchfact) * randvec[i]);
               else
                   PLCresidual[i] = (float)0.9*use_gain*(pitchfact *
                               PLCresidual[i] +
                               ((float)1.0 - pitchfact) * randvec[i]);

if (i<80) PLCresidual[i] = use_gain*(pitchfact * PLCresidual[i] + ((float)1.0 - pitchfact) * randvec[i]); else if (i<160) PLCresidual[i] = (float)0.95*use_gain*(pitchfact * PLCresidual[i] + ((float)1.0 - pitchfact) * randvec[i]); else PLCresidual[i] = (float)0.9*use_gain*(pitchfact * PLCresidual[i] + ((float)1.0 - pitchfact) * randvec[i]);

               energy += PLCresidual[i] * PLCresidual[i];
           }

energy += PLCresidual[i] * PLCresidual[i]; }

           /* less than 30 dB, use only noise */

/* less than 30 dB, use only noise */

Andersen, et al.              Experimental                    [Page 108]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 108] RFC 3951 Internet Low Bit Rate Codec December 2004

           if (sqrt(energy/(float)iLBCdec_inst->blockl) < 30.0) {
               gain=0.0;
               for (i=0; i<iLBCdec_inst->blockl; i++) {
                   PLCresidual[i] = randvec[i];
               }
           }

if (sqrt(energy/(float)iLBCdec_inst->blockl) < 30.0) { gain=0.0; for (i=0; i<iLBCdec_inst->blockl; i++) { PLCresidual[i] = randvec[i]; } }

           /* use old LPC */

/* use old LPC */

           memcpy(PLClpc,iLBCdec_inst->prevLpc,
               (LPC_FILTERORDER+1)*sizeof(float));

memcpy(PLClpc,iLBCdec_inst->prevLpc, (LPC_FILTERORDER+1)*sizeof(float));

       }

}

       /* no packet loss, copy input */

/* no packet loss, copy input */

       else {
           memcpy(PLCresidual, decresidual,
               iLBCdec_inst->blockl*sizeof(float));
           memcpy(PLClpc, lpc, (LPC_FILTERORDER+1)*sizeof(float));
           iLBCdec_inst->consPLICount = 0;
       }

else { memcpy(PLCresidual, decresidual, iLBCdec_inst->blockl*sizeof(float)); memcpy(PLClpc, lpc, (LPC_FILTERORDER+1)*sizeof(float)); iLBCdec_inst->consPLICount = 0; }

       /* update state */

/* update state */

       if (PLI) {
           iLBCdec_inst->prevLag = lag;
           iLBCdec_inst->per=max_per;
       }

if (PLI) { iLBCdec_inst->prevLag = lag; iLBCdec_inst->per=max_per; }

       iLBCdec_inst->prevPLI = PLI;
       memcpy(iLBCdec_inst->prevLpc, PLClpc,
           (LPC_FILTERORDER+1)*sizeof(float));
       memcpy(iLBCdec_inst->prevResidual, PLCresidual,
           iLBCdec_inst->blockl*sizeof(float));
   }

iLBCdec_inst->prevPLI = PLI; memcpy(iLBCdec_inst->prevLpc, PLClpc, (LPC_FILTERORDER+1)*sizeof(float)); memcpy(iLBCdec_inst->prevResidual, PLCresidual, iLBCdec_inst->blockl*sizeof(float)); }

A.15.  enhancer.h

A.15. enhancer.h

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC Speech Coder ANSI-C Source Code

       enhancer.h

enhancer.h

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright (C) The Internet Society (2004). All Rights Reserved.

Andersen, et al.              Experimental                    [Page 109]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 109] RFC 3951 Internet Low Bit Rate Codec December 2004

   ******************************************************************/

******************************************************************/

   #ifndef __ENHANCER_H
   #define __ENHANCER_H

#ifndef __ENHANCER_H #define __ENHANCER_H

   #include "iLBC_define.h"

#include "iLBC_define.h"

   float xCorrCoef(
       float *target,      /* (i) first array */
       float *regressor,   /* (i) second array */
       int subl        /* (i) dimension arrays */
   );

float xCorrCoef( float *target, /* (i) first array */ float *regressor, /* (i) second array */ int subl /* (i) dimension arrays */ );

   int enhancerInterface(
       float *out,         /* (o) the enhanced recidual signal */
       float *in,          /* (i) the recidual signal to enhance */
       iLBC_Dec_Inst_t *iLBCdec_inst
                           /* (i/o) the decoder state structure */
   );

int enhancerInterface( float *out, /* (o) the enhanced recidual signal */ float *in, /* (i) the recidual signal to enhance */ iLBC_Dec_Inst_t *iLBCdec_inst /* (i/o) the decoder state structure */ );

   #endif

#endif

A.16.  enhancer.c

A.16. enhancer.c

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC Speech Coder ANSI-C Source Code

       enhancer.c

enhancer.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright (C) The Internet Society (2004). All Rights Reserved.

   ******************************************************************/

******************************************************************/

   #include <math.h>
   #include <string.h>
   #include "iLBC_define.h"
   #include "constants.h"
   #include "filter.h"

#include <math.h> #include <string.h> #include "iLBC_define.h" #include "constants.h" #include "filter.h"

   /*----------------------------------------------------------------*
    * Find index in array such that the array element with said
    * index is the element of said array closest to "value"
    * according to the squared-error criterion
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * Find index in array such that the array element with said * index is the element of said array closest to "value" * according to the squared-error criterion *---------------------------------------------------------------*/

   void NearestNeighbor(

void NearestNeighbor(

Andersen, et al.              Experimental                    [Page 110]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 110] RFC 3951 Internet Low Bit Rate Codec December 2004

       int   *index,   /* (o) index of array element closest
                              to value */
       float *array,   /* (i) data array */
       float value,/* (i) value */
       int arlength/* (i) dimension of data array */
   ){
       int i;
       float bestcrit,crit;

int *index, /* (o) index of array element closest to value */ float *array, /* (i) data array */ float value,/* (i) value */ int arlength/* (i) dimension of data array */ ){ int i; float bestcrit,crit;

       crit=array[0]-value;
       bestcrit=crit*crit;
       *index=0;
       for (i=1; i<arlength; i++) {
           crit=array[i]-value;
           crit=crit*crit;

crit=array[0]-value; bestcrit=crit*crit; *index=0; for (i=1; i<arlength; i++) { crit=array[i]-value; crit=crit*crit;

           if (crit<bestcrit) {
               bestcrit=crit;
               *index=i;
           }
       }
   }

if (crit<bestcrit) { bestcrit=crit; *index=i; } } }

   /*----------------------------------------------------------------*
    * compute cross correlation between sequences
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * compute cross correlation between sequences *---------------------------------------------------------------*/

   void mycorr1(
       float* corr,    /* (o) correlation of seq1 and seq2 */
       float* seq1,    /* (i) first sequence */
       int dim1,           /* (i) dimension first seq1 */
       const float *seq2,  /* (i) second sequence */
       int dim2        /* (i) dimension seq2 */
   ){
       int i,j;

void mycorr1( float* corr, /* (o) correlation of seq1 and seq2 */ float* seq1, /* (i) first sequence */ int dim1, /* (i) dimension first seq1 */ const float *seq2, /* (i) second sequence */ int dim2 /* (i) dimension seq2 */ ){ int i,j;

       for (i=0; i<=dim1-dim2; i++) {
           corr[i]=0.0;
           for (j=0; j<dim2; j++) {
               corr[i] += seq1[i+j] * seq2[j];
           }
       }
   }

for (i=0; i<=dim1-dim2; i++) { corr[i]=0.0; for (j=0; j<dim2; j++) { corr[i] += seq1[i+j] * seq2[j]; } } }

   /*----------------------------------------------------------------*
    * upsample finite array assuming zeros outside bounds
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * upsample finite array assuming zeros outside bounds *---------------------------------------------------------------*/

Andersen, et al.              Experimental                    [Page 111]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 111] RFC 3951 Internet Low Bit Rate Codec December 2004

   void enh_upsample(
       float* useq1,   /* (o) upsampled output sequence */
       float* seq1,/* (i) unupsampled sequence */
       int dim1,       /* (i) dimension seq1 */
       int hfl         /* (i) polyphase filter length=2*hfl+1 */
   ){
       float *pu,*ps;
       int i,j,k,q,filterlength,hfl2;
       const float *polyp[ENH_UPS0]; /* pointers to
                                        polyphase columns */
       const float *pp;

void enh_upsample( float* useq1, /* (o) upsampled output sequence */ float* seq1,/* (i) unupsampled sequence */ int dim1, /* (i) dimension seq1 */ int hfl /* (i) polyphase filter length=2*hfl+1 */ ){ float *pu,*ps; int i,j,k,q,filterlength,hfl2; const float *polyp[ENH_UPS0]; /* pointers to polyphase columns */ const float *pp;

       /* define pointers for filter */

/* define pointers for filter */

       filterlength=2*hfl+1;

filterlength=2*hfl+1;

       if ( filterlength > dim1 ) {
           hfl2=(int) (dim1/2);
           for (j=0; j<ENH_UPS0; j++) {
               polyp[j]=polyphaserTbl+j*filterlength+hfl-hfl2;
           }
           hfl=hfl2;
           filterlength=2*hfl+1;
       }
       else {
           for (j=0; j<ENH_UPS0; j++) {
               polyp[j]=polyphaserTbl+j*filterlength;
           }
       }

if ( filterlength > dim1 ) { hfl2=(int) (dim1/2); for (j=0; j<ENH_UPS0; j++) { polyp[j]=polyphaserTbl+j*filterlength+hfl-hfl2; } hfl=hfl2; filterlength=2*hfl+1; } else { for (j=0; j<ENH_UPS0; j++) { polyp[j]=polyphaserTbl+j*filterlength; } }

       /* filtering: filter overhangs left side of sequence */

/* filtering: filter overhangs left side of sequence */

       pu=useq1;
       for (i=hfl; i<filterlength; i++) {
           for (j=0; j<ENH_UPS0; j++) {
               *pu=0.0;
               pp = polyp[j];
               ps = seq1+i;
               for (k=0; k<=i; k++) {
                   *pu += *ps-- * *pp++;
               }
               pu++;
           }
       }

pu=useq1; for (i=hfl; i<filterlength; i++) { for (j=0; j<ENH_UPS0; j++) { *pu=0.0; pp = polyp[j]; ps = seq1+i; for (k=0; k<=i; k++) { *pu += *ps-- * *pp++; } pu++; } }

       /* filtering: simple convolution=inner products */

/* filtering: simple convolution=inner products */

       for (i=filterlength; i<dim1; i++) {

for (i=filterlength; i<dim1; i++) {

Andersen, et al.              Experimental                    [Page 112]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 112] RFC 3951 Internet Low Bit Rate Codec December 2004

           for (j=0;j<ENH_UPS0; j++){
               *pu=0.0;
               pp = polyp[j];
               ps = seq1+i;
               for (k=0; k<filterlength; k++) {
                   *pu += *ps-- * *pp++;
               }
               pu++;
           }
       }

for (j=0;j<ENH_UPS0; j++){ *pu=0.0; pp = polyp[j]; ps = seq1+i; for (k=0; k<filterlength; k++) { *pu += *ps-- * *pp++; } pu++; } }

       /* filtering: filter overhangs right side of sequence */

/* filtering: filter overhangs right side of sequence */

       for (q=1; q<=hfl; q++) {
           for (j=0; j<ENH_UPS0; j++) {
               *pu=0.0;
               pp = polyp[j]+q;
               ps = seq1+dim1-1;
               for (k=0; k<filterlength-q; k++) {
                   *pu += *ps-- * *pp++;
               }
               pu++;
           }
       }
   }

for (q=1; q<=hfl; q++) { for (j=0; j<ENH_UPS0; j++) { *pu=0.0; pp = polyp[j]+q; ps = seq1+dim1-1; for (k=0; k<filterlength-q; k++) { *pu += *ps-- * *pp++; } pu++; } } }

   /*----------------------------------------------------------------*
    * find segment starting near idata+estSegPos that has highest
    * correlation with idata+centerStartPos through
    * idata+centerStartPos+ENH_BLOCKL-1 segment is found at a
    * resolution of ENH_UPSO times the original of the original
    * sampling rate
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * find segment starting near idata+estSegPos that has highest * correlation with idata+centerStartPos through * idata+centerStartPos+ENH_BLOCKL-1 segment is found at a * resolution of ENH_UPSO times the original of the original * sampling rate *---------------------------------------------------------------*/

   void refiner(
       float *seg,         /* (o) segment array */
       float *updStartPos, /* (o) updated start point */
       float* idata,       /* (i) original data buffer */
       int idatal,         /* (i) dimension of idata */
       int centerStartPos, /* (i) beginning center segment */
       float estSegPos,/* (i) estimated beginning other segment */
       float period    /* (i) estimated pitch period */
   ){
       int estSegPosRounded,searchSegStartPos,searchSegEndPos,corrdim;
       int tloc,tloc2,i,st,en,fraction;
       float vect[ENH_VECTL],corrVec[ENH_CORRDIM],maxv;
       float corrVecUps[ENH_CORRDIM*ENH_UPS0];

void refiner( float *seg, /* (o) segment array */ float *updStartPos, /* (o) updated start point */ float* idata, /* (i) original data buffer */ int idatal, /* (i) dimension of idata */ int centerStartPos, /* (i) beginning center segment */ float estSegPos,/* (i) estimated beginning other segment */ float period /* (i) estimated pitch period */ ){ int estSegPosRounded,searchSegStartPos,searchSegEndPos,corrdim; int tloc,tloc2,i,st,en,fraction; float vect[ENH_VECTL],corrVec[ENH_CORRDIM],maxv; float corrVecUps[ENH_CORRDIM*ENH_UPS0];

Andersen, et al.              Experimental                    [Page 113]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 113] RFC 3951 Internet Low Bit Rate Codec December 2004

       /* defining array bounds */

/* defining array bounds */

       estSegPosRounded=(int)(estSegPos - 0.5);

estSegPosRounded=(int)(estSegPos - 0.5);

       searchSegStartPos=estSegPosRounded-ENH_SLOP;

searchSegStartPos=estSegPosRounded-ENH_SLOP;

       if (searchSegStartPos<0) {
           searchSegStartPos=0;
       }
       searchSegEndPos=estSegPosRounded+ENH_SLOP;

if (searchSegStartPos<0) { searchSegStartPos=0; } searchSegEndPos=estSegPosRounded+ENH_SLOP;

       if (searchSegEndPos+ENH_BLOCKL >= idatal) {
           searchSegEndPos=idatal-ENH_BLOCKL-1;
       }
       corrdim=searchSegEndPos-searchSegStartPos+1;

if (searchSegEndPos+ENH_BLOCKL >= idatal) { searchSegEndPos=idatal-ENH_BLOCKL-1; } corrdim=searchSegEndPos-searchSegStartPos+1;

       /* compute upsampled correlation (corr33) and find
          location of max */

/* compute upsampled correlation (corr33) and find location of max */

       mycorr1(corrVec,idata+searchSegStartPos,
           corrdim+ENH_BLOCKL-1,idata+centerStartPos,ENH_BLOCKL);
       enh_upsample(corrVecUps,corrVec,corrdim,ENH_FL0);
       tloc=0; maxv=corrVecUps[0];
       for (i=1; i<ENH_UPS0*corrdim; i++) {

mycorr1(corrVec,idata+searchSegStartPos, corrdim+ENH_BLOCKL-1,idata+centerStartPos,ENH_BLOCKL); enh_upsample(corrVecUps,corrVec,corrdim,ENH_FL0); tloc=0; maxv=corrVecUps[0]; for (i=1; i<ENH_UPS0*corrdim; i++) {

           if (corrVecUps[i]>maxv) {
               tloc=i;
               maxv=corrVecUps[i];
           }
       }

if (corrVecUps[i]>maxv) { tloc=i; maxv=corrVecUps[i]; } }

       /* make vector can be upsampled without ever running outside
          bounds */

/* make vector can be upsampled without ever running outside bounds */

       *updStartPos= (float)searchSegStartPos +
           (float)tloc/(float)ENH_UPS0+(float)1.0;
       tloc2=(int)(tloc/ENH_UPS0);

*updStartPos= (float)searchSegStartPos + (float)tloc/(float)ENH_UPS0+(float)1.0; tloc2=(int)(tloc/ENH_UPS0);

       if (tloc>tloc2*ENH_UPS0) {
           tloc2++;
       }
       st=searchSegStartPos+tloc2-ENH_FL0;

if (tloc>tloc2*ENH_UPS0) { tloc2++; } st=searchSegStartPos+tloc2-ENH_FL0;

       if (st<0) {
           memset(vect,0,-st*sizeof(float));
           memcpy(&vect[-st],idata, (ENH_VECTL+st)*sizeof(float));
       }
       else {

if (st<0) { memset(vect,0,-st*sizeof(float)); memcpy(&vect[-st],idata, (ENH_VECTL+st)*sizeof(float)); } else {

Andersen, et al.              Experimental                    [Page 114]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 114] RFC 3951 Internet Low Bit Rate Codec December 2004

           en=st+ENH_VECTL;

en=st+ENH_VECTL;

           if (en>idatal) {
               memcpy(vect, &idata[st],
                   (ENH_VECTL-(en-idatal))*sizeof(float));
               memset(&vect[ENH_VECTL-(en-idatal)], 0,
                   (en-idatal)*sizeof(float));
           }
           else {
               memcpy(vect, &idata[st], ENH_VECTL*sizeof(float));
           }
       }
       fraction=tloc2*ENH_UPS0-tloc;

if (en>idatal) { memcpy(vect, &idata[st], (ENH_VECTL-(en-idatal))*sizeof(float)); memset(&vect[ENH_VECTL-(en-idatal)], 0, (en-idatal)*sizeof(float)); } else { memcpy(vect, &idata[st], ENH_VECTL*sizeof(float)); } } fraction=tloc2*ENH_UPS0-tloc;

       /* compute the segment (this is actually a convolution) */

/* compute the segment (this is actually a convolution) */

       mycorr1(seg,vect,ENH_VECTL,polyphaserTbl+(2*ENH_FL0+1)*fraction,
           2*ENH_FL0+1);
   }

mycorr1(seg,vect,ENH_VECTL,polyphaserTbl+(2*ENH_FL0+1)*fraction, 2*ENH_FL0+1); }

   /*----------------------------------------------------------------*
    * find the smoothed output data
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * find the smoothed output data *---------------------------------------------------------------*/

   void smath(
       float *odata,   /* (o) smoothed output */
       float *sseq,/* (i) said second sequence of waveforms */
       int hl,         /* (i) 2*hl+1 is sseq dimension */
       float alpha0/* (i) max smoothing energy fraction */
   ){
       int i,k;
       float w00,w10,w11,A,B,C,*psseq,err,errs;
       float surround[BLOCKL_MAX]; /* shape contributed by other than
                                      current */
       float wt[2*ENH_HL+1];       /* waveform weighting to get
                                      surround shape */
       float denom;

void smath( float *odata, /* (o) smoothed output */ float *sseq,/* (i) said second sequence of waveforms */ int hl, /* (i) 2*hl+1 is sseq dimension */ float alpha0/* (i) max smoothing energy fraction */ ){ int i,k; float w00,w10,w11,A,B,C,*psseq,err,errs; float surround[BLOCKL_MAX]; /* shape contributed by other than current */ float wt[2*ENH_HL+1]; /* waveform weighting to get surround shape */ float denom;

       /* create shape of contribution from all waveforms except the
          current one */

/* create shape of contribution from all waveforms except the current one */

       for (i=1; i<=2*hl+1; i++) {
           wt[i-1] = (float)0.5*(1 - (float)cos(2*PI*i/(2*hl+2)));
       }
       wt[hl]=0.0; /* for clarity, not used */
       for (i=0; i<ENH_BLOCKL; i++) {
           surround[i]=sseq[i]*wt[0];
       }

for (i=1; i<=2*hl+1; i++) { wt[i-1] = (float)0.5*(1 - (float)cos(2*PI*i/(2*hl+2))); } wt[hl]=0.0; /* for clarity, not used */ for (i=0; i<ENH_BLOCKL; i++) { surround[i]=sseq[i]*wt[0]; }

Andersen, et al.              Experimental                    [Page 115]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 115] RFC 3951 Internet Low Bit Rate Codec December 2004

       for (k=1; k<hl; k++) {
           psseq=sseq+k*ENH_BLOCKL;
           for(i=0;i<ENH_BLOCKL; i++) {
               surround[i]+=psseq[i]*wt[k];
           }
       }
       for (k=hl+1; k<=2*hl; k++) {
           psseq=sseq+k*ENH_BLOCKL;
           for(i=0;i<ENH_BLOCKL; i++) {
               surround[i]+=psseq[i]*wt[k];
           }
       }

for (k=1; k<hl; k++) { psseq=sseq+k*ENH_BLOCKL; for(i=0;i<ENH_BLOCKL; i++) { surround[i]+=psseq[i]*wt[k]; } } for (k=hl+1; k<=2*hl; k++) { psseq=sseq+k*ENH_BLOCKL; for(i=0;i<ENH_BLOCKL; i++) { surround[i]+=psseq[i]*wt[k]; } }

       /* compute some inner products */

/* compute some inner products */

       w00 = w10 = w11 = 0.0;
       psseq=sseq+hl*ENH_BLOCKL; /* current block  */
       for (i=0; i<ENH_BLOCKL;i++) {
           w00+=psseq[i]*psseq[i];
           w11+=surround[i]*surround[i];
           w10+=surround[i]*psseq[i];
       }

w00 = w10 = w11 = 0.0; psseq=sseq+hl*ENH_BLOCKL; /* current block */ for (i=0; i<ENH_BLOCKL;i++) { w00+=psseq[i]*psseq[i]; w11+=surround[i]*surround[i]; w10+=surround[i]*psseq[i]; }

       if (fabs(w11) < 1.0) {
           w11=1.0;
       }
       C = (float)sqrt( w00/w11);

if (fabs(w11) < 1.0) { w11=1.0; } C = (float)sqrt( w00/w11);

       /* first try enhancement without power-constraint */

/* first try enhancement without power-constraint */

       errs=0.0;
       psseq=sseq+hl*ENH_BLOCKL;
       for (i=0; i<ENH_BLOCKL; i++) {
           odata[i]=C*surround[i];
           err=psseq[i]-odata[i];
           errs+=err*err;
       }

errs=0.0; psseq=sseq+hl*ENH_BLOCKL; for (i=0; i<ENH_BLOCKL; i++) { odata[i]=C*surround[i]; err=psseq[i]-odata[i]; errs+=err*err; }

       /* if constraint violated by first try, add constraint */

/* if constraint violated by first try, add constraint */

       if (errs > alpha0 * w00) {
           if ( w00 < 1) {
               w00=1;
           }
           denom = (w11*w00-w10*w10)/(w00*w00);

if (errs > alpha0 * w00) { if ( w00 < 1) { w00=1; } denom = (w11*w00-w10*w10)/(w00*w00);

           if (denom > 0.0001) { /* eliminates numerical problems
                                    for if smooth */

if (denom > 0.0001) { /* eliminates numerical problems for if smooth */

Andersen, et al.              Experimental                    [Page 116]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 116] RFC 3951 Internet Low Bit Rate Codec December 2004

               A = (float)sqrt( (alpha0- alpha0*alpha0/4)/denom);
               B = -alpha0/2 - A * w10/w00;
               B = B+1;
           }
           else { /* essentially no difference between cycles;
                     smoothing not needed */
               A= 0.0;
               B= 1.0;
           }

A = (float)sqrt( (alpha0- alpha0*alpha0/4)/denom); B = -alpha0/2 - A * w10/w00; B = B+1; } else { /* essentially no difference between cycles; smoothing not needed */ A= 0.0; B= 1.0; }

           /* create smoothed sequence */

/* create smoothed sequence */

           psseq=sseq+hl*ENH_BLOCKL;
           for (i=0; i<ENH_BLOCKL; i++) {
               odata[i]=A*surround[i]+B*psseq[i];
           }
       }
   }

psseq=sseq+hl*ENH_BLOCKL; for (i=0; i<ENH_BLOCKL; i++) { odata[i]=A*surround[i]+B*psseq[i]; } } }

   /*----------------------------------------------------------------*
    * get the pitch-synchronous sample sequence
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * get the pitch-synchronous sample sequence *---------------------------------------------------------------*/

   void getsseq(
       float *sseq,    /* (o) the pitch-synchronous sequence */
       float *idata,       /* (i) original data */
       int idatal,         /* (i) dimension of data */
       int centerStartPos, /* (i) where current block starts */
       float *period,      /* (i) rough-pitch-period array */
       float *plocs,       /* (i) where periods of period array
                                  are taken */
       int periodl,    /* (i) dimension period array */
       int hl              /* (i) 2*hl+1 is the number of sequences */
   ){
       int i,centerEndPos,q;
       float blockStartPos[2*ENH_HL+1];
       int lagBlock[2*ENH_HL+1];
       float plocs2[ENH_PLOCSL];
       float *psseq;

void getsseq( float *sseq, /* (o) the pitch-synchronous sequence */ float *idata, /* (i) original data */ int idatal, /* (i) dimension of data */ int centerStartPos, /* (i) where current block starts */ float *period, /* (i) rough-pitch-period array */ float *plocs, /* (i) where periods of period array are taken */ int periodl, /* (i) dimension period array */ int hl /* (i) 2*hl+1 is the number of sequences */ ){ int i,centerEndPos,q; float blockStartPos[2*ENH_HL+1]; int lagBlock[2*ENH_HL+1]; float plocs2[ENH_PLOCSL]; float *psseq;

       centerEndPos=centerStartPos+ENH_BLOCKL-1;

centerEndPos=centerStartPos+ENH_BLOCKL-1;

       /* present */

/* present */

       NearestNeighbor(lagBlock+hl,plocs,
           (float)0.5*(centerStartPos+centerEndPos),periodl);

NearestNeighbor(lagBlock+hl,plocs, (float)0.5*(centerStartPos+centerEndPos),periodl);

       blockStartPos[hl]=(float)centerStartPos;

blockStartPos[hl]=(float)centerStartPos;

Andersen, et al.              Experimental                    [Page 117]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 117] RFC 3951 Internet Low Bit Rate Codec December 2004

       psseq=sseq+ENH_BLOCKL*hl;
       memcpy(psseq, idata+centerStartPos, ENH_BLOCKL*sizeof(float));

psseq=sseq+ENH_BLOCKL*hl; memcpy(psseq, idata+centerStartPos, ENH_BLOCKL*sizeof(float));

       /* past */

/* past */

       for (q=hl-1; q>=0; q--) {
           blockStartPos[q]=blockStartPos[q+1]-period[lagBlock[q+1]];
           NearestNeighbor(lagBlock+q,plocs,
               blockStartPos[q]+
               ENH_BLOCKL_HALF-period[lagBlock[q+1]], periodl);

for (q=hl-1; q>=0; q--) { blockStartPos[q]=blockStartPos[q+1]-period[lagBlock[q+1]]; NearestNeighbor(lagBlock+q,plocs, blockStartPos[q]+ ENH_BLOCKL_HALF-period[lagBlock[q+1]], periodl);

           if (blockStartPos[q]-ENH_OVERHANG>=0) {
               refiner(sseq+q*ENH_BLOCKL, blockStartPos+q, idata,
                   idatal, centerStartPos, blockStartPos[q],
                   period[lagBlock[q+1]]);
           } else {
               psseq=sseq+q*ENH_BLOCKL;
               memset(psseq, 0, ENH_BLOCKL*sizeof(float));
           }
       }

if (blockStartPos[q]-ENH_OVERHANG>=0) { refiner(sseq+q*ENH_BLOCKL, blockStartPos+q, idata, idatal, centerStartPos, blockStartPos[q], period[lagBlock[q+1]]); } else { psseq=sseq+q*ENH_BLOCKL; memset(psseq, 0, ENH_BLOCKL*sizeof(float)); } }

       /* future */

/* future */

       for (i=0; i<periodl; i++) {
           plocs2[i]=plocs[i]-period[i];
       }
       for (q=hl+1; q<=2*hl; q++) {
           NearestNeighbor(lagBlock+q,plocs2,
               blockStartPos[q-1]+ENH_BLOCKL_HALF,periodl);

for (i=0; i<periodl; i++) { plocs2[i]=plocs[i]-period[i]; } for (q=hl+1; q<=2*hl; q++) { NearestNeighbor(lagBlock+q,plocs2, blockStartPos[q-1]+ENH_BLOCKL_HALF,periodl);

           blockStartPos[q]=blockStartPos[q-1]+period[lagBlock[q]];
           if (blockStartPos[q]+ENH_BLOCKL+ENH_OVERHANG<idatal) {
               refiner(sseq+ENH_BLOCKL*q, blockStartPos+q, idata,
                   idatal, centerStartPos, blockStartPos[q],
                   period[lagBlock[q]]);
           }
           else {
               psseq=sseq+q*ENH_BLOCKL;
               memset(psseq, 0, ENH_BLOCKL*sizeof(float));
           }
       }
   }

blockStartPos[q]=blockStartPos[q-1]+period[lagBlock[q]]; if (blockStartPos[q]+ENH_BLOCKL+ENH_OVERHANG<idatal) { refiner(sseq+ENH_BLOCKL*q, blockStartPos+q, idata, idatal, centerStartPos, blockStartPos[q], period[lagBlock[q]]); } else { psseq=sseq+q*ENH_BLOCKL; memset(psseq, 0, ENH_BLOCKL*sizeof(float)); } } }

   /*----------------------------------------------------------------*
    * perform enhancement on idata+centerStartPos through
    * idata+centerStartPos+ENH_BLOCKL-1
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * perform enhancement on idata+centerStartPos through * idata+centerStartPos+ENH_BLOCKL-1 *---------------------------------------------------------------*/

Andersen, et al.              Experimental                    [Page 118]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 118] RFC 3951 Internet Low Bit Rate Codec December 2004

   void enhancer(
       float *odata,       /* (o) smoothed block, dimension blockl */
       float *idata,       /* (i) data buffer used for enhancing */
       int idatal,         /* (i) dimension idata */
       int centerStartPos, /* (i) first sample current block
                                  within idata */
       float alpha0,       /* (i) max correction-energy-fraction
                                 (in [0,1]) */
       float *period,      /* (i) pitch period array */
       float *plocs,       /* (i) locations where period array
                                  values valid */
       int periodl         /* (i) dimension of period and plocs */
   ){
       float sseq[(2*ENH_HL+1)*ENH_BLOCKL];

void enhancer( float *odata, /* (o) smoothed block, dimension blockl */ float *idata, /* (i) data buffer used for enhancing */ int idatal, /* (i) dimension idata */ int centerStartPos, /* (i) first sample current block within idata */ float alpha0, /* (i) max correction-energy-fraction (in [0,1]) */ float *period, /* (i) pitch period array */ float *plocs, /* (i) locations where period array values valid */ int periodl /* (i) dimension of period and plocs */ ){ float sseq[(2*ENH_HL+1)*ENH_BLOCKL];

       /* get said second sequence of segments */

/* get said second sequence of segments */

       getsseq(sseq,idata,idatal,centerStartPos,period,
           plocs,periodl,ENH_HL);

getsseq(sseq,idata,idatal,centerStartPos,period, plocs,periodl,ENH_HL);

       /* compute the smoothed output from said second sequence */

/* compute the smoothed output from said second sequence */

       smath(odata,sseq,ENH_HL,alpha0);

smath(odata,sseq,ENH_HL,alpha0);

   }

}

   /*----------------------------------------------------------------*
    * cross correlation
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * cross correlation *---------------------------------------------------------------*/

   float xCorrCoef(
       float *target,      /* (i) first array */
       float *regressor,   /* (i) second array */
       int subl        /* (i) dimension arrays */
   ){
       int i;
       float ftmp1, ftmp2;

float xCorrCoef( float *target, /* (i) first array */ float *regressor, /* (i) second array */ int subl /* (i) dimension arrays */ ){ int i; float ftmp1, ftmp2;

       ftmp1 = 0.0;
       ftmp2 = 0.0;
       for (i=0; i<subl; i++) {
           ftmp1 += target[i]*regressor[i];
           ftmp2 += regressor[i]*regressor[i];
       }

ftmp1 = 0.0; ftmp2 = 0.0; for (i=0; i<subl; i++) { ftmp1 += target[i]*regressor[i]; ftmp2 += regressor[i]*regressor[i]; }

       if (ftmp1 > 0.0) {
           return (float)(ftmp1*ftmp1/ftmp2);
       }

if (ftmp1 > 0.0) { return (float)(ftmp1*ftmp1/ftmp2); }

Andersen, et al.              Experimental                    [Page 119]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 119] RFC 3951 Internet Low Bit Rate Codec December 2004

       else {
           return (float)0.0;
       }
   }

else { return (float)0.0; } }

   /*----------------------------------------------------------------*
    * interface for enhancer
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * interface for enhancer *---------------------------------------------------------------*/

   int enhancerInterface(
       float *out,                     /* (o) enhanced signal */
       float *in,                      /* (i) unenhanced signal */
       iLBC_Dec_Inst_t *iLBCdec_inst   /* (i) buffers etc */
   ){
       float *enh_buf, *enh_period;
       int iblock, isample;
       int lag=0, ilag, i, ioffset;
       float cc, maxcc;
       float ftmp1, ftmp2;
       float *inPtr, *enh_bufPtr1, *enh_bufPtr2;
       float plc_pred[ENH_BLOCKL];

int enhancerInterface( float *out, /* (o) enhanced signal */ float *in, /* (i) unenhanced signal */ iLBC_Dec_Inst_t *iLBCdec_inst /* (i) buffers etc */ ){ float *enh_buf, *enh_period; int iblock, isample; int lag=0, ilag, i, ioffset; float cc, maxcc; float ftmp1, ftmp2; float *inPtr, *enh_bufPtr1, *enh_bufPtr2; float plc_pred[ENH_BLOCKL];

       float lpState[6], downsampled[(ENH_NBLOCKS*ENH_BLOCKL+120)/2];
       int inLen=ENH_NBLOCKS*ENH_BLOCKL+120;
       int start, plc_blockl, inlag;

float lpState[6], downsampled[(ENH_NBLOCKS*ENH_BLOCKL+120)/2]; int inLen=ENH_NBLOCKS*ENH_BLOCKL+120; int start, plc_blockl, inlag;

       enh_buf=iLBCdec_inst->enh_buf;
       enh_period=iLBCdec_inst->enh_period;

enh_buf=iLBCdec_inst->enh_buf; enh_period=iLBCdec_inst->enh_period;

       memmove(enh_buf, &enh_buf[iLBCdec_inst->blockl],
           (ENH_BUFL-iLBCdec_inst->blockl)*sizeof(float));

memmove(enh_buf, &enh_buf[iLBCdec_inst->blockl], (ENH_BUFL-iLBCdec_inst->blockl)*sizeof(float));

       memcpy(&enh_buf[ENH_BUFL-iLBCdec_inst->blockl], in,
           iLBCdec_inst->blockl*sizeof(float));

memcpy(&enh_buf[ENH_BUFL-iLBCdec_inst->blockl], in, iLBCdec_inst->blockl*sizeof(float));

       if (iLBCdec_inst->mode==30)
           plc_blockl=ENH_BLOCKL;
       else
           plc_blockl=40;

if (iLBCdec_inst->mode==30) plc_blockl=ENH_BLOCKL; else plc_blockl=40;

       /* when 20 ms frame, move processing one block */
       ioffset=0;
       if (iLBCdec_inst->mode==20) ioffset=1;

/* when 20 ms frame, move processing one block */ ioffset=0; if (iLBCdec_inst->mode==20) ioffset=1;

       i=3-ioffset;
       memmove(enh_period, &enh_period[i],
           (ENH_NBLOCKS_TOT-i)*sizeof(float));

i=3-ioffset; memmove(enh_period, &enh_period[i], (ENH_NBLOCKS_TOT-i)*sizeof(float));

Andersen, et al.              Experimental                    [Page 120]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 120] RFC 3951 Internet Low Bit Rate Codec December 2004

       /* Set state information to the 6 samples right before
          the samples to be downsampled. */

/* Set state information to the 6 samples right before the samples to be downsampled. */

       memcpy(lpState,
           enh_buf+(ENH_NBLOCKS_EXTRA+ioffset)*ENH_BLOCKL-126,
           6*sizeof(float));

memcpy(lpState, enh_buf+(ENH_NBLOCKS_EXTRA+ioffset)*ENH_BLOCKL-126, 6*sizeof(float));

       /* Down sample a factor 2 to save computations */

/* Down sample a factor 2 to save computations */

       DownSample(enh_buf+(ENH_NBLOCKS_EXTRA+ioffset)*ENH_BLOCKL-120,
                   lpFilt_coefsTbl, inLen-ioffset*ENH_BLOCKL,
                   lpState, downsampled);

DownSample(enh_buf+(ENH_NBLOCKS_EXTRA+ioffset)*ENH_BLOCKL-120, lpFilt_coefsTbl, inLen-ioffset*ENH_BLOCKL, lpState, downsampled);

       /* Estimate the pitch in the down sampled domain. */
       for (iblock = 0; iblock<ENH_NBLOCKS-ioffset; iblock++) {

/* Estimate the pitch in the down sampled domain. */ for (iblock = 0; iblock<ENH_NBLOCKS-ioffset; iblock++) {

           lag = 10;
           maxcc = xCorrCoef(downsampled+60+iblock*
               ENH_BLOCKL_HALF, downsampled+60+iblock*
               ENH_BLOCKL_HALF-lag, ENH_BLOCKL_HALF);
           for (ilag=11; ilag<60; ilag++) {
               cc = xCorrCoef(downsampled+60+iblock*
                   ENH_BLOCKL_HALF, downsampled+60+iblock*
                   ENH_BLOCKL_HALF-ilag, ENH_BLOCKL_HALF);

lag = 10; maxcc = xCorrCoef(downsampled+60+iblock* ENH_BLOCKL_HALF, downsampled+60+iblock* ENH_BLOCKL_HALF-lag, ENH_BLOCKL_HALF); for (ilag=11; ilag<60; ilag++) { cc = xCorrCoef(downsampled+60+iblock* ENH_BLOCKL_HALF, downsampled+60+iblock* ENH_BLOCKL_HALF-ilag, ENH_BLOCKL_HALF);

               if (cc > maxcc) {
                   maxcc = cc;
                   lag = ilag;
               }
           }

if (cc > maxcc) { maxcc = cc; lag = ilag; } }

           /* Store the estimated lag in the non-downsampled domain */
           enh_period[iblock+ENH_NBLOCKS_EXTRA+ioffset] = (float)lag*2;

/* Store the estimated lag in the non-downsampled domain */ enh_period[iblock+ENH_NBLOCKS_EXTRA+ioffset] = (float)lag*2;

       }

}

       /* PLC was performed on the previous packet */
       if (iLBCdec_inst->prev_enh_pl==1) {

/* PLC was performed on the previous packet */ if (iLBCdec_inst->prev_enh_pl==1) {

           inlag=(int)enh_period[ENH_NBLOCKS_EXTRA+ioffset];

inlag=(int)enh_period[ENH_NBLOCKS_EXTRA+ioffset];

           lag = inlag-1;
           maxcc = xCorrCoef(in, in+lag, plc_blockl);
           for (ilag=inlag; ilag<=inlag+1; ilag++) {
               cc = xCorrCoef(in, in+ilag, plc_blockl);

lag = inlag-1; maxcc = xCorrCoef(in, in+lag, plc_blockl); for (ilag=inlag; ilag<=inlag+1; ilag++) { cc = xCorrCoef(in, in+ilag, plc_blockl);

Andersen, et al.              Experimental                    [Page 121]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 121] RFC 3951 Internet Low Bit Rate Codec December 2004

               if (cc > maxcc) {
                   maxcc = cc;
                   lag = ilag;
               }
           }

if (cc > maxcc) { maxcc = cc; lag = ilag; } }

           enh_period[ENH_NBLOCKS_EXTRA+ioffset-1]=(float)lag;

enh_period[ENH_NBLOCKS_EXTRA+ioffset-1]=(float)lag;

           /* compute new concealed residual for the old lookahead,
              mix the forward PLC with a backward PLC from
              the new frame */

/* compute new concealed residual for the old lookahead, mix the forward PLC with a backward PLC from the new frame */

           inPtr=&in[lag-1];

inPtr=&in[lag-1];

           enh_bufPtr1=&plc_pred[plc_blockl-1];

enh_bufPtr1=&plc_pred[plc_blockl-1];

           if (lag>plc_blockl) {
               start=plc_blockl;
           } else {
               start=lag;
           }

if (lag>plc_blockl) { start=plc_blockl; } else { start=lag; }

           for (isample = start; isample>0; isample--) {
               *enh_bufPtr1-- = *inPtr--;
           }

for (isample = start; isample>0; isample--) { *enh_bufPtr1-- = *inPtr--; }

           enh_bufPtr2=&enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl];
           for (isample = (plc_blockl-1-lag); isample>=0; isample--) {
               *enh_bufPtr1-- = *enh_bufPtr2--;
           }

enh_bufPtr2=&enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl]; for (isample = (plc_blockl-1-lag); isample>=0; isample--) { *enh_bufPtr1-- = *enh_bufPtr2--; }

           /* limit energy change */
           ftmp2=0.0;
           ftmp1=0.0;
           for (i=0;i<plc_blockl;i++) {
               ftmp2+=enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl-i]*
                   enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl-i];
               ftmp1+=plc_pred[i]*plc_pred[i];
           }
           ftmp1=(float)sqrt(ftmp1/(float)plc_blockl);
           ftmp2=(float)sqrt(ftmp2/(float)plc_blockl);
           if (ftmp1>(float)2.0*ftmp2 && ftmp1>0.0) {
               for (i=0;i<plc_blockl-10;i++) {
                   plc_pred[i]*=(float)2.0*ftmp2/ftmp1;
               }
               for (i=plc_blockl-10;i<plc_blockl;i++) {
                   plc_pred[i]*=(float)(i-plc_blockl+10)*
                       ((float)1.0-(float)2.0*ftmp2/ftmp1)/(float)(10)+

/* limit energy change */ ftmp2=0.0; ftmp1=0.0; for (i=0;i<plc_blockl;i++) { ftmp2+=enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl-i]* enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl-i]; ftmp1+=plc_pred[i]*plc_pred[i]; } ftmp1=(float)sqrt(ftmp1/(float)plc_blockl); ftmp2=(float)sqrt(ftmp2/(float)plc_blockl); if (ftmp1>(float)2.0*ftmp2 && ftmp1>0.0) { for (i=0;i<plc_blockl-10;i++) { plc_pred[i]*=(float)2.0*ftmp2/ftmp1; } for (i=plc_blockl-10;i<plc_blockl;i++) { plc_pred[i]*=(float)(i-plc_blockl+10)* ((float)1.0-(float)2.0*ftmp2/ftmp1)/(float)(10)+

Andersen, et al.              Experimental                    [Page 122]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 122] RFC 3951 Internet Low Bit Rate Codec December 2004

                       (float)2.0*ftmp2/ftmp1;
               }
           }

(float)2.0*ftmp2/ftmp1; } }

           enh_bufPtr1=&enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl];
           for (i=0; i<plc_blockl; i++) {
               ftmp1 = (float) (i+1) / (float) (plc_blockl+1);
               *enh_bufPtr1 *= ftmp1;
               *enh_bufPtr1 += ((float)1.0-ftmp1)*
                                   plc_pred[plc_blockl-1-i];
               enh_bufPtr1--;
           }
       }

enh_bufPtr1=&enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl]; for (i=0; i<plc_blockl; i++) { ftmp1 = (float) (i+1) / (float) (plc_blockl+1); *enh_bufPtr1 *= ftmp1; *enh_bufPtr1 += ((float)1.0-ftmp1)* plc_pred[plc_blockl-1-i]; enh_bufPtr1--; } }

       if (iLBCdec_inst->mode==20) {
           /* Enhancer with 40 samples delay */
           for (iblock = 0; iblock<2; iblock++) {
               enhancer(out+iblock*ENH_BLOCKL, enh_buf,
                   ENH_BUFL, (5+iblock)*ENH_BLOCKL+40,
                   ENH_ALPHA0, enh_period, enh_plocsTbl,
                       ENH_NBLOCKS_TOT);
           }
       } else if (iLBCdec_inst->mode==30) {
           /* Enhancer with 80 samples delay */
           for (iblock = 0; iblock<3; iblock++) {
               enhancer(out+iblock*ENH_BLOCKL, enh_buf,
                   ENH_BUFL, (4+iblock)*ENH_BLOCKL,
                   ENH_ALPHA0, enh_period, enh_plocsTbl,
                       ENH_NBLOCKS_TOT);
           }
       }

if (iLBCdec_inst->mode==20) { /* Enhancer with 40 samples delay */ for (iblock = 0; iblock<2; iblock++) { enhancer(out+iblock*ENH_BLOCKL, enh_buf, ENH_BUFL, (5+iblock)*ENH_BLOCKL+40, ENH_ALPHA0, enh_period, enh_plocsTbl, ENH_NBLOCKS_TOT); } } else if (iLBCdec_inst->mode==30) { /* Enhancer with 80 samples delay */ for (iblock = 0; iblock<3; iblock++) { enhancer(out+iblock*ENH_BLOCKL, enh_buf, ENH_BUFL, (4+iblock)*ENH_BLOCKL, ENH_ALPHA0, enh_period, enh_plocsTbl, ENH_NBLOCKS_TOT); } }

       return (lag*2);
   }

return (lag*2); }

A.17.  filter.h

A.17. filter.h

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC Speech Coder ANSI-C Source Code

       filter.h

filter.h

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright (C) The Internet Society (2004). All Rights Reserved.

   ******************************************************************/

******************************************************************/

Andersen, et al.              Experimental                    [Page 123]

RFC 3951              Internet Low Bit Rate Codec          December 2004

Andersen, et al. Experimental [Page 123] RFC 3951 Internet Low Bit Rate Codec December 2004

   #ifndef __iLBC_FILTER_H
   #define __iLBC_FILTER_H

#ifndef __iLBC_FILTER_H #define __iLBC_FILTER_H

   void AllPoleFilter(
       float *InOut,   /* (i/o) on entrance InOut[-orderCoef] to
                              InOut[-1] contain the state of the
                              filter (delayed samples). InOut[0] to
                              InOut[lengthInOut-1] contain the filter
                              input, on en exit InOut[-orderCoef] to
                              InOut[-1] is unchanged and InOut[0] to
                              InOut[lengthInOut-1] contain filtered
                              samples */
       float *Coef,/* (i) filter coefficients, Coef[0] is assumed
                              to be 1.0 */
       int lengthInOut,/* (i) number of input/output samples */
       int orderCoef   /* (i) number of filter coefficients */
   );

void AllPoleFilter( float *InOut, /* (i/o) on entrance InOut[-orderCoef] to InOut[-1] contain the state of the filter (delayed samples). InOut[0] to InOut[lengthInOut-1] contain the filter input, on en exit InOut[-orderCoef] to InOut[-1] is unchanged and InOut[0] to InOut[lengthInOut-1] contain filtered samples */ float *Coef,/* (i) filter coefficients, Coef[0] is assumed to be 1.0 */ int lengthInOut,/* (i) number of input/output samples */ int orderCoef /* (i) number of filter coefficients */ );

   void AllZeroFilter(
       float *In,      /* (i) In[0] to In[lengthInOut-1] contain
                              filter input samples */
       float *Coef,/* (i) filter coefficients (Coef[0] is assumed
                              to be 1.0) */
       int lengthInOut,/* (i) number of input/output samples */
       int orderCoef,  /* (i) number of filter coefficients */
       float *Out      /* (i/o) on entrance Out[-orderCoef] to Out[-1]
                              contain the filter state, on exit Out[0]
                              to Out[lengthInOut-1] contain filtered
                              samples */
   );

空のAllZeroFilter(中の浮遊物の*、In[lengthInOut-1]への[0]の/*(i)はフィルタ入力サンプル*/浮遊物*係数を含んで、/*(i)フィルタ係数(係数[0]は1.0であると思われる)*/int lengthInOut、入力/出力サンプル*/int orderCoefの/*(i)番号、Out[-1]への入り口のOut[-orderCoef]のフィルタ係数*/浮遊物*アウト/*(入出力)の/*(i)番号はフィルタ状態を含んで、Out[lengthInOut-1]への出口Out[0]では、フィルターにかけることのサンプル*/を含んでください)。

   void ZeroPoleFilter(
       float *In,      /* (i) In[0] to In[lengthInOut-1] contain filter
                              input samples In[-orderCoef] to In[-1]
                              contain state of all-zero section */
       float *ZeroCoef,/* (i) filter coefficients for all-zero
                              section (ZeroCoef[0] is assumed to
                              be 1.0) */
       float *PoleCoef,/* (i) filter coefficients for all-pole section
                              (ZeroCoef[0] is assumed to be 1.0) */
       int lengthInOut,/* (i) number of input/output samples */
       int orderCoef,  /* (i) number of filter coefficients */
       float *Out      /* (i/o) on entrance Out[-orderCoef] to Out[-1]
                              contain state of all-pole section. On
                              exit Out[0] to Out[lengthInOut-1]
                              contain filtered samples */
   );

空のZeroPoleFilter( 中の*を浮かべてください、InlengthInOut-1へのIn0が含む/*(i)。In-1へのフィルタ入力サンプルIn-orderCoefはオールゼロセクション*/浮遊物の*ZeroCoefの州を含んでいます、オールゼロ部(ZeroCoef0は1.0であると思われる)の*/浮遊物の*PoleCoefのための/*(i)フィルタ係数; オールポール部分(ZeroCoef0は1.0であると思われる)*/int lengthInOutのための/*(i)フィルタ係数、入力/出力サンプル*/int orderCoefの/*(i)番号、Out-1への入り口のOut-orderCoefのフィルタ係数*/浮遊物*アウト/*(入出力)の/*(i)番号はオールポール部分の状態を含んでいます。 Out[lengthInOut-1]への出口Out[0]では、フィルターにかけることのサンプル*/を含んでください。);

Andersen, et al.              Experimental                    [Page 124]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[124ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   void DownSample (
       float  *In,     /* (i) input samples */
       float  *Coef,   /* (i) filter coefficients */
       int lengthIn,   /* (i) number of input samples */
       float  *state,  /* (i) filter state */
       float  *Out     /* (o) downsampled output */
   );

DownSampleを欠如させてください(中の*を浮かべてください、/*(i)入力サンプル*/浮遊物*係数、/*(i)フィルタ係数*/int lengthIn、入力サンプル*/浮遊物*状態の/*(i)番号、/*(i)フィルタ州の*/浮遊物*アウト/*(o)downsampled出力*/)。

   #endif

#endif

A.18.  filter.c

A.18filter.c

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       filter.c

filter.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #include "iLBC_define.h"

#「iLBC_define.h」を含めてください。

   /*----------------------------------------------------------------*
    *  all-pole filter
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * オールポールフィルタ*---------------------------------------------------------------*/

   void AllPoleFilter(
       float *InOut,   /* (i/o) on entrance InOut[-orderCoef] to
                              InOut[-1] contain the state of the
                              filter (delayed samples). InOut[0] to
                              InOut[lengthInOut-1] contain the filter
                              input, on en exit InOut[-orderCoef] to
                              InOut[-1] is unchanged and InOut[0] to
                              InOut[lengthInOut-1] contain filtered
                              samples */
       float *Coef,/* (i) filter coefficients, Coef[0] is assumed
                              to be 1.0 */
       int lengthInOut,/* (i) number of input/output samples */
       int orderCoef   /* (i) number of filter coefficients */
   ){
       int n,k;

浮遊物*のInOut、InOut[-1]への入り口のInOut[-orderCoef]の/*(入出力)はフィルタ(サンプルを遅らせる)の状態を含んでいます。AllPoleFilterを欠如させてください、(InOut[lengthInOut-1]へのInOut[0]はフィルタ入力を含んでいます、そして、アンでは、InOut[-1]への出口InOut[-orderCoef]は変わりがありません、そして、InOut[lengthInOut-1]へのInOut[0]はフィルターにかけることのサンプル*/浮遊物*係数を含んでいます、付番するCoef[0]が1.0が*/int lengthInOutであったなら入力/出力サンプル*/ int orderCoef /*(i)の/*(i)番号が思われるフィルタ係数*/の/*(i)フィルタ係数)int n、k。

       for(n=0;n<lengthInOut;n++){
           for(k=1;k<=orderCoef;k++){
               *InOut -= Coef[k]*InOut[-k];

(n=0; n<lengthInOut; n++)、(k=1; k<=orderCoef; k++)、*InOut-=係数[k]*InOut[-k]。

Andersen, et al.              Experimental                    [Page 125]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[125ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

           }
           InOut++;
       }
   }

} InOut++。 } }

   /*----------------------------------------------------------------*
    *  all-zero filter
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * オールゼロ・フィルタ*---------------------------------------------------------------*/

   void AllZeroFilter(
       float *In,      /* (i) In[0] to In[lengthInOut-1] contain
                              filter input samples */
       float *Coef,/* (i) filter coefficients (Coef[0] is assumed
                              to be 1.0) */
       int lengthInOut,/* (i) number of input/output samples */
       int orderCoef,  /* (i) number of filter coefficients */
       float *Out      /* (i/o) on entrance Out[-orderCoef] to Out[-1]
                              contain the filter state, on exit Out[0]
                              to Out[lengthInOut-1] contain filtered
                              samples */
   ){
       int n,k;

AllZeroFilterを欠如させてください、(中の浮遊物の*、In[lengthInOut-1]への[0]の/*(i)はフィルタ入力サンプル*/浮遊物*係数を含んで、/*(i)フィルタ係数(係数[0]は1.0であると思われる)*/int lengthInOut、入力/出力サンプル*/int orderCoefの/*(i)番号、Out[-1]への入り口のOut[-orderCoef]のフィルタ係数*/浮遊物*アウト/*(入出力)の/*(i)番号はフィルタ状態を含んで、Out[lengthInOut-1]への出口Out[0]では、フィルターにかけることのサンプル*/を含んでください)int n、k。

       for(n=0;n<lengthInOut;n++){
           *Out = Coef[0]*In[0];
           for(k=1;k<=orderCoef;k++){
               *Out += Coef[k]*In[-k];
           }
           Out++;
           In++;
       }
   }

(n=0; n<lengthInOut; n++)、[0]の*出かけている=係数[0]*;、(k=1; k<=orderCoef; k++) [-k]の*アウト+=係数[k]*; + + +の+から。

   /*----------------------------------------------------------------*
    *  pole-zero filter
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * ポールゼロ・フィルタ*---------------------------------------------------------------*/

   void ZeroPoleFilter(
       float *In,      /* (i) In[0] to In[lengthInOut-1] contain
                              filter input samples In[-orderCoef] to
                              In[-1] contain state of all-zero
                              section */
       float *ZeroCoef,/* (i) filter coefficients for all-zero
                              section (ZeroCoef[0] is assumed to
                              be 1.0) */
       float *PoleCoef,/* (i) filter coefficients for all-pole section
                              (ZeroCoef[0] is assumed to be 1.0) */
       int lengthInOut,/* (i) number of input/output samples */

ZeroPoleFilterを欠如させてください、(中の浮遊物の*、In[lengthInOut-1]への[0]の/*(i)が入力されるか、または出力されて、In[-1]へのIn[-orderCoef]がオールゼロセクション*/浮遊物の*ZeroCoefの州、オールゼロ部(ZeroCoef[0]は1.0であると思われる)の*/浮遊物の*PoleCoefのための/*(i)フィルタ係数、オールポール部分(ZeroCoef[0]は1.0であると思われる)*/int lengthInOutのための/*(i)フィルタ係数、/*(i)番号を含むフィルタ入力のサンプルを含んでいる、サンプル*/

Andersen, et al.              Experimental                    [Page 126]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[126ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       int orderCoef,  /* (i) number of filter coefficients */
       float *Out      /* (i/o) on entrance Out[-orderCoef] to Out[-1]
                              contain state of all-pole section. On
                              exit Out[0] to Out[lengthInOut-1]
                              contain filtered samples */
   ){
       AllZeroFilter(In,ZeroCoef,lengthInOut,orderCoef,Out);
       AllPoleFilter(Out,PoleCoef,lengthInOut,orderCoef);
   }

int orderCoef、Out[-1]への入り口のOut[-orderCoef]のフィルタ係数*/浮遊物*アウト/*(入出力)の/*(i)番号はオールポール部分の状態を含んでいます。 Out[lengthInOut-1]への出口Out[0]では、フィルターにかけることのサンプル*/を含んでください、)AllZeroFilter(コネ、ZeroCoef、lengthInOut、外のorderCoef)(AllPoleFilter(アウト、PoleCoef、lengthInOut、orderCoef))

   /*----------------------------------------------------------------*
    * downsample (LP filter and decimation)
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * downsample(LPフィルタと大量殺害)*---------------------------------------------------------------*/

   void DownSample (
       float  *In,     /* (i) input samples */
       float  *Coef,   /* (i) filter coefficients */
       int lengthIn,   /* (i) number of input samples */
       float  *state,  /* (i) filter state */
       float  *Out     /* (o) downsampled output */
   ){
       float   o;
       float *Out_ptr = Out;
       float *Coef_ptr, *In_ptr;
       float *state_ptr;
       int i, j, stop;

DownSampleを欠如させてください、(中の*を浮かべてください、/*(i)入力サンプル*/浮遊物*係数、/*(i)フィルタ係数*/int lengthIn、入力サンプル*/浮遊物*状態の/*(i)番号、/*(i)フィルタ州の*/浮遊物*アウト/*(o)downsampled出力*/)oを浮かべてください; 外に*出かけている_ptr=を浮かべてください; *係数_ptrを浮かべてください、_ptrの*; *状態_ptrを浮かべてください; int i、jは止まります。

       /* LP filter and decimate at the same time */

/*LPは同時に、*/をフィルターにかけて、多くを殺します。

       for (i = DELAY_DS; i < lengthIn; i+=FACTOR_DS)
       {
           Coef_ptr = &Coef[0];
           In_ptr = &In[i];
           state_ptr = &state[FILTERORDER_DS-2];

(i=DELAY_DS; i<lengthIn; i+=FACTOR_DS)、係数_ptr=とCoef[0]; _ptr=とIn[i]で; _ptr=と状態[FILTERORDER_DS-2]を述べてください。

           o = (float)0.0;

o = (浮遊物)0.0;

           stop = (i < FILTERORDER_DS) ? i + 1 : FILTERORDER_DS;

停止=(i<FILTERORDER_DS)?i+1: FILTERORDER_DS。

           for (j = 0; j < stop; j++)
           {
               o += *Coef_ptr++ * (*In_ptr--);
           }
           for (j = i + 1; j < FILTERORDER_DS; j++)
           {
               o += *Coef_ptr++ * (*state_ptr--);
           }

(j=0; j<停止; j++)、o+=*係数_ptr++*(*コネ_ptr--);、(j=i+1; j<FILTERORDER_DS; j++)o+=*係数_ptr++*(*_ptrを述べてください--)。

Andersen, et al.              Experimental                    [Page 127]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[127ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

           *Out_ptr++ = o;
       }

*_ptrから、+ +はoと等しいです。 }

       /* Get the last part (use zeros as input for the future) */

/*は最後の部分(未来に入力されるようにゼロを使用する)*/を得ます。

       for (i=(lengthIn+FACTOR_DS); i<(lengthIn+DELAY_DS);
               i+=FACTOR_DS) {

(i=(lengthIn+要素_DS); i<(_lengthIn+遅れDS); i+=要素_DS)

           o=(float)0.0;

o=(浮遊物)0.0;

           if (i<lengthIn) {
               Coef_ptr = &Coef[0];
               In_ptr = &In[i];
               for (j=0; j<FILTERORDER_DS; j++) {
                       o += *Coef_ptr++ * (*Out_ptr--);
               }
           } else {
               Coef_ptr = &Coef[i-lengthIn];
               In_ptr = &In[lengthIn-1];
               for (j=0; j<FILTERORDER_DS-(i-lengthIn); j++) {
                       o += *Coef_ptr++ * (*In_ptr--);
               }
           }
           *Out_ptr++ = o;
       }
   }

係数..係数..アウト..ほか..係数..係数..等しい } }

A.19.  FrameClassify.h

A.19。 FrameClassify.h

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       FrameClassify.h

FrameClassify.h

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #ifndef __iLBC_FRAMECLASSIFY_H
   #define __iLBC_FRAMECLASSIFY_H

#ifndef__iLBC_FRAMECLASSIFY_H#は__iLBC_FRAMECLASSIFY_Hを定義します。

   int FrameClassify(      /* index to the max-energy sub-frame */
       iLBC_Enc_Inst_t *iLBCenc_inst,
                           /* (i/o) the encoder state structure */
       float *residual     /* (i) lpc residual signal */
   );

int FrameClassify(/*は最大エネルギーサブフレーム*/iLBC_Enc_Inst_t*iLBCenc_inst、/*(入出力)にエンコーダ州の構造*/浮遊物*残差/*(i)lpc残差信号*/に索引をつけます)。

Andersen, et al.              Experimental                    [Page 128]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[128ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   #endif

#endif

A.20.  FrameClassify.c

A.20。 FrameClassify.c

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       FrameClassify.c

FrameClassify.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #include "iLBC_define.h"

#「iLBC_define.h」を含めてください。

   /*---------------------------------------------------------------*
    *  Classification of subframes to localize start state
    *--------------------------------------------------------------*/

/*---------------------------------------------------------------* * スタート状態*を局所化する「副-フレーム」の分類--------------------------------------------------------------*/

   int FrameClassify(      /* index to the max-energy sub-frame */
       iLBC_Enc_Inst_t *iLBCenc_inst,
                           /* (i/o) the encoder state structure */
       float *residual     /* (i) lpc residual signal */
   ) {
       float max_ssqEn, fssqEn[NSUB_MAX], bssqEn[NSUB_MAX], *pp;
       int n, l, max_ssqEn_n;
       const float ssqEn_win[NSUB_MAX-1]={(float)0.8,(float)0.9,
           (float)1.0,(float)0.9,(float)0.8};
       const float sampEn_win[5]={(float)1.0/(float)6.0,
           (float)2.0/(float)6.0, (float)3.0/(float)6.0,
           (float)4.0/(float)6.0, (float)5.0/(float)6.0};

int FrameClassify( /* index to the max-energy sub-frame */ iLBC_Enc_Inst_t *iLBCenc_inst, /* (i/o) the encoder state structure */ float *residual /* (i) lpc residual signal */ ) { float max_ssqEn, fssqEn[NSUB_MAX], bssqEn[NSUB_MAX], *pp; int n, l, max_ssqEn_n; const float ssqEn_win[NSUB_MAX-1]={(float)0.8,(float)0.9, (float)1.0,(float)0.9,(float)0.8}; const float sampEn_win[5]={(float)1.0/(float)6.0, (float)2.0/(float)6.0, (float)3.0/(float)6.0, (float)4.0/(float)6.0, (float)5.0/(float)6.0};

       /* init the front and back energies to zero */

/*イニットは*/のゼロを合わせる前の、そして、逆活力です。

       memset(fssqEn, 0, NSUB_MAX*sizeof(float));
       memset(bssqEn, 0, NSUB_MAX*sizeof(float));

memset(fssqEn、0、NSUB_最大*sizeof(浮かべます))。 memset(bssqEn、0、NSUB_最大*sizeof(浮かべます))。

       /* Calculate front of first seqence */

/*は最初に、seqence*/の前部について計算します。

       n=0;
       pp=residual;
       for (l=0; l<5; l++) {
           fssqEn[n] += sampEn_win[l] * (*pp) * (*pp);
           pp++;
       }
       for (l=5; l<SUBL; l++) {

n=0。 ppは残差と等しいです。 (l=5; l<SUBL; l++)(l=0; l<5; l++)fssqEn[n]+=sampEn_勝利[l]*(*pp)*(*pp)(pp++)

Andersen, et al.              Experimental                    [Page 129]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[129ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

           fssqEn[n] += (*pp) * (*pp);
           pp++;
       }

fssqEn[n]+=(*pp)*(*pp)。 pp++。 }

       /* Calculate front and back of all middle sequences */

/*はすべての中央系列*/について行き帰り前部について計算します。

       for (n=1; n<iLBCenc_inst->nsub-1; n++) {
           pp=residual+n*SUBL;
           for (l=0; l<5; l++) {
               fssqEn[n] += sampEn_win[l] * (*pp) * (*pp);
               bssqEn[n] += (*pp) * (*pp);
               pp++;
           }
           for (l=5; l<SUBL-5; l++) {
               fssqEn[n] += (*pp) * (*pp);
               bssqEn[n] += (*pp) * (*pp);
               pp++;
           }
           for (l=SUBL-5; l<SUBL; l++) {
               fssqEn[n] += (*pp) * (*pp);
               bssqEn[n] += sampEn_win[SUBL-l-1] * (*pp) * (*pp);
               pp++;
           }
       }

(n=1; n<の_のinst>のiLBCenc nsub-1; n++)のために{ pp=residual+n*SUBL; for (l=0; l<5; l++) { fssqEn[n] += sampEn_win[l] * (*pp) * (*pp); bssqEn[n] += (*pp) * (*pp); pp++; } for (l=5; l<SUBL-5; l++) { fssqEn[n] += (*pp) * (*pp); bssqEn[n] += (*pp) * (*pp); pp++; } for (l=SUBL-5; l<SUBL; l++) { fssqEn[n] += (*pp) * (*pp); bssqEn[n] += sampEn_win[SUBL-l-1] * (*pp) * (*pp); pp++; } }

       /* Calculate back of last seqence */

/*は最後のseqence*/について計算します。

       n=iLBCenc_inst->nsub-1;
       pp=residual+n*SUBL;
       for (l=0; l<SUBL-5; l++) {
           bssqEn[n] += (*pp) * (*pp);
           pp++;
       }
       for (l=SUBL-5; l<SUBL; l++) {
           bssqEn[n] += sampEn_win[SUBL-l-1] * (*pp) * (*pp);
           pp++;
       }

_のinst>のn=iLBCenc nsub-1。 ppは残差+n*SUBLと等しいです。 (l=SUBL-5; l<SUBL; l++)(l=0; l<SUBL-5; l++)bssqEn[n]+=(*pp)*(*pp)(pp++)のためにbssqEn[n]+=sampEn_は*(*pp)*(*pp)に勝ちます[SUBL l1]; pp++

       /* find the index to the weighted 80 sample with
          most energy */

/*はほとんどのエネルギー*/で荷重している80のサンプルにインデックスを見つけます。

       if (iLBCenc_inst->mode==20) l=1;
       else                        l=0;

(iLBCencの_のinst>のモード=20)l=1であるなら。 ほかのl=0。

       max_ssqEn=(fssqEn[0]+bssqEn[1])*ssqEn_win[l];
       max_ssqEn_n=1;
       for (n=2; n<iLBCenc_inst->nsub; n++) {

_ssqEn=に最大限にしてください。(fssqEn[0]+bssqEn[1])*ssqEn_は[l]に勝ちます。 _ssqEn=1に最大限にしてください。 (n=2; n<の_のinst>のiLBCenc nsub; n++)

Andersen, et al.              Experimental                    [Page 130]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[130ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

           l++;
           if ((fssqEn[n-1]+bssqEn[n])*ssqEn_win[l] > max_ssqEn) {
               max_ssqEn=(fssqEn[n-1]+bssqEn[n]) *
                               ssqEn_win[l];
               max_ssqEn_n=n;
           }
       }

l++。 _ssqEn=に最大限にしてください。(fssqEn[n-1]+bssqEn[n])*ssqEn_勝利[l]>最大_ssqEn)である、(fssqEn[n-1]+bssqEn[n])*ssqEn_は[l]に勝ちます;、_ssqEn=nに最大限にしてください。

       return max_ssqEn_n;
   }

最大_ssqEnを返してください。 }

A.21.  gainquant.h

A.21gainquant.h

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       gainquant.h

gainquant.h

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #ifndef __iLBC_GAINQUANT_H
   #define __iLBC_GAINQUANT_H

#ifndef__iLBC_GAINQUANT_H#は__iLBC_GAINQUANT_Hを定義します。

   float gainquant(/* (o) quantized gain value */
       float in,       /* (i) gain value */
       float maxIn,/* (i) maximum of gain value */
       int cblen,      /* (i) number of quantization indices */
       int *index      /* (o) quantization index */
   );

浮遊物のgainquant((o)が利得値*/浮遊物を量子化した/*、/*(i)利得値の*/浮遊物のmaxIn、利得値の*/int cblenの/*(i)最大、量子化インデックスリスト*/int*インデックス/*(o)量子化の/*(i)番号は*/に索引をつけます)。

   float gaindequant(  /* (o) quantized gain value */
       int index,      /* (i) quantization index */
       float maxIn,/* (i) maximum of unquantized gain */
       int cblen       /* (i) number of quantization indices */
   );

gaindequantを浮かべてください(利得値の*/intであると量子化された/*(o)は索引をつけます、/*(i)量子化インデックス*/浮遊物のmaxIn、非量子化された利得*/ int cblen /*(i)番号の量子化インデックスリスト*/の/*(i)最大)。

   #endif

#endif

A.22.  gainquant.c

A.22gainquant.c

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

Andersen, et al.              Experimental                    [Page 131]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[131ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       gainquant.c

gainquant.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #include <string.h>
   #include <math.h>
   #include "constants.h"
   #include "filter.h"

#<string.h>#インクルード<math.h>#インクルード"constants.h"#インクルード"filter.h"を含めてください。

   /*----------------------------------------------------------------*
    *  quantizer for the gain in the gain-shape coding of residual
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * 残差*の利得形のコード化における利得のための量子化器---------------------------------------------------------------*/

   float gainquant(/* (o) quantized gain value */
       float in,       /* (i) gain value */
       float maxIn,/* (i) maximum of gain value */
       int cblen,      /* (i) number of quantization indices */
       int *index      /* (o) quantization index */
   ){
       int i, tindex;
       float minmeasure,measure, *cb, scale;

gainquantを浮かべてください、(/*(o)は中で利得値*/浮遊物を量子化しました、/*(i)利得値の*/浮遊物のmaxIn、利得値の*/int cblenの/*(i)最大、量子化インデックスリスト*/int*インデックス/*(o)量子化インデックス*/の/*(i)番号)int i、tindex; minmeasureを浮かべてください、測定、*cb、スケール。

       /* ensure a lower bound on the scaling factor */

/*はけた移動子*/で下界を確実にします。

       scale=maxIn;

=maxInをスケーリングしてください。

       if (scale<0.1) {
           scale=(float)0.1;
       }

(スケール<0.1)です。スケール=(浮かべます)0.1。

       /* select the quantization table */

/*は量子化テーブル*/を選択します。

       if (cblen == 8) {
           cb = gain_sq3Tbl;
       } else if (cblen == 16) {
           cb = gain_sq4Tbl;
       } else  {
           cb = gain_sq5Tbl;
       }

(cblen=8)である、cb=利得_sq3Tbl;、ほか、(cblen=16)である、cb=利得_sq4Tbl;、ほかcb=利得_sq5Tbl。

       /* select the best index in the quantization table */

/*は量子化テーブル*/で最も良いインデックスを選択します。

       minmeasure=10000000.0;
       tindex=0;
       for (i=0; i<cblen; i++) {

minmeasure=10000000.0。 tindex=0。 (i=0; i<cblen; i++)

Andersen, et al.              Experimental                    [Page 132]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[132ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

           measure=(in-scale*cb[i])*(in-scale*cb[i]);

中で*cb[i])*をスケーリングしてください。=を測定してください、((中では、*cb[i])をスケーリングしてください。

           if (measure<minmeasure) {
               tindex=i;
               minmeasure=measure;
           }
       }
       *index=tindex;

minmeasureが測定と等しいという(<minmeasureを測定します)tindex=iです。 *=tindexに索引をつけてください。

       /* return the quantized value */

/*は量子化された値の*/を返します。

       return scale*cb[tindex];
   }

スケール*cb[tindex]を返してください。 }

   /*----------------------------------------------------------------*
    *  decoder for quantized gains in the gain-shape coding of
    *  residual
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * *残差*の利得形のコード化における量子化された利得のためのデコーダ---------------------------------------------------------------*/

   float gaindequant(  /* (o) quantized gain value */
       int index,      /* (i) quantization index */
       float maxIn,/* (i) maximum of unquantized gain */
       int cblen       /* (i) number of quantization indices */
   ){
       float scale;

gaindequantに浮いてください、(利得値の*/intであると量子化された/*(o)は索引をつけます、/*(i)量子化インデックス*/浮遊物のmaxIn、非量子化された利得*/ int cblen /*(i)番号の量子化インデックスリスト*/の/*(i)最大)スケールを浮かべてください。

       /* obtain correct scale factor */

/*は正しい位取り因数*/を得ます。

       scale=(float)fabs(maxIn);

=(浮かべる)fabs(maxIn)をスケーリングしてください。

       if (scale<0.1) {
           scale=(float)0.1;
       }

(スケール<0.1)です。スケール=(浮かべます)0.1。

       /* select the quantization table and return the decoded value */

/*は、量子化テーブルを選択して、解読された値の*/を返します。

       if (cblen==8) {
           return scale*gain_sq3Tbl[index];
       } else if (cblen==16) {
           return scale*gain_sq4Tbl[index];
       }
       else if (cblen==32) {
           return scale*gain_sq5Tbl[index];
       }

(cblen==8)である、リターンスケール*利得_sq3Tbl[インデックス];、ほか、(cblen==16)である、リターンスケール*利得_sq4Tbl[インデックス];、ほか、(cblen==32)です。リターンスケール*利得_sq5Tbl[インデックス]。

       return 0.0;
   }

リターン0.0。 }

Andersen, et al.              Experimental                    [Page 133]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[133ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

A.23.  getCBvec.h

A.23getCBvec.h

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       getCBvec.h

getCBvec.h

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #ifndef __iLBC_GETCBVEC_H
   #define __iLBC_GETCBVEC_H

#ifndef__iLBC_GETCBVEC_H#は__iLBC_GETCBVEC_Hを定義します。

   void getCBvec(
       float *cbvec,   /* (o) Constructed codebook vector */
       float *mem,     /* (i) Codebook buffer */
       int index,      /* (i) Codebook index */
       int lMem,       /* (i) Length of codebook buffer */
       int cbveclen/* (i) Codebook vector length */
   );

getCBvecを欠如させてください(浮遊物*cbvec、/*(o)は符号表ベクトル*/浮遊物の*memを組み立てました、/*(i)符号表バッファ*/intインデックス、/*(i)符号表インデックス*/int lMem、符号表バッファ*/ int cbveclen/*(i)符号表ベクトル長さ*/の/*(i)の長さ)。

   #endif

#endif

A.24.  getCBvec.c

A.24getCBvec.c

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       getCBvec.c

getCBvec.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #include "iLBC_define.h"
   #include "constants.h"
   #include <string.h>

##、が含む#、が含む「iLBC_define.h」"constants.h"<string.h>を含めてください。

   /*----------------------------------------------------------------*
    *  Construct codebook vector for given index.
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * 与えられたインデックスのために符号表ベクトルを構成してください。 *---------------------------------------------------------------*/

   void getCBvec(

getCBvecを欠如させてください、(

Andersen, et al.              Experimental                    [Page 134]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[134ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       float *cbvec,   /* (o) Constructed codebook vector */
       float *mem,     /* (i) Codebook buffer */
       int index,      /* (i) Codebook index */
       int lMem,       /* (i) Length of codebook buffer */
       int cbveclen/* (i) Codebook vector length */
   ){
       int j, k, n, memInd, sFilt;
       float tmpbuf[CB_MEML];
       int base_size;
       int ilow, ihigh;
       float alfa, alfa1;

浮遊物*のcbvec、/*(o)の組み立てられた符号表ベクトル*/浮遊物*memであって、/*(i)符号表バッファ*/intなインデックス、/*(i)符号表インデックス*/int lMem、/*(i)長さの符号表バッファ*/ int cbveclen/*(i)符号表ベクトル長さ*/)、int j、k、n、memInd sFilt; 浮遊物のtmpbuf[CB_MEML]; (intベース_サイズ(int ilow、ihigh))はalfaを浮かべます、alfa1。

       /* Determine size of codebook sections */

/*は符号表セクション*/のサイズを決定します。

       base_size=lMem-cbveclen+1;

ベース_サイズはlMem-cbveclen+1と等しいです。

       if (cbveclen==SUBL) {
           base_size+=cbveclen/2;
       }

(cbveclen==SUBL)です。ベース_サイズ+=cbveclen/2。

       /* No filter -> First codebook section */

/*いいえ、フィルタ->First符号表セクション*/

       if (index<lMem-cbveclen+1) {

(インデックス<lMem-cbveclen+1)です。

           /* first non-interpolated vectors */

/*最初の非補間されたベクトル*/

           k=index+cbveclen;
           /* get vector */
           memcpy(cbvec, mem+lMem-k, cbveclen*sizeof(float));

kはインデックス+cbveclenと等しいです。 /*はベクトル*/memcpyを得ます(cbvec、mem+lMem-kは*sizeofをcbveclenします(浮いてください))。

       } else if (index < base_size) {

ほか、(インデックス<ベース_サイズ)です。

           k=2*(index-(lMem-cbveclen+1))+cbveclen;

+ k=2*((lMem-cbveclen+1)に索引をつける)cbveclen。

           ihigh=k/2;
           ilow=ihigh-5;

ihigh=k/2。 ilow=ihigh-5。

           /* Copy first noninterpolated part */

最初に非補間された/*コピーは*/を分けます。

           memcpy(cbvec, mem+lMem-k/2, ilow*sizeof(float));

memcpy(cbvec、mem+lMem-k/2、ilow*sizeof(浮かべます))。

           /* interpolation */

/*挿入*/

           alfa1=(float)0.2;
           alfa=0.0;
           for (j=ilow; j<ihigh; j++) {
               cbvec[j]=((float)1.0-alfa)*mem[lMem-k/2+j]+
                   alfa*mem[lMem-k+j];

alfa1は0.2と等しいです(浮かべます)。 alfa=0.0。 (j=ilow; j<ihigh; j++)、cbvec[j]=((浮遊物)1.0-alfa)*mem[lMem-k/2+j]+alfa*mem[lMem-k+j]。

Andersen, et al.              Experimental                    [Page 135]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[135ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

               alfa+=alfa1;
           }

alfa+=alfa1。 }

           /* Copy second noninterpolated part */

2番目に、非補間された/*コピーは*/を分けます。

           memcpy(cbvec+ihigh, mem+lMem-k+ihigh,
               (cbveclen-ihigh)*sizeof(float));

memcpy(cbvec+ihigh、mem+lMem-k+ihigh、(cbveclen-ihigh)*sizeof(浮かべます))。

       }

}

       /* Higher codebook section based on filtering */

*/をフィルターにかけるのであることに基づいた/*より高い符号表部

       else {

ほか

           /* first non-interpolated vectors */

/*最初の非補間されたベクトル*/

           if (index-base_size<lMem-cbveclen+1) {
               float tempbuff2[CB_MEML+CB_FILTERLEN+1];
               float *pos;
               float *pp, *pp1;

(インデックスベース_サイズ<lMem-cbveclen+1)である、tempbuff2[CB_MEML+CB_FILTERLEN+1]を浮かべてください; *posを浮かべてください; *pp、*pp1を浮かべてください。

               memset(tempbuff2, 0,
                   CB_HALFFILTERLEN*sizeof(float));
               memcpy(&tempbuff2[CB_HALFFILTERLEN], mem,
                   lMem*sizeof(float));
               memset(&tempbuff2[lMem+CB_HALFFILTERLEN], 0,
                   (CB_HALFFILTERLEN+1)*sizeof(float));

memset(tempbuff2、0、CB_HALFFILTERLEN*sizeof(浮かべます))。 memcpy(tempbuff2[CB_HALFFILTERLEN]、mem、lMem*sizeof(浮かべます))。 memset(tempbuff2[lMem+CB_HALFFILTERLEN]、0、(CB_HALFFILTERLEN+1)*sizeof(浮かべます))。

               k=index-base_size+cbveclen;
               sFilt=lMem-k;
               memInd=sFilt+1-CB_HALFFILTERLEN;

kはインデックスベース_サイズ+cbveclenと等しいです。 sFilt=lMem-k。 memInd=sFilt+1CB_HALFFILTERLEN。

               /* do filtering */
               pos=cbvec;
               memset(pos, 0, cbveclen*sizeof(float));
               for (n=0; n<cbveclen; n++) {
                   pp=&tempbuff2[memInd+n+CB_HALFFILTERLEN];
                   pp1=&cbfiltersTbl[CB_FILTERLEN-1];
                   for (j=0; j<CB_FILTERLEN; j++) {
                       (*pos)+=(*pp++)*(*pp1--);
                   }
                   pos++;
               }
           }

/*はフィルタリング*/pos=cbvecをします。 memset(pos、0は*sizeofをcbveclenします(浮いてください))。 (n=0; n<cbveclen; n++)、(j=0; j<CB_FILTERLEN; j++)のためのpp=とtempbuff2[memInd+n+CB_HALFFILTERLEN](pp1=とcbfiltersTbl[CB_FILTERLEN-1])、(*pos) + =(*pp++)*(*pp1--);、pos++。

           /* interpolated vectors */

/*はベクトル*/を補間しました。

           else {

ほか

Andersen, et al.              Experimental                    [Page 136]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[136ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

               float tempbuff2[CB_MEML+CB_FILTERLEN+1];

tempbuff2[CB_MEML+CB_FILTERLEN+1]を浮かべてください。

               float *pos;
               float *pp, *pp1;
               int i;

*posを浮かべてください。 *pp、*pp1を浮かべてください。 int i。

               memset(tempbuff2, 0,
                   CB_HALFFILTERLEN*sizeof(float));
               memcpy(&tempbuff2[CB_HALFFILTERLEN], mem,
                   lMem*sizeof(float));
               memset(&tempbuff2[lMem+CB_HALFFILTERLEN], 0,
                   (CB_HALFFILTERLEN+1)*sizeof(float));

memset(tempbuff2、0、CB_HALFFILTERLEN*sizeof(浮かべます))。 memcpy(tempbuff2[CB_HALFFILTERLEN]、mem、lMem*sizeof(浮かべます))。 memset(tempbuff2[lMem+CB_HALFFILTERLEN]、0、(CB_HALFFILTERLEN+1)*sizeof(浮かべます))。

               k=2*(index-base_size-
                   (lMem-cbveclen+1))+cbveclen;
               sFilt=lMem-k;
               memInd=sFilt+1-CB_HALFFILTERLEN;

_サイズをインデックスで基礎づけてください。k=2*、(-(lMem-cbveclen+1)+はcbveclenされます。 sFilt=lMem-k。 memInd=sFilt+1CB_HALFFILTERLEN。

               /* do filtering */
               pos=&tmpbuf[sFilt];
               memset(pos, 0, k*sizeof(float));
               for (i=0; i<k; i++) {
                   pp=&tempbuff2[memInd+i+CB_HALFFILTERLEN];
                   pp1=&cbfiltersTbl[CB_FILTERLEN-1];
                   for (j=0; j<CB_FILTERLEN; j++) {
                       (*pos)+=(*pp++)*(*pp1--);
                   }
                   pos++;
               }

/*はフィルタリング*/pos=とtmpbuf[sFilt]をします。 memset(pos、0、k*sizeof(浮かべます))。 (i=0; i<k; i++)のために(j=0; j<CB_FILTERLEN; j++)のためのpp=とtempbuff2[+ memInd+i CB_HALFFILTERLEN](pp1=とcbfiltersTbl[CB_FILTERLEN-1])、(*pos) + =(*pp++)*(*pp1--);、pos++。

               ihigh=k/2;
               ilow=ihigh-5;

ihigh=k/2。 ilow=ihigh-5。

               /* Copy first noninterpolated part */

最初に非補間された/*コピーは*/を分けます。

               memcpy(cbvec, tmpbuf+lMem-k/2,
                   ilow*sizeof(float));

memcpy(cbvec、tmpbuf+lMem-k/2、ilow*sizeof(浮かべます))。

               /* interpolation */

/*挿入*/

               alfa1=(float)0.2;
               alfa=0.0;
               for (j=ilow; j<ihigh; j++) {
                   cbvec[j]=((float)1.0-alfa)*
                       tmpbuf[lMem-k/2+j]+alfa*tmpbuf[lMem-k+j];
                   alfa+=alfa1;
               }

alfa1は0.2と等しいです(浮かべます)。 alfa=0.0。 (j=ilow; j<ihigh; j++)のためにcbvec[j]は*tmpbuf[lMem-k/2+j]+alfa*tmpbuf[lMem-k+j](alfa+=alfa1)と等しいです((浮遊物)1.0-alfa)。

Andersen, et al.              Experimental                    [Page 137]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[137ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

               /* Copy second noninterpolated part */

2番目に、非補間された/*コピーは*/を分けます。

               memcpy(cbvec+ihigh, tmpbuf+lMem-k+ihigh,
                   (cbveclen-ihigh)*sizeof(float));
           }
       }
   }

memcpy(cbvec+ihigh、tmpbuf+lMem-k+ihigh、(cbveclen-ihigh)*sizeof(浮かべます))。 } } }

A.25.  helpfun.h

A.25helpfun.h

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       helpfun.h

helpfun.h

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #ifndef __iLBC_HELPFUN_H
   #define __iLBC_HELPFUN_H

#ifndef__iLBC_HELPFUN_H#は__iLBC_HELPFUN_Hを定義します。

   void autocorr(
       float *r,       /* (o) autocorrelation vector */
       const float *x, /* (i) data vector */
       int N,          /* (i) length of data vector */
       int order       /* largest lag for calculated
                          autocorrelations */
   );

autocorrを欠如させてください(*rを浮かべてください、/*(o)自己相関ベクトル*/const浮遊物*x、/*(i)データベクトル*/int N、計算された自己相関*/のためのデータベクトル*/intオーダー/*最も大きい立ち遅れの/*(i)の長さ)。

   void window(
       float *z,       /* (o) the windowed data */
       const float *x, /* (i) the original data vector */
       const float *y, /* (i) the window */
       int N           /* (i) length of all vectors */
   );

空の窓、(浮遊物*z、オリジナルのデータベクトル*/がconstする/*(o)窓を付けられたデータ*/constな浮遊物の*x、/*(i)は*yを浮かべます、窓*/がN/*(i)長さをintする/*(i)、すべてのベクトル*/)、。

   void levdurb(
       float *a,       /* (o) lpc coefficient vector starting
                              with 1.0 */
       float *k,       /* (o) reflection coefficients */
       float *r,       /* (i) autocorrelation vector */
       int order       /* (i) order of lpc filter */
   );

levdurb(浮遊物*a、/*(o)は1.0*/浮遊物*のkから始まる係数ベクトルをlpcします、/*(o)反射率*/浮遊物の*r、lpcフィルタ*/の/*(i)自己相関ベクトル*/intオーダー/*(i)注文)を欠如させてください。

   void interpolate(

空間が補間する、(

Andersen, et al.              Experimental                    [Page 138]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[138ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

       float *out,     /* (o) the interpolated vector */
       float *in1,     /* (i) the first vector for the
                              interpolation */
       float *in2,     /* (i) the second vector for the
                              interpolation */
       float coef,     /* (i) interpolation weights */
       int length      /* (i) length of all vectors */
   );

外に*を浮かべてください、/*(o)補間されたベクトル*/浮遊物の*in1、/、*(i) 挿入*/のための最初のベクトルは*in2を浮かべます、挿入*/のための2番目のベクトルが係数、/*(i)挿入重り*/intな長さ/*(i)長さを浮かべる/*(i)、すべてのベクトル*/)、。

   void bwexpand(
       float *out,     /* (o) the bandwidth expanded lpc
                              coefficients */
       float *in,      /* (i) the lpc coefficients before bandwidth
                              expansion */
       float coef,     /* (i) the bandwidth expansion factor */
       int length      /* (i) the length of lpc coefficient vectors */
   );

外に*を浮かべてください、/*(o)*中の帯域幅の拡張lpc係数*/浮遊物、/*。bwexpandを欠如させてください、((i) 帯域幅拡大*/の前のlpc係数が係数を浮かべる、/、*(i) 帯域幅拡大が(i) lpc係数ベクトル*/の長さの*/int長さ/*を因数分解する、)、。

   void vq(
       float *Xq,      /* (o) the quantized vector */
       int *index,     /* (o) the quantization index */
       const float *CB,/* (i) the vector quantization codebook */
       float *X,       /* (i) the vector to quantize */
       int n_cb,       /* (i) the number of vectors in the codebook */
       int dim         /* (i) the dimension of all vectors */
   );

量子化されたベクトル*/int*は索引をつけて、/*(o)量子化インデックス*/const浮遊物*CB、/*(i)はベクトル量子化符号表*/浮遊物の*Xです、/。vqを欠如させてください、(*Xqを浮かべてください、/*(o)、*(i) */int nが_であると量子化するベクトルがcbされる、/*、(i) ベクトルの数、intに符号表*/薄暗い/*(i)のすべてのベクトル*/の寸法)、。

   void SplitVQ(
       float *qX,      /* (o) the quantized vector */
       int *index,     /* (o) a vector of indexes for all vector
                              codebooks in the split */
       float *X,       /* (i) the vector to quantize */
       const float *CB,/* (i) the quantizer codebook */
       int nsplit,     /* the number of vector splits */
       const int *dim, /* the dimension of X and qX */
       const int *cbsize /* the number of vectors in the codebook */
   );

SplitVQを欠如させてください、(浮遊物*qX、量子化されたベクトル*/が*インデックス、/*(o)aベクトルをintする/*(o)はすべてのベクトル符号表のために*/const浮遊物*のCB、/*(i)が量子化器符号表*/int nsplitであると量子化する分裂*/浮遊物の*X、/*(i)のベクトルに索引をつけます、ベクトル股割り*/const int*の数が薄暗くする/*、XとqX*/const int*の寸法がcbsizeする/*、/*、符号表*/のベクトルの数)、。

   void sort_sq(
       float *xq,      /* (o) the quantized value */
       int *index,     /* (o) the quantization index */
       float x,    /* (i) the value to quantize */
       const float *cb,/* (i) the quantization codebook */
       int cb_size     /* (i) the size of the quantization codebook */
   );

種類_sqを欠如させてください、(浮遊物、*がxqされて、/*(o)が量子化された値の*/int*インデックスであり、/*(o)量子化インデックス*/浮遊物のx、/*(i)が*/const浮遊物*のcb、/*(i)が(i) 量子化符号表*/のサイズの量子化符号表*/int cb_サイズ/*であると量子化する値である、)、。

   int LSF_check(      /* (o) 1 for stable lsf vectors and 0 for

int LSF_チェック、(うまやへの/*(o)1はベクトルと0をlsfします。

Andersen, et al.              Experimental                    [Page 139]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[139ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

                              nonstable ones */
       float *lsf,     /* (i) a table of lsf vectors */
       int dim,    /* (i) the dimension of each lsf vector */
       int NoAn    /* (i) the number of lsf vectors in the
                              table */
   );

非安定もの*/浮遊物の*lsf、ベクトル*/intが薄暗くするlsf、/*(i)のそれぞれのlsfベクトル*/ int NoAn /*(i)の寸法の/*(i)aテーブル、テーブル*/のlsfベクトルの数)、。

   #endif

#endif

A.26.  helpfun.c

A.26helpfun.c

   /******************************************************************

/******************************************************************

       iLBC Speech Coder ANSI-C Source Code

iLBC音声符号器ANSI-Cソースコード

       helpfun.c

helpfun.c

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

Copyright(C)インターネット協会(2004)。 All rights reserved。

   ******************************************************************/

******************************************************************/

   #include <math.h>

#<math.h>を含めてください。

   #include "iLBC_define.h"
   #include "constants.h"

##、が含む「iLBC_define.h」"constants.h"を含めてください。

   /*----------------------------------------------------------------*
    *  calculation of auto correlation
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * 自動相関関係*の計算---------------------------------------------------------------*/

   void autocorr(
       float *r,       /* (o) autocorrelation vector */
       const float *x, /* (i) data vector */
       int N,          /* (i) length of data vector */
       int order       /* largest lag for calculated
                          autocorrelations */
   ){
       int     lag, n;
       float   sum;

autocorrを欠如させてください、(*rを浮かべてください、/*(o)自己相関ベクトル*/const浮遊物*x、/*(i)データベクトル*/int N、計算された自己相関*/のためのデータベクトル*/intなオーダー/*最も大きい立ち遅れの/*(i)の長さ)int立ち遅れ、n; 合計を浮かべてください。

       for (lag = 0; lag <= order; lag++) {
           sum = 0;
           for (n = 0; n < N - lag; n++) {
               sum += x[n] * x[n+lag];
           }
           r[lag] = sum;
       }

(立ち遅れ=0; 立ち遅れ<=オーダー; 立ち遅れ++)のために合計+=x[n]*x[n+立ち遅れ]; (n=0;n<N--立ち遅れ; n++)r[立ち遅れ]=合計のための合計=0

Andersen, et al.              Experimental                    [Page 140]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[140ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

   }

}

   /*----------------------------------------------------------------*
    *  window multiplication
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * 窓の乗法*---------------------------------------------------------------*/

   void window(
       float *z,       /* (o) the windowed data */
       const float *x, /* (i) the original data vector */
       const float *y, /* (i) the window */
       int N           /* (i) length of all vectors */
   ){
       int     i;

空の窓、(浮遊物*z、オリジナルのデータベクトル*/がconstする/*(o)窓を付けられたデータ*/constな浮遊物の*x、/*(i)は*yを浮かべます、窓*/がN/*(i)長さをintする/*(i)、すべてのベクトル*/)、int i。

       for (i = 0; i < N; i++) {
           z[i] = x[i] * y[i];
       }
   }

(i=0; i<N; i++)、z[i]=x[i]*y[i]。

   /*----------------------------------------------------------------*
    *  levinson-durbin solution for lpc coefficients
    *---------------------------------------------------------------*/

/*----------------------------------------------------------------* * lpc係数*のlevinson-durbin解決---------------------------------------------------------------*/

   void levdurb(
       float *a,       /* (o) lpc coefficient vector starting
                              with 1.0 */
       float *k,       /* (o) reflection coefficients */
       float *r,       /* (i) autocorrelation vector */
       int order       /* (i) order of lpc filter */
   ){
       float  sum, alpha;
       int     m, m_h, i;

levdurb(浮遊物*a、/*(o)は1.0*/浮遊物*のkから始まる係数ベクトルをlpcします、/*(o)反射率*/浮遊物の*r、lpcフィルタ*/の/*(i)自己相関ベクトル*/intオーダー/*(i)注文)を欠如させてください、合計を浮かべてください、アルファ; int m、m_h、i

       a[0] = 1.0;

a[0]は1.0と等しいです。

       if (r[0] < EPS) { /* if r[0] <= 0, set LPC coeff. to zero */
           for (i = 0; i < order; i++) {
               k[i] = 0;
               a[i+1] = 0;
           }
       } else {
           a[1] = k[0] = -r[1]/r[0];
           alpha = r[0] + r[1] * k[0];
           for (m = 1; m < order; m++){
               sum = r[m + 1];
               for (i = 0; i < m; i++){
                   sum += a[i+1] * r[m - i];
               }

/は*r[0]<であるなら0、セットLPC coeffと等しいです。(r[0]<EPS) k[i]は0と等しいです; (i=0; i<オーダー; i++)のための*/のゼロを合わせるためには、a[i+1]=0、ほか、a[1]=k[0]は-r[1]/r[0]と等しいです; (m=1; m<オーダー; m++)アルファ=r[0]+r[1]*k[0]、(i=0; i<m; i++)のために、=r[m+1]をまとめてください。[i+1]合計+=*r[m--i]。

Andersen, et al.              Experimental                    [Page 141]

RFC 3951              Internet Low Bit Rate Codec          December 2004

アンダーセン、他 低い[141ページ]実験的なRFC3951インターネットビット伝送速度コーデック2004年12月

一覧

 RFC 1〜100  RFC 1401〜1500  RFC 2801〜2900  RFC 4201〜4300 
 RFC 101〜200  RFC 1501〜1600  RFC 2901〜3000  RFC 4301〜4400 
 RFC 201〜300  RFC 1601〜1700  RFC 3001〜3100  RFC 4401〜4500 
 RFC 301〜400  RFC 1701〜1800  RFC 3101〜3200  RFC 4501〜4600 
 RFC 401〜500  RFC 1801〜1900  RFC 3201〜3300  RFC 4601〜4700 
 RFC 501〜600  RFC 1901〜2000  RFC 3301〜3400  RFC 4701〜4800 
 RFC 601〜700  RFC 2001〜2100  RFC 3401〜3500  RFC 4801〜4900 
 RFC 701〜800  RFC 2101〜2200  RFC 3501〜3600  RFC 4901〜5000 
 RFC 801〜900  RFC 2201〜2300  RFC 3601〜3700  RFC 5001〜5100 
 RFC 901〜1000  RFC 2301〜2400  RFC 3701〜3800  RFC 5101〜5200 
 RFC 1001〜1100  RFC 2401〜2500  RFC 3801〜3900  RFC 5201〜5300 
 RFC 1101〜1200  RFC 2501〜2600  RFC 3901〜4000  RFC 5301〜5400 
 RFC 1201〜1300  RFC 2601〜2700  RFC 4001〜4100  RFC 5401〜5500 
 RFC 1301〜1400  RFC 2701〜2800  RFC 4101〜4200 

スポンサーリンク

unregister_modifier() 動的に登録された変数の修飾子プラグインを未登録にします

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る