繁体   English   中英

过滤和扭曲存储在字节数组 Java 中的音频

[英]Filtering and Distorting Audio stored in byte array Java

我还没有开始编写一个部分,但想知道是否有人事先了解这个解决方案/有任何对其有用的资源。

我正在尝试在已经记录的 44.1 Khz PCM 16 位(小端)音频数据的字节数组上模拟磁带饱和度(我有一个已经准备好的录音类并且正在运行)。 我想扭曲和过滤数据字节以模拟磁带的声音。

理论上,我认为我们需要对失真使用对称软剪辑(我已经查看了本教科书第 118 页上的数字音频 FX 示例,我只是不知道如何实现它: https ://books.google.it/books?id=h90HIV0uwVsC&printsec=frontcover&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,并使用了一个两极巴特沃斯滤波器。 我必须进行一些重要的挖掘才能找到滤波器设计中使用的值。 但我认为您可以从这个答案中了解程序流程的要点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM