我还没有开始编写部分代码,但是想知道是否有人对此解决方案具有先验知识/是否有任何有用的资源。
我正在尝试在已经记录过的44.1 Khz PCM 16位(小尾数)音频数据的字节数组上模拟磁带饱和(我已经准备好并且可以正常使用的记录类)。我想扭曲并过滤数据字节以模拟磁带的声音。
理论上,我认为我们需要使用对称的软削波来消除失真(我已经看过本书第118页上的数字音频FX的示例,我只是不知道如何实现它:https://books.google.it/books?id=h90HIV0uwVsC&printsec=frontcover&hl=en#v=onepage&q&f=false),然后使用低通滤波器对整个信号进行滤波?
我不确定从哪里真正开始,但是如果您知道任何可以映射到函数中的解决方案,我将非常感谢。
所需元素:
AudioInputStream
读取字节]SourceDataLine
输出我不知道什么是最佳失真算法。 DSP相关的免费书籍Physical Audio Signal Processing中有许多建议。我记得斯坦福大学的CCRMA也有一些有趣的文章,但是我没有方便的链接。
我个人最喜欢的失真是[C0]功能。我在用于合成补丁的Java代码中获得了类似吉他的相当粗大的失真,如下所示:
tanh
在这种情况下,float distortVal = (float)Math.tanh(noteVal * (1 + timbreNormal * 5));
是单个PCM值。我有一个范围从0到1的变量noteVal
,并且正在从等效的脚踏板控制器中读取它。 “魔数”反模式值5是我懒惰地放入的常数。它确定在应用失真算法之前放大信号的最大数量。无论您使用哪种失真算法,失真的强度都将取决于您在应用算法之前放大信号的程度。如果您想要更细微的效果,可以将“幻数”值设置得更低。
过采样有助于过滤步骤。我对8采样过高,并且正在使用两极巴特沃斯滤波器。我必须进行一些重要的挖掘才能找到滤波器设计中使用的值。但我认为您可以从此答案中了解程序流程的要点。