SoundTouch音频处理库源码分析及算法提取(9)


  我们都知道,当播放速度改变的时候,会带来一个副作用,那就是音调也会随着播放的速度而改
变。播放速度加快,声音将升调,变得尖锐,播放速度减慢,声音将降调,变得低沉,当然这是题
外之话。改变音频播放速度的方法有很多,我只针对ST变速算法的核心,也就是线性插值算法的实
现。对于ST的插值算法前面已经提到。
  k = (y - y0)/(y1-y0)
->y=(1-k) * y0+k * y1
k值也就是现在声音播放速度和原始声音播放速度
摘要由CSDN通过智能技术生成

  我们都知道,当播放速度改变的时候,会带来一个副作用,那就是音调也会随着播放的速度而改

变。播放速度加快,声音将升调,变得尖锐,播放速度减慢,声音将降调,变得低沉,当然这是题

外之话。改变音频播放速度的方法有很多,我只针对ST变速算法的核心,也就是线性插值算法的实

现。对于ST的插值算法前面已经提到。
  k = (y - y0)/(y1-y0)
->y=(1-k) * y0+k * y1
k值也就是现在声音播放速度和原始声音播放速度的比。也就是加快/减慢的比率。从这个公式上看

,k为比率已知,y1为当前已知的一个采样值,y值和原来的位置y0有关,如何理解呢?假如你把一

连串的采样分成若干段,每次拿一段出来处理,在某段的结尾和紧接的一段之间做插值算法,就要

保存前一段结尾的采样点。这下子好理解了吧。因此针对16位双声道的音频输入,我们需要先定义

两个变量(左右声道)来保存前面的值。
short sPrevSampleL = 0,sPrevSampleR = 0;
然后算法实现如下:
第一个参数表示比率,可以理解为插值的间距,越小帧插得越多,播放速度也就越慢,越大帧插得

少或者直接跳过,播放速度也就越快。
uint InterpolationStereo(float fRate,short *dest,short *src,uint nSamples)
{
    uint srcPos = 0, i = 0, used = 0;
 float fSlopeCount = 0.0f;
 
    if (nSamples == 0) return 0;
    while (fSlopeCount <= 1.0f)
    {
        dest[2 * i] = (short)((1.0f - fSlopeCount) * sPrevSampleL + fSlopeCount * src

[0]);
        dest[2 * i + 1] = (short)((1.0f - fSlopeCount) * sPrevSampleR

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值