是否有用于一维矢量重采样的 vDSP 功能?
Posted
技术标签:
【中文标题】是否有用于一维矢量重采样的 vDSP 功能?【英文标题】:Is there a vDSP function for 1D vector resampling? 【发布时间】:2012-12-30 12:02:08 【问题描述】:我希望能够使用矢量作为包络,将 fft 均衡应用于相当大的声音块,具有不同的大小。
为了能够将频域 bin 与包络相乘,包络需要与 fft 数据具有相同的分辨率,这会随着声音块的大小而变化。
所以,我需要一个函数来重新采样我的包络向量。您知道 vDSP 是否为此目的提供功能吗?我来回浏览了参考资料,但一无所获。这并不意味着那里什么都没有 - 在搜索 vDSP 参考时很容易错过一些东西...
并不是我自己无法实现某些东西,但如果有一个 vDSP 功能,它可能会比我想出的任何东西都要快得多。这是相关的,因为该项目也针对 ios 设备。
而且没有必要重新发明***:)
谢谢!!
【问题讨论】:
【参考方案1】:如果我理解正确,您有一个一维包络值数组,您希望将其与一维频率区间数组相乘。您要解决的问题是将包络数组缩放到与 FFT 数组相同的长度。首先了解如何生成信封数组会很有帮助,您不能简单地以正确的长度生成它吗?如果是这样,问题就解决了:)
如果没有,那么如何使用vDSP_vtabi
从您当前拥有的值的查找表中生成包络向量?您可以使用vDSP_vramp
生成查找表输入向量 A。
这对我来说似乎相当复杂和昂贵,有相当数量的缓冲区分配/重新分配。计算应该将多少 FFT 样本乘以每个包络值可能会更简单,然后使用 vDSP_vsmul
循环每个包络样本以将 FFT 向量的块乘以包络值。
哪种解决方案的性能更好实际上很大程度上取决于每个向量的相对大小。了解 FFT 向量为何大小不同以及如何首先生成包络数组以给出更准确的答案也会很有帮助。
【讨论】:
正确! fft 大小是变化的,因为我正在对整个声音块(最多 30 秒)进行 fft,而不仅仅是固定数量的样本。包络是根据模板声音计算的,模板声音的大小也可能不同。我也在考虑类似你的第二种方法,但我担心在源模板声音的长度相似的情况下会出现伪影。当包络被平滑时,它仍然可能有相当陡峭的侧面。你的第一种方法听起来很有趣,但我不得不承认我并不完全理解它——你能再解释一下吗?谢谢!!! 恐怕它问的问题比它回答的要多。也许你可以退后一步,告诉我你真正想要做什么?据我了解,您正在计算信号的频率响应并将其乘以另一个信号的幅度包络。为什么?那你怎么办呢?您如何计算长信号的 FFT?大概是通过将其分成块并平均?为什么不知道块大小?为什么包络的大小不能和 FFT 块大小一样? 我自己刚刚实现了一个重采样功能。我不得不承认我已经懒惰地求助于线性插值,但是对于我的用例来说这没问题,因为信封相当平滑,这样我只需要触摸每个值一次。事实证明它也相当快,因此不再迫切需要加速功能。我仍然很好奇为什么 Accelerate Framework 似乎缺少这样一个基本功能,而它却处理了一些相当晦涩的数学运算...... 它没有,您可以使用我已经提到的函数以及vDSP_vlint
来“重新采样”向量。线性插值有什么偷懒的,不然怎么办?
@Tark 你有没有机会详细说明你上面描述的重采样向量的方法?我需要做类似的事情(出于完全不同的原因),而我自己的幼稚实现相当缓慢。【参考方案2】:
我建议通过不同的方式。
因为您的输入信号以固定的采样率来自硬件,而您正是 知道包络值的数量,只需使用
进行采样率转换AudioConverterFillComplexBuffer
它速度很快,并且在重采样时会考虑过滤和插值。
【讨论】:
以上是关于是否有用于一维矢量重采样的 vDSP 功能?的主要内容,如果未能解决你的问题,请参考以下文章