开始分析RNNoise的C代码细节。
RNNoise用到3种**函数,分别是tanh(x)、sigmoid(x)和ReLU(x)。
1、tanh用到了查表法,查表法一般使用线性插值方法,此处使用泰勒级数展开。推导过程如下:
tanh(x) = (exp(x) − exp(−x))/(exp(x) + exp(−x))
tanh(x)' = 1-(tanh(x))^2
泰勒级数取前三项得f(x) = f(x0)+f’(x0)*(x-x0) +1/2*f’’(x0)*(x-x0)^2。
设y = f(x0), dy = f’(x0),
则dy=1-y*y, f’’(x0)=-2y*dy.
f(x) = y + dy*(x-x0) + 1/2*(-2y*dy)*(x-x0)^2
= y + dy*(x-x0) - y*dy*(x-x0)^2
= y+ dy*(x-x0)*[1-y*(x-x0)]
2、sigmoid(x)没有调用exp(x),而是调用tanh(x)。推导过程如下:
sigmoid(x)=1/(1+exp(-x))
tanh(x)=(1-exp(-2x))/(1+exp(-2x))
=2/(1+exp(-2x))-1
=2*sigmoid(2x)-1
最终得到sigmoid(x)=0.5+0.5*tanh(x/2)。
更多内容,请关注微信公众号“音频算法与工程实践”。