iOS 上的自定义 EQ AudioUnit

Posted

技术标签:

【中文标题】iOS 上的自定义 EQ AudioUnit【英文标题】:Custom EQ AudioUnit on iOS 【发布时间】:2011-03-16 02:11:31 【问题描述】:

ios 上的唯一效果 AudioUnit 是“iTunes EQ”,它只允许您使用 EQ 预设。我想在我的音频图中使用自定义的均衡器

我在这个主题上遇到了this question,并看到了一个建议在渲染回调中使用this DSP code 的答案。这看起来很有希望,人们似乎在各种平台上有效地使用它。但是,即使使用平坦的 eq,我的实现也会产生大量噪音。

这是我与 Apple 的“MixerHost”示例应用程序的“MixerHostAudio”类的 20 行集成(一次提交):

https://github.com/tassock/mixerhost/commit/4b8b87028bfffe352ed67609f747858059a3e89b

关于如何让这个工作的任何想法?还有其他整合情商的策略吗?

编辑:这是我遇到的失真示例(使用 eq flat): http://www.youtube.com/watch?v=W_6JaNUvUjA

【问题讨论】:

噪音可能由多种原因引起 - 数值不稳定、算术错误、缓冲区读/写错误...您是否尝试实现“什么都不做” EQ,只是将输入复制到输出? (这和平面 EQ 不一样) 感谢您的建议。我尝试从 EQ3Band 的“do_3band”方法返回给定的样本,并得到一个没有失真的声音。这一定意味着噪音来自 do_3band 的逻辑,不是吗?这是 EQ3Band 的样子:github.com/tassock/mixerhost/blob/master/Classes/EQ3Band.c 作为一名专业的音频制作人,我可以告诉你,你似乎遇到的问题是流缓冲区,但是,我在我的设置上找不到任何问题(macpro、rme fireface400、iPhone 3GS )。 【参考方案1】:

EQ3Band.c中的代码中,滤波器系数在没有被初始化的情况下被使用。 init_3band_state 方法仅初始化增益和频率,但系数本身 - es->f1p0 等未初始化,因此包含一些垃圾值。这可能是输出不好的原因。

【讨论】:

好点,感谢您的建议。不幸的是,在确保我的滤波器系数没有被设置为垃圾值之后,我的输出仍然很糟糕:github.com/tassock/mixerhost/commit/…【参考方案2】:

这段代码似乎不止一种错误。

数字滤波器通常由滤波器系数表示,它们是常数,滤波器内部状态历史(因为在大多数情况下输出取决于历史)和过滤器拓扑,它是用于计算给定输入和过滤器(系数+状态历史)的输出的算术。在大多数情况下,当然在过滤音频数据时,如果您将 0 输入到输入端,您希望在输出端得到 0。

您链接到的代码中的问题:

滤波器系数在每次调用处理方法时改变

es->f1p0 += (es->lf * (sample - es->f1p0)) + vsa;

输入样本通常乘以过滤器系数,而不是添加到它们。它没有任何物理意义 - 样本和滤波器系数甚至没有相同的物理单位。

如果你输入 0,你不会在输出中得到 0,只是一些没有任何意义的值。

我建议你寻找另一个代码 - 另一个选项是调试它,它会更难。

此外,您还可以从阅读有关数字滤波器的内容中受益:

http://en.wikipedia.org/wiki/Digital_filter

https://ccrma.stanford.edu/~jos/filters/

【讨论】:

以上是关于iOS 上的自定义 EQ AudioUnit的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 未应用我的 UICollectionViewCell 上的自定义

iOS:设备上的自定义位置

在 iOS 上的 branch.io 上的两个应用程序中支持相同的自定义域

iOS 上的自定义模板系统

通知 ios 上的自定义音频播放器控件

有没有办法将我在 Android 上的自定义渲染器复制到 iOS 平台?