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

问题描述 投票:0回答:1

我还没有开始编写部分代码,但是想知道是否有人对此解决方案具有先验知识/是否有任何有用的资源。

我正在尝试在已经记录过的44.1 Khz PCM 16位(小尾数)音频数据的字节数组上模拟磁带饱和(我已经准备好并且可以正常使用的记录类)。我想扭曲并过滤数据字节以模拟磁带的声音。

理论上,我认为我们需要使用对称的软削波来消除失真(我已经看过本书第118页上的数字音频FX的示例,我只是不知道如何实现它:https://books.google.it/books?id=h90HIV0uwVsC&printsec=frontcover&hl=en#v=onepage&q&f=false),然后使用低通滤波器对整个信号进行滤波?

我不确定从哪里真正开始,但是如果您知道任何可以映射到函数中的解决方案,我将非常感谢。

java audio javasound audio-processing
1个回答
1
投票

所需元素:

  • 读取字节(如果没有将数据保存在内存阵列中,则可能通过AudioInputStream读取字节]
  • 将音频数据字节转换为PCM
  • 超采样
  • 应用失真功能
  • 抗锯齿过滤
  • 抽取
  • 转换回字节
  • 通过SourceDataLine输出

我不知道什么是最佳失真算法。 DSP相关的免费书籍Physical Audio Signal Processing中有许多建议。我记得斯坦福大学的CCRMA也有一些有趣的文章,但是我没有方便的链接。

我个人最喜欢的失真是[C​​0]功能。我在用于合成补丁的Java代码中获得了类似吉他的相当粗大的失真,如下所示:

tanh

在这种情况下,float distortVal = (float)Math.tanh(noteVal * (1 + timbreNormal * 5)); 是单个PCM值。我有一个范围从0到1的变量noteVal,并且正在从等效的脚踏板控制器中读取它。 “魔数”反模式值5是我懒惰地放入的常数。它确定在应用失真算法之前放大信号的最大数量。无论您使用哪种失真算法,失真的强度都将取决于您在应用算法之前放大信号的程度。如果您想要更细微的效果,可以将“幻数”值设置得更低。

过采样有助于过滤步骤。我对8采样过高,并且正在使用两极巴特沃斯滤波器。我必须进行一些重要的挖掘才能找到滤波器设计中使用的值。但我认为您可以从此答案中了解程序流程的要点。

© www.soinside.com 2019 - 2024. All rights reserved.