简介
- 算法速度快
- 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); |