1 /********************************************************************
3 * THIS FILE IS PART OF THE Ogg Vorbis SOFTWARE CODEC SOURCE CODE. *
4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS SOURCE IS GOVERNED BY *
5 * THE GNU PUBLIC LICENSE 2, WHICH IS INCLUDED WITH THIS SOURCE. *
6 * PLEASE READ THESE TERMS DISTRIBUTING. *
8 * THE OggSQUISH SOURCE CODE IS (C) COPYRIGHT 1994-1999 *
9 * by 1999 Monty <monty@xiph.org> and The XIPHOPHORUS Company *
10 * http://www.xiph.org/ *
12 ********************************************************************
14 function: single-block PCM analysis
15 author: Monty <xiphmont@mit.edu>
16 modifications by: Monty
17 last modification date: Oct 7 1999
19 ********************************************************************/
33 /* this code is still seriously abbreviated. I'm filling in pieces as
34 we go... --Monty 19991004 */
36 int vorbis_analysis(vorbis_block *vb,ogg_packet *op){
40 double *window=vb->vd->window[vb->W][vb->lW][vb->nW];
41 lpc_lookup *vl=&vb->vd->vl[vb->W];
42 vorbis_dsp_state *vd=vb->vd;
43 vorbis_info *vi=vd->vi;
44 oggpack_buffer *opb=&vb->opb;
47 int spectral_order=vi->floororder[vb->W];
49 /*lpc_lookup *vbal=&vb->vd->vbal[vb->W];
50 double balance_v[vbal->m];
53 /* first things first. Make sure encode is ready*/
55 /* Encode the packet type */
56 _oggpack_write(opb,0,1);
57 /* Encode the block size */
58 _oggpack_write(opb,vb->W,1);
60 /* we have the preecho metrics; decide what to do with them */
61 /*_ve_envelope_sparsify(vb);
62 _ve_envelope_apply(vb,0);*/
64 /* Encode the envelope */
65 /*if(_ve_envelope_encode(vb))return(-1);*/
67 /* time domain PCM -> MDCT domain */
68 for(i=0;i<vi->channels;i++)
69 mdct_forward(&vd->vm[vb->W],vb->pcm[i],vb->pcm[i],window);
73 /* extract the spectral envelope and residue */
74 /* just do by channel. No coupling yet */
76 for(i=0;i<vi->channels;i++){
79 double *lpc=vb->lpc[i];
80 double *lsp=vb->lsp[i];
82 memset(floor,0,sizeof(double)*n/2);
84 _vp_noise_floor(vb->pcm[i],floor,n/2);
85 _vp_mask_floor(vb->pcm[i],floor,n/2);
87 /* Convert our floor to a set of lpc coefficients */
88 vb->amp[i]=sqrt(vorbis_curve_to_lpc(floor,lpc,vl));
90 /* LSP <-> LPC is orthogonal and LSP quantizes more stably */
91 vorbis_lpc_to_lsp(lpc,lsp,vl->m);
93 /* code the spectral envelope; mutates the lsp coeffs to reflect
94 what was actually encoded */
95 _vs_spectrum_encode(vb,vb->amp[i],lsp);
97 /* Generate residue from the decoded envelope, which will be
98 slightly different to the pre-encoding floor due to
99 quantization. Slow, yes, but perhaps more accurate */
101 vorbis_lsp_to_lpc(lsp,lpc,vl->m);
102 vorbis_lpc_to_curve(curve,lpc,vb->amp[i],vl);
104 /* this may do various interesting massaging too...*/
105 _vs_residue_quantize(vb->pcm[i],curve,vi,n/2);
107 /* encode the residue */
108 _vs_residue_encode(vb,vb->pcm[i]);
113 /* set up the packet wrapper */
115 op->packet=opb->buffer;
116 op->bytes=_oggpack_bytes(opb);
118 op->e_o_s=vb->eofflag;
119 op->frameno=vb->frameno;
127 /* commented out, relocated balance stuff */
129 double *C=vb->pcm[0];
130 double *D=vb->pcm[1];
132 balance_amp=_vp_balance_compute(D,C,balance_v,vbal);
138 sprintf(buffer,"com%d.m",frameno);
139 out=fopen(buffer,"w+");
141 fprintf(out," 0. 0.\n");
142 fprintf(out,"%g %g\n",C[i],D[i]);
147 sprintf(buffer,"L%d.m",frameno);
148 out=fopen(buffer,"w+");
150 fprintf(out,"%g\n",C[i]);
153 sprintf(buffer,"R%d.m",frameno);
154 out=fopen(buffer,"w+");
156 fprintf(out,"%g\n",D[i]);
162 _vp_balance_apply(D,C,balance_v,balance_amp,vbal,1);
168 sprintf(buffer,"bal%d.m",frameno);
169 out=fopen(buffer,"w+");
171 fprintf(out," 0. 0.\n");
172 fprintf(out,"%g %g\n",C[i],D[i]);
176 sprintf(buffer,"C%d.m",frameno);
177 out=fopen(buffer,"w+");
179 fprintf(out,"%g\n",C[i]);
182 sprintf(buffer,"D%d.m",frameno);
183 out=fopen(buffer,"w+");
185 fprintf(out,"%g\n",D[i]);