swift - 从 Apple Watch 麦克风执行实时 FFT
问题描述
我正在开发一个应用程序,它会等待麦克风检测到某个频率。据我研究,我认为最好的方法是对实时音频信号执行快速傅立叶变换(如果有人认为有更好的方法,我很想听听你的意见)。它在 iOS 上运行良好,但我找不到让它在 watchOS 上运行的方法
我在 iOS 和 Swift 5 上实现了著名的tempi-fft,没有问题,问题在于 watchOS SDK 上不存在或受限的不同库,因为我不能使用 AudioUnit、AURenderCallback 来检测缓冲区上的新数据,无法调整WatchOS 上 AudioSession 的首选缓冲持续时间和采样率等。我根本不是“音频工程”方面的专家,所以我不知道如何解决这个问题。我研究了很多,但我没有找到 watchOS 上的实现。
我只发现了这个项目AccelerateWatch,但这是几年前在 watchOS 上还没有 Accelerate 框架时上传的。
对此的任何帮助将不胜感激。
解决方案
我在 iOS App Store 中有一个用于 Apple Watch 的半音调音器应用程序,它完全可以做到这一点,完全在 Apple Watch 组件内运行。
iOS 应用程序和 watchOS Watch 应用程序组件都使用 AVAudioInputNode installTapOnBus 近乎实时地获取 AVAudioPCMBuffer 麦克风样本缓冲区。然后,应用程序将音频样本数据块提供给 Goertzel 例程或 Accelerate 框架 vDSP FFT 函数,以进行进一步的频率分析。然后应用程序对 FFT 频率数据进行进一步处理,以检测和估计音频音高(这通常与 FFT 频率幅度峰值非常不同)。然后使用 SpriteKit 以帧速率为 watchOS 显示设置动画以输出结果。
推荐阅读
- python - 如何使用 Python 访问系统环境变量
- php - WordPress 中 WooCommerce API V2 URL 的 URL 重写不起作用
- c# - 将 System.Drawing.Color 转换为 int?
- python - Python - 如何将结果从 group by 传递给 Pivot?
- powershell - 生成 HMAC SHA256 签名 Powershell
- jodd - 使用 Joy 时如何设置 FileUploadFactory 的 maxFileSize?
- python - if 语句中的字典不起作用
- apache - ProxyPass 工作人员姓名(*此处为长网址*)太长
- sql-server - 将相关表中的分组总和放入 linq 查询列
- html - CSS按钮从某处有额外的边距