2012-03-11 20 views
0

固定小数点エンコーディングの場合、次のサンプルコード(speexマニュアルから取得したもの)で問題を特定する上で助けが必要です。 私は160サンプルのフレームをエンコードしてからそれをデコードしましたが、問題はデコードされたフレームが元のフレームとまったく異なっていることです(コメントの下の出力を参照してください)。Speexデコードされたフレームが元のフレームと同じではありません

#include<stdio.h> 
#include"intel16.h" 
#include <speex/speex.h> 
#define FRAME_SIZE 160 
#define MAX_NB_BYTES 25 

SpeexBits bits; 
void *enc_state; 
int quality=4;  
int nbBytes; 

int byte_ptr; 

int frame_size; 

short frame[FRAME_SIZE]; 

char outBuffer[20]; 
SpeexBits decBits; 

void *dec_state; 

short decFrame[FRAME_SIZE]; 

int z=0; 

int frame_size; 

int main (int argc,char **argv) 
{ 
for(z=0;z<160;z++) 
    { 
    frame[z]=intel_theme[z]; //array of short from "intel16" header file 
    } 
printf("\n =================================== \n"); 

for(z=0;z<160;z++) 
    { 
     printf("%i",frame[z]); 
    printf (" "); 
     } 
    speex_bits_init(&bits); 

    enc_state = speex_encoder_init(&speex_nb_mode); 



    speex_encoder_ctl(enc_state,SPEEX_GET_FRAME_SIZE,&frame_size); 

    speex_encoder_ctl(enc_state,SPEEX_SET_QUALITY,&quality); 

    speex_bits_reset(&bits); 

     speex_encode_int(enc_state, frame, &bits);  
      // encoding from frame to &bits 
    nbBytes = speex_bits_write(&bits, outBuffer, MAX_NB_BYTES); 
     //writing from &bits to outBuffer 
//----------------------------------------------------  
    speex_bits_destroy(&bits); 

    speex_encoder_destroy(enc_state); 

    printf("\n outBuffer: "); 

     for(z=0;z<20;z++) 
    { 
    printf("%c",outBuffer[z]); 
    } 
    printf("\n \n"); 

//-----------DECODING------------------- 
speex_bits_init(&decBits); 
dec_state=speex_decoder_init(&speex_nb_mode); 
speex_decoder_ctl(dec_state, SPEEX_GET_FRAME_SIZE, &frame_size); 


speex_bits_read_from(&decBits,outBuffer,nbBytes); 
speex_decode_int(dec_state,&decBits,decFrame); 
//---------------------------------------------------- 
printf("\n BUFFER DECODED BACK \n"); 

for(z=0;z<160;z++) 
{ 
printf("%i",decFrame[z]); 
printf (" "); 
} 

speex_bits_destroy(&decBits); 
speex_decoder_destroy(dec_state); 
/*==========END OF DECODING==============*/ 
printf("\n nbBytes: "); 
printf("%i",nbBytes); 
printf("\n frame_size= "); 
printf("%i",frame_size); 
printf ("\n"); 
//----------------- 
printf("end of run!"); 

return 0; 
} 
+0

OUTPUT: //オリジナルフレーム 1 -512 16384 512 -768 -2048 -1280 256 -1024 12288 0 8192 253 256 -768 12288 0 -16 -768 -512 0 -1 - 512 -768 -1536 -512 -512 -768 16384 0 8192 -512 16384 512 -768 -2048 -1280 256 -1024 12288 0 8192 253 256 -768 12288 0 -16 -768 -512 -1 0 -512 -768 - 1536 -512 -512 -768 16384 0 8192 -512 16384 512 -768 -2048 -1280 256 -1024 12288 0 8192 253 256 -768 12288 0 -16 -768 -512 -1 0 -512 -768 -1536 -512 - 512 -768 -4136 –

+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 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 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 0 0 0 0 0 0 0 0 0 0 2838 -3982 4801 -4136 432 -1945 610 1035 -1090 2752 -558 1431 -2320 - 1016 789 5084 -2395 -2916 -225 -311 -703 586 1110 -557 -1152 1096 229 425 5825 -933 3922 -6289 7423 -6636 -793 -2123 -354 991 -1947 3958 -1070 1380 -2120 -2777 -679 9010 –

+0

この質問への私の答えを参照してください:http://stackoverflow.com/a/10048755/273501 –

答えて

0

Speexは損失の多いコーデックです。つまり、デコーダからの出力は、通常、エンコーダへの入力と少し異なります。 Speexはデータを少し変更することが許可されているため、データをより多く圧縮することができます。

http://www.speex.org/docs/manual/speex-manual/node4.html#SECTION00413000000000000000

+0

返信ありがとうございます。フレームをデコードすると、エンコードされたものとは異なる結果になりますか?上記の大きな違いの程度(コメント、BUFFER DECODED BACK) Speexが正しく動作するようにする方法はありますか? –

+0

出力をコメントに入れないでください。質問を編集し、そこにコードとして書式を設定して貼り付けます。 –

+0

私は最大文字数制限を超えることはできません! –

関連する問題