我还没有开始编码一个部分,但想知道是否有人之前知道这个解决方案/是否有任何对它有用的来源。
我正试图在44.1 Khz PCM 16位(小端序(音频数据的字节阵列上模拟磁带饱和,该数据已经被录制(我有一个录制类已经准备好并正在运行(。我想扭曲和过滤数据字节,以模仿磁带的声音。
理论上,我认为我们需要使用对称的软剪辑来处理失真(我已经看过本教科书中第118页的数字音频FX示例,我只是不知道如何实现它:https://books.google.it/books?id=h90HIV0uwVsC&printsec=封面&hl=en#v=onepage&q&f=false(,然后用低通滤波器对整个信号进行滤波?
我真的不知道从哪里开始,但如果你知道任何可以映射到函数中的解决方案,我会非常感激
所需元素:
- 读取字节(如果数据未保存在内存阵列中,则可能通过
AudioInputStream
( - 将音频数据字节转换为PCM
- 过采样
- 应用失真函数
- 抗混叠滤波
- 抽取
- 转换回字节
- 通过
SourceDataLine
输出
我不知道什么是最适合你的失真算法。DSP相关的免费书籍《物理音频信号处理》中有许多建议。我记得斯坦福大学的CCRMA也有一些关于这方面的有趣文章,但我手头没有链接。
我个人最喜欢的失真是tanh
函数。我用于合成补丁的Java代码得到了相当厚的吉他般的失真,如下所示:
float distortVal = (float)Math.tanh(noteVal * (1 + timbreNormal * 5));
在这种情况下,noteVal
是单个PCM值。我有一个从0到1的变量timbreNormal
,我正在从相当于脚踏板控制器的地方读取它。"幻数"反模式值5是我懒洋洋地输入的一个常数。它决定了在应用失真算法之前信号放大的最大量。无论你使用什么失真算法,失真的强度都取决于你在应用算法之前放大信号的程度。如果你想要一个更微妙的效果,"幻数"值可以设置得更低。
过采样对过滤步骤有很大帮助。我过采样了8,并且使用了双极巴特沃斯滤波器。我必须做一些重要的挖掘才能找到过滤器设计中使用的值。但我认为你可以从这个答案中得到程序流程的要点。