过滤和失真存储在字节数组Java中的音频



我还没有开始编码一个部分,但想知道是否有人之前知道这个解决方案/是否有任何对它有用的来源。

我正试图在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,并且使用了双极巴特沃斯滤波器。我必须做一些重要的挖掘才能找到过滤器设计中使用的值。但我认为你可以从这个答案中得到程序流程的要点。

最新更新