Apple Accelerate vDSP fft vs DFT 和比例因子
Posted
技术标签:
【中文标题】Apple Accelerate vDSP fft vs DFT 和比例因子【英文标题】:Apple Accelerate vDSP fft vs DFT and scaling factors 【发布时间】:2015-06-21 18:42:37 【问题描述】:我是一位经验丰富的程序员,但我没有很多实现 DSP 例程的经验。
我已经为此苦苦思索了数周甚至数月。关于 Apple 的 Accelerate 框架,我的问题有两个方面:
1)
在 vDSP.h 头文件中有 cmets 的效果:请使用 vDSP_DFT_XXX 而不是(我猜)旧版本的 vDSP_fft_XXX。但是,在 Apple 的 https://developer.apple.com/library/prerelease/mac/samplecode/vDSPExamples/Listings/DemonstrateDFT_c.html#//apple_ref/doc/uid/DTS10004300-DemonstrateDFT_c-DontLinkElementID_6 之外,还有 零 个示例。也许只是 DFT 函数更新了?如果是这样,那就太好了。
2)
比例因子。我可以阅读文档 (https://developer.apple.com/library/mac/documentation/Performance/Conceptual/vDSP_Programming_Guide/UsingFourierTransforms/UsingFourierTransforms.html#//apple_ref/doc/uid/TP40005147-CH202-16195),它说在真实输入上的 FFT 的情况下,比如我正在使用的音频,每个傅立叶系数的结果值是实际数学值的 2 倍。
然而,在每个示例中,包括 Apple 自己的示例,用于生成的 vsmul() 函数的比例因子看起来是 1/2*N 而不是我预期的 1/2。
此外,没有关于 vDSP_DFT_XXX 例程的缩放因子的文档,但我认为它们只是包装了旧的?
任何对这些问题的见解将不胜感激!希望我只是遗漏了有关 FFT 在此框架(或一般情况下)中实现方式的一些基本信息。
【问题讨论】:
【参考方案1】:至少有 3 种不同的 FFT 缩放选项可以产生“数学”结果,并且没有单一的标准缩放。能量保持(参见 Parseval 定理)FFT 库需要按 1/N 的数量级进行缩放以获得输入幅度结果,因为相同幅度的较长信号将具有成比例的更多能量。 vDSP 使用能量保持前向 FFT。
【讨论】:
不错。谢谢你。我不知道 Parseval 定理。现在还有更多内容需要阅读! 很抱歉复活这个话题,但我没有得到答案。如果 vDSP 使用能量保持前向 FFT,为什么需要扩展 1/2? 2(fft,ifft)比例因子的乘积不需要为1吗?如果是这种情况,那么我们是否通过将正向缩放到 1/2 和反向缩放到 1/N 来纠正/补充 vDSP 所做的不良/不完整缩放?这意味着默认情况下,前向是用 2N 缩放的,不是吗? 对于严格的实信号,任何频谱的一半能量都在 FFT 结果的复共轭箱中。您可以添加两个相等大小的 bin,或者更常见的是,只需将其中一个缩放 2 倍并忽略 FFT 结果数组的另一半(出于多种原因)。以上是关于Apple Accelerate vDSP fft vs DFT 和比例因子的主要内容,如果未能解决你的问题,请参考以下文章
Apple Accelerate Framework vDSP_zvmags PACKED 格式?
使用 Apple Accelerate 框架的希尔伯特变换(分析信号)?
将 AVCaptureAudioDataOutput 数据传递到 vDSP / Accelerate.framework