2012-03-11 105 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 -1024 256 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 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 – 2012-03-11 07:02:04

+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 – 2012-03-11 07:11:02

+0

看到我对这个问题的回答:http://stackoverflow.com/a/10048755/273501 – 2012-04-06 20:21:51

回答

0

Speex是一个有损编解码器。这意味着解码器的输出通常会与编码器的输入有所不同。由于Speex允许稍微改变数据,它可以更多地压缩数据。

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

+0

谢谢你的回复。你的意思是解码回一帧将导致不同的编码?..到上面显示的主要区别(在评论中,缓冲区解码后)的程度?有没有一种方法可以确保Speex正常工作? – 2012-03-11 11:23:13

+0

请勿将您的输出置于评论中。编辑你的问题并粘贴在那里,格式化为代码。 – 2012-03-11 18:37:32

+0

我不能超过最大字符数限制! – 2012-03-12 18:27:26