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 上的自定义