低通滤波器强大
我已经实现了一个基本的Karplus-Strong算法。
Ringbuffer充满白噪声,从前面输出一个采样,并将前两个元素的平均值添加到结尾,并删除第一个元素。 重复上一步到步骤。
为了获得更好的结果并对它们进行控制,我尝试实现该算法的扩展版本。
因此,我不需要平均滤波器,而需要像低通滤波器那样的频率滤波器。
我的平均滤波器有两个输入和一个输出:avg(a,b)=(a + b)/ 2
维基百科页面上的示例代码提供了许多输出作为输入。
http://en.wikipedia.org/wiki/Low-pass_filter
我发现了其他(数学)版本,如:
http://cnx.org/content/m15490/latest/
H(z)=(1+(1 / z))/ 2
我猜z是一个复数。
两个版本都有两个输入,但也有两个输出。
我如何从中得到一个有意义的价值?
或者我必须重写算法的更大部分?
如果那是我可以找到一个很好的解释它的情况?
您的滤波器是有限脉冲响应滤波器的一个特殊功能。 您使用移动平均法来选择系数,使用N = 1。它已经是一个低通滤波器。
计算滤波器调谐到特定频率响应的系数和顺序涉及到棘手的数学问题。 最好的办法是使用软件包来计算系数,如果移动平均数不符合您的账单。 Matlab是通常的选择,GNU Octave是一个开源选项。
过滤器可以用多种方式表达:
y[i] = h[0]*x[i] + h[1]*x[i-1] + h[2]*x[i-2] + ...
其中第二个实际上是h和x数组的卷积。 这也是最容易理解的。
以前的答案解释了从哪里开始构建过滤器。 假设你的滤波器系数是h
,那么它只是对非负滤波器系数进行求和。
我相信我明白你在问什么。 尽管你不需要超过一个输出。 从维基百科页面开始,Karplus-Strong字符串合成算法需要一个长度为L的缓冲区。如果我们有M个滤波器系数( h
)给出一个输出形式,
y[i] = x[i] + h[0]*y[iL] + h[1]*y[i-(L+1)] + h[2]*y[i-(L+2)] + ...
这里的Karplus-Strong合成使用环形缓冲区来保存最后的L个输出y[i-1],...,y[iL]
。 这被初始化为i<=L
的x[i]
噪声值; 然而,对于i>L
x[i]=0
。 由于您只存储L值,因此算法将具有空间效率。 i>L
的信号x[i]
刚刚添加到环形缓冲区中。
最后,作为警告的提示,如果你不注意系数h
和值的数量,那么输出y
可能不具有期望的行为。