好的,我已经在 C 中实现了 karplus strong 算法。这是一个简单的算法来模拟弹拨的弦音。您从长度为 n 的环形缓冲区开始(n = 您想要的采样频率/频率),将其通过一个简单的两点平均滤波器 y[n] = (x[n] + x[n-1])/2,输出它,然后将其反馈回延迟线。冲洗并重复。这会随着时间的推移消除噪音,从而产生自然的拨弦声。
但我注意到,对于整数延迟线长度,可以将几个高音调匹配到相同的延迟长度。此外,整数延迟长度不允许平滑变化的音高(如颤音或滑音)我已经阅读了几篇关于 karplus 算法扩展的论文,他们都谈到使用插值延迟线进行分数延迟或全通滤波器
http://quod.lib.umich.edu/cgi/p/pod/dod-idx?c=icmc;idno=bbp2372.1997.068
http://www.jaffe.com/Jaffe-Smith-Extensions-CMJ-1983 .pdf
http://www.music.mcgill.ca/~gary/courses/projects/618_2009/NickDonaldson/index.html
我之前已经实现了插值延迟线,但仅在波形缓冲区不变的波表上实现。我只是以不同的速度逐步完成延迟。但让我感到困惑的是,当谈到 KS 算法时,论文似乎在谈论实际改变延迟长度,而不仅仅是我逐步通过它的速率。ks 算法使事情变得复杂,因为我应该不断地将值反馈到延迟线中。
那么我将如何实施呢?我是否将内插值反馈回来或什么?我是否完全摆脱了两点平均低通滤波器?
全通滤波器将如何工作?我应该用全通滤波器替换 2 点平均滤波器吗?我如何使用线性插值法或全通滤波器法在远处的音高之间滑行?