自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(9)
  • 收藏
  • 关注

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

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

2010-09-18 13:52:00 3006 1

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

  经过前面几个小节的介绍,各位想必已经对ST有个比较初步的认识。在往后的这些章节里,我将提出ST某些重要的算法以及实现。首先谈谈数字滤波器的实现。纵观整个ST的处理流程,仅仅在对声音样本进行重采样的时候可以通过bool bUseAAFilter的值来判断是否采用数字滤波器,具体在RateTransposer类成员函数processSamples中实现。// Transposes sample rate by applying anti-alias filter to prevent folding. //

2010-09-18 10:29:00 2351 2

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

<br /> 上一节说到TDStretch类成员函数processSamples,粗略分析了一下大概。至于流程是通过TDStretch类成员函数putsamples调用processSamples进行处理,我们不难联想到前面对于SoundTouch类成员函数putSamples的分析。TDStretch类成员函数putSamples实现如下:<br />// Adds 'numsamples' pcs of samples from the 'samples' memory position into<br

2010-09-16 18:25:00 2480

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

<br />TDStretch类的实现<br />SoundTouch类成员函数putSamples(const SAMPLETYPE *samples, uint nSamples)实现如下,根据上篇的分析rate是一个比率,大于1表示速度加快,小于1表示速度减慢,对于播放速度减慢这种情况。<br />……<br />#ifndef PREVENT_CLICK_AT_RATE_CROSSOVER<br />    else if (rate <= 1.0f) <br />    {<br />      

2010-09-04 16:58:00 2851 1

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

变速类RateTransposer的实现回到SoundTouch类成员函数void SoundTouch::putSamples(const SAMPLETYPE *samples, uint nSamples)。定义一个SoundTouch类变量之后,通过简单地调用这个类函数,就可以实现音频的相关处理。分析一下他的调用形式,也很简单,第一个参数SAMPLETYPE *samples,指向一个以PCM编码的wave数据缓冲区,第二个参数uint nSamples,就是这个数据缓冲区包含的Sample个数,前

2010-09-02 14:42:00 3247

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

SoundTouch构造流程初始化的一点补充。在SoundTouch类构造函数中,我们留意到有这么一个函数calcEffectiveRateAndTempo()SoundTouch::SoundTouch(){    // Initialize rate transposer and tempo changer instances    pRateTransposer = RateTransposer::newInstance();    pTDStretch = TDStretch::newInstanc

2010-08-31 16:19:00 2823

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

SoundTouch音频处理库初始化流程剖析 2紧接上文《SoundTouch音频处理库初始化流程剖析》TDStretch类和基类的关系:FIFOSamplePipe -> FIFOProcessor ->TDStretchSoundTouch类成员class TDStretch *pTDStretch变量的初始化在SoundTouch的构造函数SoundTouch::SoundTouch()中进行。pTDStretch = TDStretch::newInstance();他通

2010-08-28 16:36:00 3076 1

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

SoundTouch音频处理库初始化流程剖析定义一个变量SoundTouch m_SoundTouch;SoundTouch的派生关系FIFOSamplePipe->FIFOProcessor->SoundTouch (流程[1])因此首先构造基类FIFOSamplePipe,接着派生出FIFOProcessor,然后才以FIFOProcessor派生出SoundTouch。这里不得不提一下老外的C++水平真的很高,在这里基本上把类的继承发挥到了极致。能够分析这样的代码简直就是一种享受。先看一下基类FIFO

2010-08-28 12:17:00 4476 3

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

<br />SoundTouch音频处理库的使用异常简单,经过简单的编译之后,设置编译环境,以vc为例<br />,直接在include包含SoundTouch目录下的include路径,接着在lib添加SoundTouch目录下<br />的lib路径,然后在代码的头文件中添加头文件以及引用的库。如下:根据_DEBUG这个宏,<br />我们可以进行一些编译预处理,假如是以DEBUG编译就采用debug库,其他的话就采用<br />release库。他们的区别就是文件名后面是否多了一个“D”。<br />

2010-08-27 14:14:00 10473 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除