2012-03-11 3 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 16384 -512 512 -768 -2048 -1280 -1024 256 12288 0 8192 253 12288 256 -768 -768 -512 -16 0 -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 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

// 디코딩 프레임 .totally 다른 버퍼 BACK 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 - -6636 -793 -2123 -354 991 -1947 3958 -1070 1380 -2120 -2777 -679 -933 3922 -6289 7423 -557 -1152 1,096 229 425 5,825 -311 -703 586 1110 1016 789 5084 -2395 -2916 -225 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

최대 글자 수 한도를 초과 할 수 없습니다. –

관련 문제