一种FIFO的采样率调节方法
Sample rate adjustment with FIFO.
挑战
有时候你采样速率和需要的音频播放速率比例不整, 比如51.2k采样, 11.025k播放。你可以用重采样解决,但是这里有一个极低计算量的低质量重采样方法。
原理
输入采样率 Fi,输出采样率Fo,假设两者非常接近,比如一个是
51200 / 4 = 12800,另一个是11025。
输入点间隔时间 Ti = 1 / Fi;
输出点间隔时间 To = 1 / Fo;
当To>Ti时,经过x个采样点, x To >= (x+1) Ti,则需要在输出添加一个点,这个可以通过读出最后一个点,但是不弹出缓存,也就是下一个点再重复一遍。
当To<Ti时,经过x个采样点, x To <= (x-1) Ti,则需要在输入减少一个点,这个可以通过忽略下一个采样点写入实现。
编程判断
假设你需要万分之一的准确度,计算每个采样点的10000倍误差:
int dT10000 = 10000 * (To - Ti)
如果dT10000>0 就在输出累积,反之在输入累积。 预先定义
int DT=0;
每次读出或写入时,计算
// 对dT1000>0在读出部分做
DT +=dT10000;
If(DT > 10000)
{
DT -=10000;
读出不动指针;
}
//对dT10000<0在输入部分做
DT +=dT10000;
If(DT < 10000)
{
DT +=10000;
忽略输入一次;
}
···