LINGUAL.C
上传用户:njqiyou
上传日期:2007-01-08
资源大小:574k
文件大小:9k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /**********************************************************************
  2.  * ISO MPEG Audio Subgroup Software Simulation Group (1996)
  3.  * ISO 13818-3 MPEG-2 Audio Multichannel Encoder
  4.  *
  5.  * $Id: lingual.c 1.7 1996/02/12 07:13:35 rowlands Exp $
  6.  *
  7.  * $Log: lingual.c $
  8.  * Revision 1.7  1996/02/12 07:13:35  rowlands
  9.  * Release following Munich meeting
  10.  *
  11.  * Revision 1.4.2.1  1995/11/06  04:19:12  rowlands
  12.  * Received from Uwe Felderhoff (IRT)
  13.  *
  14.  * Revision 1.5  1995/08/14  08:03:03  tenkate
  15.  * ML-LSF added Warner ten Kate 7/8/95 (Philips)
  16.  * change alloc and sblimit into alloc_ml and sblimit_ml where appropriate
  17.  * ml_sb_sample_swap() ml_sb_sample_shift() and pick_scale_ml_2() added.
  18.  **********************************************************************/
  19. #define VERY_FAST_FILTER  1 /* JMZ */
  20. #define LOWPASS 20
  21. #include "common.h"
  22. #include "encoder.h"
  23. /************************************************************************/
  24. /*
  25. /* read_samples()
  26. /*
  27. /* PURPOSE:  reads the PCM samples from a file to the buffer
  28. /*
  29. /*  SEMANTICS:
  30. /* Reads #samples_read# number of shorts from #musicin# filepointer
  31. /* into #sample_buffer[]#.  Returns the number of samples read.
  32. /*
  33. /************************************************************************/
  34. unsigned long read_samples_ml(FILE *musicin, long int *sample_buffer, long unsigned int num_samples, long unsigned int frame_size, int *byte_per_sample, int *aiff)
  35. {
  36. unsigned long samples_read;
  37. static unsigned long samples_to_read;
  38. static char init = TRUE;
  39. short pcm_sample_buffer[8064];        /*for correct reading of pcm-data*/
  40. int i;
  41. if (init) 
  42. {
  43. samples_to_read = num_samples;
  44. init = FALSE;
  45. }
  46. if (samples_to_read >= frame_size)
  47. samples_read = frame_size;
  48. else
  49. samples_read = samples_to_read;
  50. if((*aiff==1) &&(*byte_per_sample !=2))
  51. {
  52. if ((samples_read = fread(sample_buffer, *byte_per_sample, (int)samples_read, musicin)) == 0)
  53. if (verbosity >= 2) printf("Hit end of audio datan");
  54. }
  55. else
  56. {
  57. if ((samples_read = fread(pcm_sample_buffer, sizeof(short), (int)samples_read, musicin)) == 0)
  58. if (verbosity >= 2) printf("Hit end of audio datan");
  59. for(i = 0; i < samples_read; ++i) /* replace 5760 by 'samples_read' WtK 7/8/95 */
  60. sample_buffer[i] = pcm_sample_buffer[i];
  61. }
  62. samples_to_read -= samples_read;
  63. if (samples_read < frame_size && samples_read > 0) 
  64. {
  65. if (verbosity >= 2) printf("Insufficient PCM input for one frame - fillout with zerosn");
  66. for (; samples_read < frame_size; sample_buffer[samples_read++] = 0);
  67. samples_to_read = 0;
  68. }
  69. return(samples_read);
  70. }
  71.  
  72. /************************************************************************/
  73. /*
  74. /* get_audio_ml()
  75. /*
  76. /* PURPOSE:  reads a frame of audio data from a file to the buffer,
  77. /*   aligns the data for future processing, and separates the
  78. /*   left and right channels
  79. /*
  80. /*  SEMANTICS:
  81. /* Calls read_samples() to read a frame of audio data from filepointer
  82. /* #musicin# to #insampl[]#.  The data is shifted to make sure the data
  83. /* is centered for the 1024pt window to be used by the psychoacoustic model,
  84. /* and to compensate for the 256 sample delay from the filter bank. For
  85. /* stereo, the channels are also demultiplexed into #buffer[0][]# and
  86. /* #buffer[1][]#
  87. /*
  88. /************************************************************************/
  89. unsigned long
  90. get_audio_ml(
  91. FILE *musicin_ml,
  92. double (*buffer)[1152],
  93. long unsigned int num_samples,
  94. IFF_AIFF *aiff_ptr,
  95. frame_params *fr_ps,
  96. int *aiff,
  97. int *byte_per_sample,
  98. double (*buffer_matr)[1152]
  99. ) {
  100. int  j, ch;
  101. long insamp[8064];
  102. unsigned long samples_read;
  103. int  n_ml_ch = fr_ps->header->multiling_ch;
  104. samples_read = read_samples_ml(musicin_ml, insamp, num_samples, (unsigned long) 1152*n_ml_ch, byte_per_sample, aiff);
  105. for(j=0; j<1152; j++) 
  106.   for (ch=0;ch<n_ml_ch;ch++)
  107.     buffer_matr[7+ch][j] = buffer[7+ch][j] = insamp[(n_ml_ch*j)+ch]; /*WtK 7/8/95 */
  108. return(samples_read);
  109. }
  110. /************************************************************************
  111. /*
  112. /* I_encode_scale  (Layer I)
  113. /* II_encode_scale (Layer II)
  114. /*
  115. /* PURPOSE:The encoded scalar factor information is arranged and
  116. /* queued into the output fifo to be transmitted.
  117. /*
  118. /* For Layer II, the three scale factors associated with
  119. /* a given subband and channel are transmitted in accordance
  120. /* with the scfsi, which is transmitted first.
  121. /*
  122. /************************************************************************/
  123.  
  124.  
  125. void II_sample_encoding_ml(unsigned int (*sbband)[3][12][32], unsigned int (*bit_alloc)[32], frame_params *fr_ps, Bit_stream_struc *bs)
  126. {
  127.    unsigned int temp;
  128.    unsigned int i,j,k,s,x,y;
  129.    int n_ml_ch       = fr_ps->header->multiling_ch;
  130.    int lsf           = fr_ps->header->multiling_fs;
  131.    int sblimit_ml     = fr_ps->sblimit_ml;
  132.    al_table *alloc_ml = fr_ps->alloc_ml;
  133.    
  134. for (s=0;s<3;s++)
  135.   for (j=0;j<((lsf==1)?6:12);j+=3)
  136.     for (i=0;i<sblimit_ml;i++)
  137.       for (k = 7; k < 7+n_ml_ch; k++)
  138. if (bit_alloc[k][i]) 
  139. {
  140. if ((*alloc_ml)[i][bit_alloc[k][i]].group == 3) 
  141. {
  142. for (x = 0; x < 3; x++)
  143. putbits(bs,sbband[k][s][j+x][i],
  144.                                     (*alloc_ml)[i][bit_alloc[k][i]].bits);
  145. }
  146. else 
  147. {
  148. y =(*alloc_ml)[i][bit_alloc[k][i]].steps;
  149. temp =  sbband[k][s][j][i] +
  150. sbband[k][s][j+1][i] * y +
  151. sbband[k][s][j+2][i] * y * y;
  152. putbits(bs,temp,(*alloc_ml)[i][bit_alloc[k][i]].bits);
  153. }
  154. }
  155. }
  156. void II_encode_bit_alloc_ml(unsigned int (*bit_alloc)[32], frame_params *fr_ps, Bit_stream_struc *bs)
  157. {
  158.    int i,k;
  159.    int n_ml_ch       = fr_ps->header->multiling_ch;
  160.    int sblimit_ml     = fr_ps->sblimit_ml;
  161.    al_table *alloc_ml = fr_ps->alloc_ml;
  162.    
  163.   for (i=0;i<sblimit_ml;i++)
  164.   {
  165. for(k = 7; k < 7+n_ml_ch; ++k)
  166. {        
  167. putbits(bs, bit_alloc[k][i], (*alloc_ml)[i][0].bits);
  168. }
  169.   }
  170. }
  171. void ml_sb_sample_swap (int ch0, int ch1, double subsample[14][3][12][SBLIMIT])
  172. /* Function is called if MultiLingual LSF applies.                   */
  173. /* It organizes subband samples from 3 sub frames of 12 samples each */
  174. /* into 6 sub frames of 6 samples each. Subframes 3, 4 and 5 are at  */
  175. /* sample indices 6..11 in subframes 0,1,2 respectively.             */
  176. /* WtK 7/8/95                                                        */
  177. {
  178. int    ch,sb,ss;
  179. double hlp[6];
  180. for (ch=ch0;ch<ch1;ch++)
  181.   for (sb=0;sb<SBLIMIT;sb++)
  182.     for (ss=0;ss<6;ss++) {
  183.       hlp[ss]                    = subsample[ch][2][  ss][sb];
  184.       subsample[ch][2][  ss][sb] = subsample[ch][1][  ss][sb];
  185.       subsample[ch][1][  ss][sb] = subsample[ch][0][6+ss][sb];
  186.       subsample[ch][0][6+ss][sb] = subsample[ch][1][6+ss][sb];
  187.       subsample[ch][1][6+ss][sb] = hlp[ss];
  188.     }
  189. }
  190. void ml_sb_sample_shift (int ch0, int ch1,double subsample[14][3][12][SBLIMIT])
  191. /* In case of MultiLingual LSF this function is called.             */
  192. /* It shifts the second part in the sub frames into the first part. */
  193. /* The first part is shifted into the second part to be used by     */
  194. /* pick_scale_ml_2()                                                */
  195. /* WtK 7/8/95                                                       */
  196. {
  197. int    ch,sb,p,ss;
  198. double hlp[6];
  199. for (ch=ch0;ch<ch1;ch++)
  200.   for (sb=0;sb<SBLIMIT;sb++)
  201.     for (p=0;p<2;p++)
  202.       for (ss=0;ss<6;ss++) {
  203.         hlp[ss]                    = subsample[ch][p][  ss][sb];
  204. subsample[ch][p][ss][sb]   = subsample[ch][p][ss+6][sb];
  205. subsample[ch][p][ss+6][sb] = hlp[ss];
  206.       }
  207. }
  208. void pick_scale_ml_2(frame_params *fr_ps, double subsample[14][3][12][SBLIMIT], double (*max_sc)[32])
  209. /* pick largest max_sc of odd and even half of frame in case of LSF ML. */
  210. /* This improves the psychoacoustic result:                             */
  211. /* The masked threshold is calculated over 2 LSF frames; consequently,  */
  212. /* the signal level should also be determined over those 2 frames in    */
  213. /* order to obtain a fair estimate of the SMR.                          */
  214. /* WtK , 7/8/95                                                         */
  215. {
  216.   int k,i,p,j;
  217.   int maxi;
  218.   double maxs,mods;
  219.   int n_ml_ch   = fr_ps->header->multiling_ch;
  220.   int sblimit_ml = fr_ps->sblimit_ml;
  221.   int ml_fs     = fr_ps->header->multiling_fs;
  222.  if ( (n_ml_ch>0) && (ml_fs==1) ) {
  223.     for (k=7; k<7+n_ml_ch; k++) {
  224.        for (i=0;i<sblimit_ml;i++) {
  225.    maxs = subsample[k][0][0][i]; if (maxs<0) maxs = -maxs;
  226.    for (p=0;p<3;p++) for (j=6;j<12;j++) {
  227.               mods = subsample[k][p][j][i]; if (mods<0) mods = -mods;
  228.       if (mods>maxs) maxs = mods;
  229.    }
  230.            for (j=SCALE_RANGE-1,maxi=0;j>=0;j--)
  231.     if (maxs < multiple[j]) {
  232.       maxi = j;
  233.       break;
  234.    }
  235.    if (multiple[maxi]>max_sc[k][i]) max_sc[k][i] = multiple[maxi];
  236.        }
  237.     }
  238.  }
  239. }