首页 > 解决方案 > 从 Apple Watch 麦克风执行实时 FFT

问题描述

我正在开发一个应用程序,它会等待麦克风检测到某个频率。据我研究,我认为最好的方法是对实时音频信号执行快速傅立叶变换(如果有人认为有更好的方法,我很想听听你的意见)。它在 iOS 上运行良好,但我找不到让它在 watchOS 上运行的方法

我在 iOS 和 Swift 5 上实现了著名的tempi-fft,没有问题,问题在于 watchOS SDK 上不存在或受限的不同库,因为我不能使用 AudioUnit、AURenderCallback 来检测缓冲区上的新数据,无法调整WatchOS 上 AudioSession 的首选缓冲持续时间和采样率等。我根本不是“音频工程”方面的专家,所以我不知道如何解决这个问题。我研究了很多,但我没有找到 watchOS 上的实现。

我只发现了这个项目AccelerateWatch,但这是几年前在 watchOS 上还没有 Accelerate 框架时上传的。

对此的任何帮助将不胜感激。

标签: swiftfftwatchosaccelerate-frameworkvdsp

解决方案


我在 iOS App Store 中有一个用于 Apple Watch 的半音调音器应用程序,它完全可以做到这一点,完全在 Apple Watch 组件内运行。

iOS 应用程序和 watchOS Watch 应用程序组件都使用 AVAudioInputNode installTapOnBus 近乎实时地获取 AVAudioPCMBuffer 麦克风样本缓冲区。然后,应用程序将音频样本数据块提供给 Goertzel 例程或 Accelerate 框架 vDSP FFT 函数,以进行进一步的频率分析。然后应用程序对 FFT 频率数据进行进一步处理,以检测和估计音频音高(这通常与 FFT 频率幅度峰值非常不同)。然后使用 SpriteKit 以帧速率为 watchOS 显示设置动画以输出结果。


推荐阅读