ltp.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:11k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * FAAC - Freeware Advanced Audio Coder
  3.  * Copyright (C) 2001 Menno Bakker
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  * $Id: ltp.c,v 1.3 2001/06/04 23:02:24 wmay Exp $
  19.  */
  20. #include <stdio.h>
  21. #include <math.h>
  22. #include "frame.h"
  23. #include "coder.h"
  24. #include "ltp.h"
  25. #include "tns.h"
  26. #include "filtbank.h"
  27. #include "util.h"
  28. /* short double_to_int(double sig_in); */
  29. #define double_to_int(sig_in) 
  30.    ((sig_in) > 32767 ? 32767 : ( 
  31.    (sig_in) < -32768 ? -32768 : (sig_in)))
  32. /*  Purpose: Codebook for LTP weight coefficients.  */
  33. static double codebook[CODESIZE] =
  34. {
  35. 0.570829,
  36. 0.696616,
  37. 0.813004,
  38. 0.911304,
  39. 0.984900,
  40. 1.067894,
  41. 1.194601,
  42. 1.369533
  43. };
  44. static double snr_pred(double *mdct_in, double *mdct_pred, int *sfb_flag, int *sfb_offset,
  45. int block_type, int side_info, int num_of_sfb)
  46. {
  47. int i, j, flen;
  48. double snr_limit;
  49. double num_bit, snr[NSFB_LONG];
  50. double temp1, temp2;
  51. double energy[BLOCK_LEN_LONG], snr_p[BLOCK_LEN_LONG];
  52. if (block_type != ONLY_SHORT_WINDOW)
  53.     {
  54. flen = BLOCK_LEN_LONG;
  55. snr_limit = 1.e-30;
  56.     } else {
  57. flen = BLOCK_LEN_SHORT;
  58. snr_limit = 1.e-20;
  59.     }
  60. for (i = 0; i < flen; i++)
  61.     {
  62. energy[i] = mdct_in[i] * mdct_in[i];
  63. snr_p[i] = (mdct_in[i] - mdct_pred[i]) * (mdct_in[i] - mdct_pred[i]);
  64.     }
  65. num_bit = 0.0;
  66. for (i = 0; i < num_of_sfb; i++)
  67.     {
  68. temp1 = 0.0;
  69. temp2 = 0.0;
  70. for (j = sfb_offset[i]; j < sfb_offset[i + 1]; j++)
  71. {
  72. temp1 += energy[j];
  73. temp2 += snr_p[j];
  74. }
  75. if (temp2 < snr_limit)
  76. temp2 = snr_limit;
  77. if (temp1 > 1.e-20)
  78. snr[i] = -10. * log10 (temp2 / temp1);
  79. else
  80. snr[i] = 0.0;
  81. sfb_flag[i] = 1;
  82. if (block_type != ONLY_SHORT_WINDOW)
  83. {
  84. if (snr[i] <= 0.0)
  85. {
  86. sfb_flag[i] = 0;
  87. for (j = sfb_offset[i]; j < sfb_offset[i + 1]; j++)
  88. mdct_pred[j] = 0.0;
  89. } else {
  90. num_bit += snr[i] / 6. * (sfb_offset[i + 1] - sfb_offset[i]);
  91. }
  92. }
  93.     }
  94. if (num_bit < side_info)
  95.     {
  96. num_bit = 0.0;
  97. for (j = 0; j < flen; j++)
  98. mdct_pred[j] = 0.0;
  99. for (i = 0; i < num_of_sfb; i++)
  100. sfb_flag[i] = 0;
  101.     } else {
  102. num_bit -= side_info;
  103. }
  104. return (num_bit);
  105. }
  106. static void prediction(double *buffer, double *predicted_samples, double *weight, int lag,
  107. int flen)
  108. {
  109. int i, offset;
  110. int num_samples;
  111. offset = NOK_LT_BLEN - flen / 2 - lag;
  112. num_samples = flen;
  113. if(NOK_LT_BLEN - offset < flen)
  114. num_samples = NOK_LT_BLEN - offset;
  115. for(i = 0; i < num_samples; i++)
  116. predicted_samples[i] = *weight * buffer[offset++];
  117. for( ; i < flen; i++)
  118. predicted_samples[i] = 0.0;
  119. }
  120. static void w_quantize(double *freq, int *ltp_idx)
  121. {
  122. int i;
  123. double dist, low;
  124. low = 1.0e+10;
  125. dist = 0.0;
  126. for (i = 0; i < CODESIZE; i++)
  127. {
  128. dist = (*freq - codebook[i]) * (*freq - codebook[i]);
  129. if (dist < low)
  130. {
  131. low = dist;
  132. *ltp_idx = i;
  133. }
  134. }
  135. *freq = codebook[*ltp_idx];
  136. }
  137. static int pitch(double *sb_samples, double *x_buffer, int flen, int lag0, int lag1, 
  138.   double *predicted_samples, double *gain, int *cb_idx)
  139. {
  140. int i, j, delay;
  141. double corr1, corr2, lag_corr, corrtmp;
  142. double p_max, energy, lag_energy;
  143. /*
  144.  * Below is a figure illustrating how the lag and the
  145.  * samples in the buffer relate to each other.
  146.  *
  147.  * ------------------------------------------------------------------
  148.  * |              |               |                |                 |
  149.  * |    slot 1    |      2        |       3        |       4         |
  150.  * |              |               |                |                 |
  151.  * ------------------------------------------------------------------
  152.  *
  153.  * lag = 0 refers to the end of slot 4 and lag = DELAY refers to the end
  154.  * of slot 2. The start of the predicted frame is then obtained by
  155.  * adding the length of the frame to the lag. Remember that slot 4 doesn't
  156.  * actually exist, since it is always filled with zeros.
  157.  *
  158.  * The above short explanation was for long blocks. For short blocks the
  159.  * zero lag doesn't refer to the end of slot 4 but to the start of slot
  160.  * 4 - the frame length of a short block.
  161.  *
  162.  * Some extra code is then needed to handle those lag values that refer
  163.  * to slot 4.
  164.  */
  165. p_max = 0.0;
  166. lag_corr = lag_energy = 0.0;
  167. delay = lag0;
  168. energy = 0.0;
  169. corr1 = 0.0;
  170. for (j = lag0; j < lag1; j++)
  171. {
  172. corr1 += x_buffer[NOK_LT_BLEN - j - 1] * sb_samples[flen - j - 1];
  173. energy += x_buffer[NOK_LT_BLEN - j - 1] * x_buffer[NOK_LT_BLEN - j - 1];
  174. }
  175. corrtmp=corr1;
  176. if (energy != 0.0)
  177. corr2 = corr1 / sqrt(energy);
  178. else
  179. corr2 = 0.0;
  180. if (p_max < corr2)
  181. {
  182. p_max = corr2;
  183. delay = 0;
  184. lag_corr = corr1;
  185. lag_energy = energy;
  186. }
  187. /* Find the lag. */
  188. for (i = lag0 + 1; i < lag1; i++)
  189. {
  190. energy -= x_buffer[NOK_LT_BLEN - i] * x_buffer[NOK_LT_BLEN - i];
  191. energy += x_buffer[NOK_LT_BLEN - i - flen] * x_buffer[NOK_LT_BLEN - i - flen];
  192. corr1 = corrtmp;
  193. corr1 -= x_buffer[NOK_LT_BLEN - i] * sb_samples[flen - 1];
  194. corr1 += x_buffer[NOK_LT_BLEN - i - flen] * sb_samples[0];
  195. corrtmp = corr1;
  196. if (energy != 0.0)
  197. corr2 = corr1 / sqrt(energy);
  198. else
  199. corr2 = 0.0;
  200. if (p_max < corr2)
  201. {
  202. p_max = corr2;
  203. delay = i;
  204. lag_corr = corr1;
  205. lag_energy = energy;
  206. }
  207. }
  208. /* Compute the gain. */
  209. if(lag_energy != 0.0)
  210. *gain =  lag_corr / (1.010 * lag_energy);
  211. else
  212. *gain = 0.0;
  213. /* Quantize the gain. */
  214. w_quantize(gain, cb_idx);
  215. /* Get the predicted signal. */
  216. prediction(x_buffer, predicted_samples, gain, delay, flen);
  217. return (delay);
  218. }
  219. static double ltp_enc_tf(faacEncHandle hEncoder,
  220. CoderInfo *coderInfo, double *p_spectrum, double *predicted_samples, 
  221.  double *mdct_predicted, int *sfb_offset,
  222.  int num_of_sfb, int last_band, int side_info, 
  223.  int *sfb_prediction_used, TnsInfo *tnsInfo)
  224. {
  225. double bit_gain;
  226. /* Transform prediction to frequency domain. */
  227. FilterBank(hEncoder, coderInfo, predicted_samples, mdct_predicted,
  228. NULL, MNON_OVERLAPPED);
  229. /* Apply TNS analysis filter to the predicted spectrum. */
  230. if(tnsInfo != NULL)
  231. TnsEncodeFilterOnly(tnsInfo, num_of_sfb, num_of_sfb, coderInfo->block_type, sfb_offset, 
  232. mdct_predicted);
  233. /* Get the prediction gain. */
  234. bit_gain = snr_pred(p_spectrum, mdct_predicted, sfb_prediction_used, 
  235. sfb_offset, side_info, last_band, coderInfo->nr_of_sfb);
  236. return (bit_gain);
  237. }
  238. void LtpInit(faacEncHandle hEncoder)
  239. {
  240. int i;
  241. unsigned int channel;
  242. for (channel = 0; channel < hEncoder->numChannels; channel++) {
  243. LtpInfo *ltpInfo = &(hEncoder->coderInfo[channel].ltpInfo);
  244. ltpInfo->buffer = AllocMemory(NOK_LT_BLEN * sizeof(double));
  245. ltpInfo->mdct_predicted = AllocMemory(2*BLOCK_LEN_LONG*sizeof(double));
  246. ltpInfo->time_buffer = AllocMemory(BLOCK_LEN_LONG*sizeof(double));
  247. ltpInfo->ltp_overlap_buffer = AllocMemory(BLOCK_LEN_LONG*sizeof(double));
  248. for (i = 0; i < NOK_LT_BLEN; i++)
  249. ltpInfo->buffer[i] = 0;
  250. ltpInfo->weight_idx = 0;
  251. for(i = 0; i < MAX_SHORT_WINDOWS; i++)
  252. ltpInfo->sbk_prediction_used[i] = ltpInfo->delay[i] = 0;
  253. for(i = 0; i < MAX_SCFAC_BANDS; i++)
  254. ltpInfo->sfb_prediction_used[i] = 0;
  255. ltpInfo->side_info = LEN_LTP_DATA_PRESENT;
  256. for(i = 0; i < 2 * BLOCK_LEN_LONG; i++)
  257. ltpInfo->mdct_predicted[i] = 0.0;
  258. }
  259. }
  260. void LtpEnd(faacEncHandle hEncoder)
  261. {
  262. unsigned int channel;
  263. for (channel = 0; channel < hEncoder->numChannels; channel++) {
  264. LtpInfo *ltpInfo = &(hEncoder->coderInfo[channel].ltpInfo);
  265. if (ltpInfo->buffer) FreeMemory(ltpInfo->buffer);
  266. if (ltpInfo->mdct_predicted) FreeMemory(ltpInfo->mdct_predicted);
  267. }
  268. }
  269. int LtpEncode(faacEncHandle hEncoder,
  270. CoderInfo *coderInfo,
  271. LtpInfo *ltpInfo,
  272. TnsInfo *tnsInfo,
  273. double *p_spectrum,
  274. double *p_time_signal)
  275. {
  276. int i, last_band;
  277. double num_bit[MAX_SHORT_WINDOWS];
  278. double *predicted_samples;
  279. ltpInfo->global_pred_flag = 0;
  280. ltpInfo->side_info = 0;
  281. predicted_samples = (double*)AllocMemory(2*BLOCK_LEN_LONG*sizeof(double));
  282. switch(coderInfo->block_type)
  283. {
  284. case ONLY_LONG_WINDOW:
  285. case LONG_SHORT_WINDOW:
  286. case SHORT_LONG_WINDOW:
  287. last_band = (coderInfo->nr_of_sfb < MAX_LT_PRED_LONG_SFB) ? coderInfo->nr_of_sfb : MAX_LT_PRED_LONG_SFB;
  288. ltpInfo->delay[0] = 
  289. pitch(p_time_signal, ltpInfo->buffer, 2 * BLOCK_LEN_LONG, 
  290. 0, 2 * BLOCK_LEN_LONG, predicted_samples, &ltpInfo->weight, 
  291. &ltpInfo->weight_idx);
  292. num_bit[0] = 
  293. ltp_enc_tf(hEncoder, coderInfo, p_spectrum, predicted_samples,
  294. ltpInfo->mdct_predicted, 
  295. coderInfo->sfb_offset, coderInfo->nr_of_sfb,
  296. last_band, ltpInfo->side_info, ltpInfo->sfb_prediction_used, 
  297. tnsInfo);
  298. ltpInfo->global_pred_flag = (num_bit[0] == 0.0) ? 0 : 1;
  299. if(ltpInfo->global_pred_flag)
  300. for (i = 0; i < coderInfo->sfb_offset[last_band]; i++)
  301. p_spectrum[i] -= ltpInfo->mdct_predicted[i];
  302. else
  303. ltpInfo->side_info = 1;
  304. break;
  305.     default:
  306. break;
  307. }
  308. if (predicted_samples) FreeMemory(predicted_samples);
  309. return (ltpInfo->global_pred_flag);
  310. }
  311. void LtpReconstruct(CoderInfo *coderInfo, LtpInfo *ltpInfo, double *p_spectrum)
  312. {
  313. int i, last_band;
  314. if(ltpInfo->global_pred_flag)
  315. {
  316. switch(coderInfo->block_type)
  317. {
  318. case ONLY_LONG_WINDOW:
  319. case LONG_SHORT_WINDOW:
  320. case SHORT_LONG_WINDOW:
  321. last_band = (coderInfo->nr_of_sfb < MAX_LT_PRED_LONG_SFB) ?
  322. coderInfo->nr_of_sfb : MAX_LT_PRED_LONG_SFB;
  323. for (i = 0; i < coderInfo->sfb_offset[last_band]; i++)
  324. p_spectrum[i] += ltpInfo->mdct_predicted[i];
  325. break;
  326. default:
  327. break;
  328. }
  329. }
  330. }
  331. void  LtpUpdate(LtpInfo *ltpInfo, double *time_signal,
  332.  double *overlap_signal, int block_size_long)
  333. {
  334. int i;
  335. for(i = 0; i < NOK_LT_BLEN - 2 * block_size_long; i++)
  336. ltpInfo->buffer[i] = ltpInfo->buffer[i + block_size_long];
  337. for(i = 0; i < block_size_long; i++) 
  338. {
  339. ltpInfo->buffer[NOK_LT_BLEN - 2 * block_size_long + i] = time_signal[i];
  340. ltpInfo->buffer[NOK_LT_BLEN - block_size_long + i] = overlap_signal[i];
  341. }
  342. }