【问题标题】:Filtering and Distorting Audio stored in byte array Java过滤和扭曲存储在字节数组 Java 中的音频
【发布时间】:2020-03-19 02:48:36
【问题描述】:

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

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

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

我不确定从哪里开始,但如果您知道任何可以映射为函数的解决方案,我将不胜感激。

【问题讨论】:

  • 关于 Java 中的音频处理,Jipes 可能会有所帮助,尽管它看起来只是适合这个。关于如何做 DSP 部分,我会在 dsp.stackexchange.com 上问这个问题

标签: java audio javasound audio-processing


【解决方案1】:

需要的元素:

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

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

我个人最喜欢的失真是tanh 函数。我用于合成补丁的 Java 代码如下:

float distortVal = (float)Math.tanh(noteVal * (1 + timbreNormal * 5));

在这种情况下,noteVal 是单个 PCM 值。我有一个变量timbreNormal,范围从 0 到 1,并且正在从相当于脚踏控制器的位置读取它。 “幻数”反模式值 5 是我懒惰地输入的常数。它决定了在应用失真算法之前放大信号的最大量。无论您使用哪种失真算法,失真的强度将取决于您在应用算法之前放大信号的程度。如果你想要更微妙的效果,“幻数”值可以设置得更低。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2010-11-05
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多