FreeVerb中滤波器使用总结

来源:互联网 发布:基因优化液 编辑:程序博客网 时间:2024/06/05 22:55

如需转载请注明出处!


FreeVerb核心算法还是使用的Schroeder Reverb算法,采用了8个comb filter并联,4个allpass filter串联的结构。

鉴于Google出来的FreeVerb中使用的滤波器数学表达良莠不齐,为了避免混淆视听,结合算法实现,本人对FreeVerb中实际的滤波器数学表达进行总结描述。


Lowpass comb filter: (在comb的feedback结构中,加入一阶低通滤波器来模拟低频-高频成分不同的反射传播衰减程度)

$\displaystyle \hbox{LBCF}_{N}^{\,f,\,d} \;\isdef \; \frac{z^{-N}}{1 - f\frac{1-d}{1-d\,z^{-1}}\,z^{-N}}.$


Allpass filter:

$\displaystyle \hbox{AP}_{N}^{\,g} \approx \frac{-1 + (1+g)z^{-N}}{1 - g z^{-N}}.$

代码表示为:

inline float allpass::process(float input)
{
float output;
float bufout;

bufout = buffer[bufidx];
undenormalise(bufout);

output = -input + bufout;
buffer[bufidx] = input + (bufout*feedback);


if(++bufidx>=bufsize) bufidx = 0;


return output;
}


实测该allpass filter并不满足严格的allpass特性。

为了更明晰的展示Freeverb中所使用的allpass filter,代码可改为:

inline float allpass::process(float input)
{
float output;
float bufout;

bufout = buffer[bufidx];
undenormalise(bufout);

buffer[bufidx] = input + (bufout*feedback);

output = -buffer[bufidx] + (1+feedback)*bufout;


if(++bufidx>=bufsize) bufidx = 0;


return output;
}



真正的allpass filter可表达为:

$\displaystyle \hbox{AP}_{N}^{\,g} \isdef \frac{-g + z^{-N}}{1 - g z^{-N}}$

故可修改FreeVerb源码:

inline float allpass::process(float input){        float output;        float bufout;                bufout = buffer[bufidx];        undenormalise(bufout);                buffer[bufidx] = input + (bufout*feedback);        output = -buffer[bufidx]*feedback + bufout;        if(++bufidx>=bufsize) bufidx = 0;        return output;}

0 0
原创粉丝点击