牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

SPEEX重采样分析(一)

转载自:http://blog.csdn.net/ahyswang/article/details/7675390

简介

  • 算法速度快
  • SIMD(SSE)指令支持
  • 低内存
  • 高质量

该算法是基于最原始的重采样算法:

   Smith, Julius O. Digital Audio ResamplingHome Page
   Center for Computer Research in Music and Acoustics (CCRMA), 
   Stanford University, 2007.
   Web published at http://www-ccrma.stanford.edu/~jos/resample/.

 

这里使用cubic   interpolation代替linear interpolation。减少CPU时间,能更好使用SIDM算法。

 

接口

speex_resampler_init

功能

创建实例

函数

SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels,                                           spx_uint32_t in_rate,

spx_uint32_t out_rate,                                             int quality,                                          

int *err);

参数

nb_channels [in] 通道数

in_rate     [in] 输入音频的采样率

out_rate    [in] 输出音频的采样率

quality     [in] 重采样质量

err         [out] 错误码

返回值

成功返回实例句柄,失败返回NULL

简介

 

 

 

 

speex_resampler_init_frac

功能

根据input/output比例来创建实例

函数

SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels,                                                spx_uint32_t ratio_num,    

spx_uint32_t ratio_den,                                                 spx_uint32_t in_rate,                                                      spx_uint32_t out_rate,                                                  int quality,

int *err);

参数

nb_channels    [in]通道数

ratio_num      [in]比例分子                  

ratio_den      [in]比例分母       

in_rate        [in]输入的采样率 

out_rate       [in]输出的采样率

quality        [in]重采样质量

err            [out]错误码

返回值

成功返回实例句柄,失败返回NULL

简介

 

 

 

speex_resampler_destroy

功能

销毁实例

函数

void speex_resampler_destroy(SpeexResamplerState *st);

参数

St [in] 实例句柄

返回值

void

简介

释放资源

 

 

 

speex_resampler_process_float

功能

重采样浮点序列

函数

int speex_resampler_process_float(SpeexResamplerState *st,                                  

spx_uint32_t channel_index,                                   const float *in,                                              spx_uint32_t *in_len,

float *out,                                                   spx_uint32_t *out_len);    

参数

St                [in]句柄

channel_index     [in]通道号

in                [in]输入缓存

in_len           [in]输入长度(返回处理的采样数)

out               [in]输出缓存

out_len           [in]输出长度(返回写入的采样数)

返回值

错误码

简介

输入和输出缓存不能重叠,外部准备缓存

 

 

 

speex_resampler_process_interleaved_float

功能

重采样交叉的多通道浮点数据(例如:双通道PCM)

函数

int speex_resampler_process_interleaved_float(SpeexResamplerState *st,                                                 

const float *in,

spx_uint32_t *in_len,

float *out,

spx_uint32_t *out_len);

参数

St                [in]句柄

in                [in]输入缓存

in_len           [in]输入长度(返回处理的采样数)

out               [in]输出缓存

out_len           [in]输出长度(返回写入的采样数)

返回值

错误码

简介

 

 

 

 

注:以上是主要的接口函数

 

示例

下面把16K的音频转换为8k的音频

    st = speex_resampler_init(1, 16000, 8000, 10, &err);

 

    do{

       readlen = fread(in, sizeof(short), 1024, fin);

       if (readlen > 0)

       {

           inlen = readlen;

           outlen = 1024;

           ret = speex_resampler_process_int(st, 0, in, &inlen, out, &outlen);

           if (ret == RESAMPLER_ERR_SUCCESS)

           {

              fwrite(out, sizeof(short), outlen, fout);

           }

       }

      

    }while(readlen == 1024);

   

    speex_resampler_destroy(st);

 

posted on 2013-02-05 12:06 杨粼波 阅读(5257) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理