int main(int argc, char **argv) { char *inFile, *outFile, *bitsFile; FILE *fin, *fout, *fbits=NULL; short in_short[FRAME_SIZE]; short out_short[FRAME_SIZE]; float in_float[FRAME_SIZE]; float sigpow,errpow,snr, seg_snr=0; int snr_frames = 0; char cbits[200]; int nbBits; int i; void *st; void *dec; SpeexBits bits; spx_int32_t tmp; int bitCount=0; spx_int32_t skip_group_delay; SpeexCallback callback; sigpow = 0; errpow = 0; st = speex_encoder_init(speex_lib_get_mode(SPEEX_MODEID_UWB)); dec = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_UWB)); callback.callback_id = SPEEX_INBAND_CHAR; callback.func = speex_std_char_handler; callback.data = stderr; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); callback.callback_id = SPEEX_INBAND_MODE_REQUEST; callback.func = speex_std_mode_request_handler; callback.data = st; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); tmp=0; speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp); tmp=0; speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); tmp=7; speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp); tmp=1; speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp); speex_encoder_ctl(st, SPEEX_GET_LOOKAHEAD, &skip_group_delay); speex_decoder_ctl(dec, SPEEX_GET_LOOKAHEAD, &tmp); skip_group_delay += tmp; if (argc != 4 && argc != 3) { fprintf (stderr, "Usage: encode [in file] [out file] [bits file]\nargc = %d", argc); exit(1); } inFile = argv[1]; fin = fopen(inFile, "rb"); outFile = argv[2]; fout = fopen(outFile, "wb+"); if (argc==4) { bitsFile = argv[3]; fbits = fopen(bitsFile, "wb"); } speex_bits_init(&bits); while (!feof(fin)) { fread(in_short, sizeof(short), FRAME_SIZE, fin); if (feof(fin)) break; for (i=0;i<FRAME_SIZE;i++) in_float[i]=in_short[i]; speex_bits_reset(&bits); speex_encode_int(st, in_short, &bits); nbBits = speex_bits_write(&bits, cbits, 200); bitCount+=bits.nbBits; if (argc==4) fwrite(cbits, 1, nbBits, fbits); speex_bits_rewind(&bits); speex_decode_int(dec, &bits, out_short); speex_bits_reset(&bits); fwrite(&out_short[skip_group_delay], sizeof(short), FRAME_SIZE-skip_group_delay, fout); skip_group_delay = 0; } fprintf (stderr, "Total encoded size: %d bits\n", bitCount); speex_encoder_destroy(st); speex_decoder_destroy(dec); rewind(fin); rewind(fout); while ( FRAME_SIZE == fread(in_short, sizeof(short), FRAME_SIZE, fin) && FRAME_SIZE == fread(out_short, sizeof(short), FRAME_SIZE,fout) ) { float s=0, e=0; for (i=0;i<FRAME_SIZE;++i) { s += (float)in_short[i] * in_short[i]; e += ((float)in_short[i]-out_short[i]) * ((float)in_short[i]-out_short[i]); } seg_snr += 10*log10((s+1)/(e+1)); sigpow += s; errpow += e; snr_frames++; } fclose(fin); fclose(fout); snr = 10 * log10( sigpow / errpow ); seg_snr /= snr_frames; fprintf(stderr,"SNR = %f\nsegmental SNR = %f\n",snr, seg_snr); #ifdef FIXED_DEBUG printf ("Total: %f MIPS\n", (float)(1e-6*50*spx_mips/snr_frames)); #endif return 1; }
/***************************************************************************** * ProcessPacket: processes a Speex packet. *****************************************************************************/ static void *ProcessPacket( decoder_t *p_dec, ogg_packet *p_oggpacket, block_t **pp_block ) { decoder_sys_t *p_sys = p_dec->p_sys; block_t *p_block = *pp_block; if( p_block && p_block->i_flags & BLOCK_FLAG_DISCONTINUITY ) Flush( p_dec ); /* Date management */ if( p_block && p_block->i_pts > VLC_TS_INVALID && p_block->i_pts != date_Get( &p_sys->end_date ) ) { date_Set( &p_sys->end_date, p_block->i_pts ); } if( !date_Get( &p_sys->end_date ) ) { /* We've just started the stream, wait for the first PTS. */ if( p_block ) block_Release( p_block ); return NULL; } *pp_block = NULL; /* To avoid being fed the same packet again */ if( p_sys->b_packetizer ) { if ( p_sys->p_header->frames_per_packet > 1 ) { short *p_frame_holder = NULL; int i_bits_before = 0, i_bits_after = 0, i_bytes_in_speex_frame = 0, i_pcm_output_size = 0, i_bits_in_speex_frame = 0; block_t *p_new_block = NULL; i_pcm_output_size = p_sys->p_header->frame_size; p_frame_holder = (short*)xmalloc( sizeof(short)*i_pcm_output_size ); speex_bits_read_from( &p_sys->bits, (char*)p_oggpacket->packet, p_oggpacket->bytes); i_bits_before = speex_bits_remaining( &p_sys->bits ); speex_decode_int(p_sys->p_state, &p_sys->bits, p_frame_holder); i_bits_after = speex_bits_remaining( &p_sys->bits ); i_bits_in_speex_frame = i_bits_before - i_bits_after; i_bytes_in_speex_frame = ( i_bits_in_speex_frame + (8 - (i_bits_in_speex_frame % 8)) ) / 8; p_new_block = block_Alloc( i_bytes_in_speex_frame ); memset( p_new_block->p_buffer, 0xff, i_bytes_in_speex_frame ); /* * Copy the first frame in this packet to a new packet. */ speex_bits_rewind( &p_sys->bits ); speex_bits_write( &p_sys->bits, (char*)p_new_block->p_buffer, (int)i_bytes_in_speex_frame ); /* * Move the remaining part of the original packet (subsequent * frames, if there are any) into the beginning * of the original packet so * they are preserved following the realloc. * Note: Any bits that * remain in the initial packet * are "filler" if they do not constitute * an entire byte. */ if ( i_bits_after > 7 ) { /* round-down since we rounded-up earlier (to include * the speex terminator code. */ i_bytes_in_speex_frame--; speex_bits_write( &p_sys->bits, (char*)p_block->p_buffer, p_block->i_buffer - i_bytes_in_speex_frame ); p_block = block_Realloc( p_block, 0, p_block->i_buffer-i_bytes_in_speex_frame ); *pp_block = p_block; } else { speex_bits_reset( &p_sys->bits ); } free( p_frame_holder ); return SendPacket( p_dec, p_new_block); } else { return SendPacket( p_dec, p_block ); } } else { block_t *p_aout_buffer = DecodePacket( p_dec, p_oggpacket ); if( p_block ) block_Release( p_block ); return p_aout_buffer; } }
static int speex_decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t* buf, int buf_size) { SpeexContext *s = avctx->priv_data; int ret, bits_remaining, used = 0, bits_remaining_before; av_log(avctx,AV_LOG_DEBUG,"speexdec: out: %p %p(%d), in: %p, %d\n", data, data_size, data_size?*data_size:0,buf,buf_size); if (data) { /* we'll save this info to log later */ bits_remaining_before = bits_remaining = speex_bits_remaining(&s->bits); *data_size = 0; /* We are not interpolating a frame */ if (buf) { if (bits_remaining > 0) { speex_bits_read_whole_bytes(&s->bits, (char*) buf, buf_size); } else { /*Copy buf to Speex bitstream*/ speex_bits_read_from(&s->bits, (char*) buf, buf_size); } } // end if we are not interpolating a frame ret = speex_decode_int(s->st, buf ? &s->bits : NULL, data); switch (ret) { case -2: av_log(avctx, AV_LOG_ERROR, "Error: corrupted speex stream\n"); speex_bits_reset(&s->bits); return -1; case -1: /* no frame has been decoded, return bytes used */ //av_log(avctx, AV_LOG_INFO, "Warning: no samples have been decoded (end of stream)\n"); speex_bits_rewind(&s->bits); return buf_size; default: if (buf) { /* Calculate how many bytes we've used */ bits_remaining = speex_bits_remaining(&s->bits); if (bits_remaining < 0) { //av_log(avctx, AV_LOG_DEBUG, "Warning: decoding overflow, need more data (%d used)\n", buf_size); speex_bits_rewind(&s->bits); return buf_size; } used = buf_size - (bits_remaining / 8); } else { av_log(avctx, AV_LOG_DEBUG, "Info: interpolating a lost frame\n"); } *data_size = avctx->frame_size * avctx->channels * sizeof(short); if (avctx->channels == 2) speex_decode_stereo_int(data, avctx->frame_size, &s->stereo); if (avctx->debug & FF_DEBUG_BITSTREAM) { int bitrate; speex_decoder_ctl(s->st, SPEEX_GET_BITRATE, &bitrate); av_log(avctx, AV_LOG_DEBUG, "Speex: decoder used: %d/%d bytes, output: %d bytes, bitrate: %d bps (remaining in stream: %.1f bytes after %d bits)\n", used, buf_size, *data_size, bitrate, (float) bits_remaining / 8, bits_remaining_before); } speex_bits_reset(&s->bits); break; } } else { speex_bits_reset(&s->bits); } return used; }
void main() { char *outFile, *bitsFile; FILE *fout, *fbits=NULL; #ifndef DECODE_ONLY char *inFile; FILE *fin; #endif #if 0 char *dbgoutFile; FILE *fdbgout; #endif short out_short[FRAME_SIZE]; #ifndef DECODE_ONLY short in_short[FRAME_SIZE]; float sigpow,errpow,snr, seg_snr=0; int snr_frames = 0; int nbBits; int i; #endif char cbits[200]; void *st; void *dec; SpeexBits bits; int tmp; int bitCount=0; int skip_group_delay; SpeexCallback callback; #ifndef DECODE_ONLY sigpow = 0; errpow = 0; #endif #ifdef MANUAL_ALLOC spxGlobalHeapPtr = spxHeap; spxGlobalHeapEnd = spxHeap + sizeof(spxHeap); spxGlobalScratchPtr = spxScratch; spxGlobalScratchEnd = spxScratch + sizeof(spxScratch); #endif st = speex_encoder_init(&speex_nb_mode); #ifdef MANUAL_ALLOC spxGlobalScratchPtr = spxScratch; /* Reuse scratch for decoder */ #endif dec = speex_decoder_init(&speex_nb_mode); callback.callback_id = SPEEX_INBAND_CHAR; callback.func = speex_std_char_handler; callback.data = stderr; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); callback.callback_id = SPEEX_INBAND_MODE_REQUEST; callback.func = speex_std_mode_request_handler; callback.data = st; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); tmp=0; speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp); tmp=0; speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); tmp=4; speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp); tmp=1; speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp); speex_mode_query(&speex_nb_mode, SPEEX_MODE_FRAME_SIZE, &tmp); fprintf (stderr, "frame size: %d\n", tmp); skip_group_delay = tmp / 2; #ifdef DECODE_ONLY bitsFile = "e:\\speextrunktest\\samples\\malebitsin54.dat"; fbits = fopen(bitsFile, "rb"); #else bitsFile = "e:\\speextrunktest\\samples\\malebits.dat"; fbits = fopen(bitsFile, "wb"); #endif inFile = "e:\\speextrunktest\\samples\\male.snd"; fin = fopen(inFile, "rb"); outFile = "e:\\speextrunktest\\samples\\maleout.snd"; fout = fopen(outFile, "wb+"); #if 0 dbgoutFile = "e:\\speextrunktest\\samples\\maledbgout.snd"; fdbgout = fopen(dbgoutFile, "wb+"); #endif speex_bits_init(&bits); #ifndef DECODE_ONLY while (!feof(fin)) { fread(in_short, sizeof(short), FRAME_SIZE, fin); #if 0 fwrite(in_short, sizeof(short), FRAME_SIZE, fdbgout); #endif if (feof(fin)) break; speex_bits_reset(&bits); speex_encode_int(st, in_short, &bits); nbBits = speex_bits_write(&bits, cbits, 200); bitCount+=bits.nbBits; fwrite(cbits, 1, nbBits, fbits); speex_bits_rewind(&bits); #else /* DECODE_ONLY */ while (!feof(fbits)) { fread(cbits, 1, 20, fbits); if (feof(fbits)) break; speex_bits_read_from(&bits, cbits, 20); bitCount+=160; #endif speex_decode_int(dec, &bits, out_short); speex_bits_reset(&bits); fwrite(&out_short[skip_group_delay], sizeof(short), FRAME_SIZE-skip_group_delay, fout); skip_group_delay = 0; #if 1 fprintf (stderr, "Bits so far: %d \n", bitCount); #endif } fprintf (stderr, "Total encoded size: %d bits\n", bitCount); speex_encoder_destroy(st); speex_decoder_destroy(dec); #ifndef DECODE_ONLY rewind(fin); rewind(fout); while ( FRAME_SIZE == fread(in_short, sizeof(short), FRAME_SIZE, fin) && FRAME_SIZE == fread(out_short, sizeof(short), FRAME_SIZE,fout) ) { float s=0, e=0; for (i=0;i<FRAME_SIZE;++i) { s += (float)in_short[i] * in_short[i]; e += ((float)in_short[i]-out_short[i]) * ((float)in_short[i]-out_short[i]); } seg_snr += 10*log10((s+160)/(e+160)); sigpow += s; errpow += e; snr_frames++; } fclose(fin); #endif fclose(fout); fclose(fbits); #ifndef DECODE_ONLY snr = 10 * log10( sigpow / errpow ); seg_snr /= snr_frames; fprintf(stderr,"SNR = %f\nsegmental SNR = %f\n",snr, seg_snr); #ifdef FIXED_DEBUG printf ("Total: %f MIPS\n", (float)(1e-6*50*spx_mips/snr_frames)); #endif #endif }
int main(int argc, char **argv) { char *inFile, *outFile, *bitsFile; FILE *fin, *fout, *fbits=NULL; short in[FRAME_SIZE]; float input[FRAME_SIZE], bak[FRAME_SIZE], bak2[FRAME_SIZE]; char cbits[200]; int nbBits; int i; void *st; void *dec; SpeexBits bits; int tmp; int bitCount=0; SpeexCallback callback; for (i=0;i<FRAME_SIZE;i++) bak2[i]=0; st = speex_encoder_init(&speex_nb_mode); dec = speex_decoder_init(&speex_nb_mode); callback.callback_id = SPEEX_INBAND_CHAR; callback.func = speex_std_char_handler; callback.data = stderr; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); callback.callback_id = SPEEX_INBAND_MODE_REQUEST; callback.func = speex_std_mode_request_handler; callback.data = st; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); tmp=0; speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp); tmp=0; speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); tmp=8; speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp); tmp=1; speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp); speex_mode_query(&speex_nb_mode, SPEEX_MODE_FRAME_SIZE, &tmp); fprintf (stderr, "frame size: %d\n", tmp); if (argc != 4 && argc != 3) { fprintf (stderr, "Usage: encode [in file] [out file] [bits file]\nargc = %d", argc); exit(1); } inFile = argv[1]; fin = fopen(inFile, "r"); outFile = argv[2]; fout = fopen(outFile, "w"); if (argc==4) { bitsFile = argv[3]; fbits = fopen(bitsFile, "w"); } speex_bits_init(&bits); while (!feof(fin)) { fread(in, sizeof(short), FRAME_SIZE, fin); if (feof(fin)) break; for (i=0;i<FRAME_SIZE;i++) bak[i]=input[i]=in[i]; speex_bits_reset(&bits); /* speex_bits_pack(&bits, 14, 5); speex_bits_pack(&bits, SPEEX_INBAND_CHAR, 4); speex_bits_pack(&bits, 'A', 8); speex_bits_pack(&bits, 14, 5); speex_bits_pack(&bits, SPEEX_INBAND_MODE_REQUEST, 4); speex_bits_pack(&bits, 7, 4); speex_bits_pack(&bits, 15, 5); speex_bits_pack(&bits, 2, 4); speex_bits_pack(&bits, 0, 16); */ speex_encode(st, input, &bits); nbBits = speex_bits_write(&bits, cbits, 200); bitCount+=bits.nbBits; printf ("Encoding frame in %d bits\n", nbBits*8); if (argc==4) fwrite(cbits, 1, nbBits, fbits); { float enoise=0, esig=0, snr; for (i=0;i<FRAME_SIZE;i++) { enoise+=(bak2[i]-input[i])*(bak2[i]-input[i]); esig += bak2[i]*bak2[i]; } snr = 10*log10((esig+1)/(enoise+1)); printf ("real SNR = %f\n", snr); } speex_bits_rewind(&bits); speex_decode(dec, &bits, input); /* Save the bits here */ for (i=0;i<FRAME_SIZE;i++) { if (input[i]>32000) input[i]=32000; else if (input[i]<-32000) input[i]=-32000; } speex_bits_reset(&bits); for (i=0;i<FRAME_SIZE;i++) in[i]=(short)input[i]; for (i=0;i<FRAME_SIZE;i++) bak2[i]=bak[i]; fwrite(in, sizeof(short), FRAME_SIZE, fout); } fprintf (stderr, "Total encoded size: %d bits\n", bitCount); speex_encoder_destroy(st); speex_decoder_destroy(dec); return 1; }
int test_enc(int argc, char **argv) { char *inFile, *outFile, *bitsFile; FILE *fin, *fout, *fbits=NULL; short in_short[FRAME_SIZE]; short out_short[FRAME_SIZE]; int snr_frames = 0; char cbits[200]; int nbBits; int i; void *st; void *dec; SpeexBits bits; spx_int32_t tmp; int bitCount=0; spx_int32_t skip_group_delay; SpeexCallback callback; st = speex_encoder_init(speex_lib_get_mode(SPEEX_MODEID_NB)); dec = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_NB)); /* BEGIN: You probably don't need the following in a real application */ callback.callback_id = SPEEX_INBAND_CHAR; callback.func = speex_std_char_handler; callback.data = stderr; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); callback.callback_id = SPEEX_INBAND_MODE_REQUEST; callback.func = speex_std_mode_request_handler; callback.data = st; speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback); /* END of unnecessary stuff */ tmp=1; speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp); tmp=0; speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); tmp=8; speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp); tmp=1; speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp); /* Turn this off if you want to measure SNR (on by default) */ tmp=1; speex_encoder_ctl(st, SPEEX_SET_HIGHPASS, &tmp); speex_decoder_ctl(dec, SPEEX_SET_HIGHPASS, &tmp); speex_encoder_ctl(st, SPEEX_GET_LOOKAHEAD, &skip_group_delay); speex_decoder_ctl(dec, SPEEX_GET_LOOKAHEAD, &tmp); skip_group_delay += tmp; if (argc != 4 && argc != 3) { fprintf (stderr, "Usage: encode [in file] [out file] [bits file]\nargc = %d", argc); exit(1); } inFile = argv[1]; fin = fopen(inFile, "rb"); outFile = argv[2]; fout = fopen(outFile, "wb+"); if (argc==4) { bitsFile = argv[3]; fbits = fopen(bitsFile, "wb"); } speex_bits_init(&bits); while (!feof(fin)) { fread(in_short, sizeof(short), FRAME_SIZE, fin); if (feof(fin)) break; speex_bits_reset(&bits); speex_encode_int(st, in_short, &bits); nbBits = speex_bits_write(&bits, cbits, 200); bitCount+=bits.nbBits; if (argc==4) fwrite(cbits, 1, nbBits, fbits); speex_bits_rewind(&bits); speex_decode_int(dec, &bits, out_short); speex_bits_reset(&bits); fwrite(&out_short[skip_group_delay], sizeof(short), FRAME_SIZE-skip_group_delay, fout); skip_group_delay = 0; } fprintf (stderr, "Total encoded size: %d bits\n", bitCount); speex_encoder_destroy(st); speex_decoder_destroy(dec); speex_bits_destroy(&bits); #ifndef DISABLE_FLOAT_API { float sigpow,errpow,snr, seg_snr=0; sigpow = 0; errpow = 0; /* This code just computes SNR, so you don't need it either */ rewind(fin); rewind(fout); while ( FRAME_SIZE == fread(in_short, sizeof(short), FRAME_SIZE, fin) && FRAME_SIZE == fread(out_short, sizeof(short), FRAME_SIZE,fout) ) { float s=0, e=0; for (i=0;i<FRAME_SIZE;++i) { s += (float)in_short[i] * in_short[i]; e += ((float)in_short[i]-out_short[i]) * ((float)in_short[i]-out_short[i]); } seg_snr += 10*log10((s+160)/(e+160)); sigpow += s; errpow += e; snr_frames++; } snr = 10 * log10( sigpow / errpow ); seg_snr /= snr_frames; fprintf(stderr,"SNR = %f\nsegmental SNR = %f\n",snr, seg_snr); #ifdef FIXED_DEBUG printf ("Total: %f MIPS\n", (float)(1e-6*50*spx_mips/snr_frames)); #endif } #endif fclose(fin); fclose(fout); return 0; }
int main(int argc, char **argv) { char *inFile, *outFile, *bitsFile; FILE *fin, *fout, *fbits=NULL; short in[FRAME_SIZE]; float input[FRAME_SIZE], bak[FRAME_SIZE], bak2[FRAME_SIZE]; char cbits[200]; int nbBits; int i; void *st; void *dec; SpeexBits bits; int tmp; int bitCount=0; for (i=0;i<FRAME_SIZE;i++) bak2[i]=0; st = speex_encoder_init(&speex_uwb_mode); dec = speex_decoder_init(&speex_uwb_mode); tmp=0; /*speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp); tmp=0; speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp); tmp=10; speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp); tmp=3; speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp); tmp=3; speex_encoder_ctl(st, SPEEX_SET_HIGH_MODE, &tmp); tmp=6; speex_encoder_ctl(st, SPEEX_SET_LOW_MODE, &tmp); */ if (argc != 4 && argc != 3) { fprintf (stderr, "Usage: encode [in file] [out file] [bits file]\nargc = %d", argc); exit(1); } inFile = argv[1]; fin = fopen(inFile, "r"); outFile = argv[2]; fout = fopen(outFile, "w"); if (argc==4) { bitsFile = argv[3]; fbits = fopen(bitsFile, "w"); } speex_bits_init(&bits); while (!feof(fin)) { fread(in, sizeof(short), FRAME_SIZE, fin); if (feof(fin)) break; for (i=0;i<FRAME_SIZE;i++) bak[i]=input[i]=in[i]; speex_bits_reset(&bits); speex_encode(st, input, &bits); nbBits = speex_bits_write(&bits, cbits, 200); bitCount+=bits.nbBits; printf ("Encoding frame in %d bits\n", nbBits*8); if (argc==4) fwrite(cbits, 1, nbBits, fbits); { float enoise=0, esig=0, snr; for (i=0;i<FRAME_SIZE;i++) { enoise+=(bak2[i]-input[i])*(bak2[i]-input[i]); esig += bak2[i]*bak2[i]; } snr = 10*log10((esig+1)/(enoise+1)); printf ("real SNR = %f\n", snr); } speex_bits_rewind(&bits); speex_decode(dec, &bits, input); /* Save the bits here */ for (i=0;i<FRAME_SIZE;i++) { if (input[i]>32000) input[i]=32000; else if (input[i]<-32000) input[i]=-32000; } speex_bits_reset(&bits); for (i=0;i<FRAME_SIZE;i++) in[i]=(short)input[i]; for (i=0;i<FRAME_SIZE;i++) bak2[i]=bak[i]; fwrite(in, sizeof(short), FRAME_SIZE, fout); } fprintf (stderr, "Total encoded size: %d bits\n", bitCount); speex_encoder_destroy(st); speex_decoder_destroy(dec); speex_bits_destroy(&bits); fclose(fin); fclose(fout); return 1; }