Кадр, декодированный Speex, отличается от исходного кадра

Мне нужна ваша помощь в определении проблемы в следующем примере кода (взятом из руководства по Speex) для кодирования с фиксированной точкой. я протестировал кодирование кадра из 160 выборок, а затем декодирование его обратно. Но проблема в том, что декодированный кадр полностью отличается от исходного кадра (см. Вывод ниже в комментарии). Какова возможная причина этого? Спасибо за любую помощь.

#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;
}

person Mashal al-shboul    schedule 11.03.2012    source источник
comment
ВЫВОД: // исходный кадр 1 -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 -516 -8368 -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   -  person Mashal al-shboul    schedule 11.03.2012
comment
// декодированный кадр .совершенно другой BUFFER DECODED 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 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 -2 -193 7423 -663 6423 -66 1947 3958 -1070 1380 -2120 -2777 -679 9010   -  person Mashal al-shboul    schedule 11.03.2012
comment
См. мой ответ на этот вопрос: stackoverflow.com/a/10048755/273501   -  person Thilo Köhler    schedule 07.04.2012
comment
как вы решили эти 000000000000 в начале декодированного кадра? Я испортил эту конкретную проблему в настоящее время.? заранее спасибо...   -  person guness    schedule 26.01.2013


Ответы (1)


Speex — это кодек с потерями. Это означает, что выходные данные декодера обычно немного отличаются от входных данных кодировщика. Поскольку Speex разрешено немного изменять данные, он может сильнее сжимать данные.

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

person rob mayoff    schedule 11.03.2012
comment
Спасибо за ответ. Вы имеете в виду, что декодирование обратного кадра приведет к тому, что кадр будет отличаться от закодированного? .. до степени существенной разницы, показанной выше (в комментариях, БУФЕР ДЕКОДИРОВАНО ОБРАТНО)? есть ли способ убедиться, что Speex работает правильно? - person Mashal al-shboul; 11.03.2012
comment
Не оставляйте свой вывод в комментариях. Отредактируйте свой вопрос и вставьте его туда в формате кода. - person rob mayoff; 11.03.2012
comment
я не могу превышать максимальное количество символов! - person Mashal al-shboul; 12.03.2012