• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 使用 Accelerate 和 vDSP_desamp() 进行音频处理

[复制链接]
菜鸟教程小白 发表于 2022-12-13 05:16:50 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我对 vdsp 框架完全陌生,我正在尝试通过构建来学习。我的目标是通过以下方式处理信号:

  1. 100 阶带通 FIR
  2. 按因子下采样:2

根据我从 Apple 的文档中了解到的功能 vDSP_desamp() 是我正在寻找的(它可以同时执行两个步骤,对吗?)

我该如何正确使用它?

以下是我的想法: 给定一个 AudioBufferList *audio 和一个长度为 [101] 的滤波器系数数组 filterCoeffs:

vDSP_desamp((float*)audio->mBuffers[0].mData, 2, &filterCoeffs, (float*)audio->mBuffers[0].mData, frames, 101);

这是对方法的正确使用吗? 我是否需要为此过程实现循环缓冲区? 非常欢迎任何指向要阅读的内容的指导/方向/指针。 谢谢



Best Answer-推荐答案


阅读文档,vDSP_desamp() 确实是一个复合抽取和 FIR 操作。两者一起做是一个好主意,因为它减少了内存访问,并且有消除大量计算的空间。

这里的假设是 FIR 滤波器已经用 (P-1)/2 群延迟重铸。这样做的结果是要计算 C(n) 函数需要访问 A(n*I+p)

在哪里(使用文档的术语):

`A[0..x-1]`: input sample array
`C[0..n-1]`: output sample array
`P`: number of filter coefficients
`I`: Decimation factor

很明显,如果您将 CoreAudio 缓冲区传递给它,它将在缓冲区末尾运行 200 个输入样本。最好的情况是产生 100 个垃圾样本,最坏的情况是产生一个 SIGSEGV

所以,简单的答案是否定的。您不能单独使用 vDSP_desamp()

您的选择是:

  • 将需要的样本组装到一个缓冲区中,然后为 N 个输出样本调用 vDSP_desamp()。这涉及从两个 CoreAudio 缓冲区复制样本。如果您担心延迟,您可以重铸 FIR 以使用 100 个之前的样本,或者,它们可能来自下一个缓冲区。

  • 尽量使用 vDSP_desamp(),当过滤器覆盖两个缓冲区时计算更复杂的情况。

  • vDSP_desamp() 的两次调用 - 一次使用简单的情况,另一次使用组装的输入缓冲区,其中样本包装相邻的 CoreAudio 缓冲区

我不明白如何使用循环缓冲区来解决这个问题:你仍然有缓冲区换行的情况来处理,并且仍然需要将所有样本复制到其中。

哪个更快取决于 CoreAudio 提供的音频缓冲区的大小。我的直觉是,对于小缓冲区和小滤波器长度,vDSP_desamp() 可能不值得,但您需要进行测量以确定。

当我过去在 iOS 上实现这种东西时,我发现了一个 手动抽取和过滤操作在总体方案中是相当微不足道的,并且没有费心进一步优化。

关于ios - 使用 Accelerate 和 vDSP_desamp() 进行音频处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28392336/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap