AudioKit/DSP:了解磁盘上与内存中未压缩音频大小之间的差异

AudioKit/DSP: Understanding the different between the size of uncompressed audio on disk vs. in memory

这是一个更通用的 RTFM DSP 问题,来自对音频制作和软件非常熟悉但对音频软件开发不熟悉的人,关于未压缩(wav、caf、aiff)文件(44.1 采样率)之间的大小差异, 16 位) 在磁盘上,与此音频在内存中的实际浮点值。

例如,我有一个测试 WAV 文件,根据 MacOS,该文件为七分十四秒 (7:14),大小为 83.4 MB。

如果我将此文件导入我的项目并以 AKAudioFile 打开文件,然后检查 .floatChannelData 属性(这是一个包含两个数组的数组,每个数组一个通道(立体声文件的两个标准)),这个文件特别是总共大约 2300 万个浮点数,堆上大约 180 兆字节。这是有道理的,因为 Swift 中的标准 Float 对象是一个 32 位浮点数,每个浮点数 8 个字节。

我知道大小,但是我希望至少在我的应用程序中能够使用接近 16 位的东西,我只是分析这个音频,而不是以任何方式处理它,甚至在一些基本优化之后并防止深度复制,任何超过 10 分钟左右的音频都会使用堆上的内存。

根据这个 有一些新颖的方法可以将 32 位转换为 16 位,但老实说,这感觉就像我想要做的 wrong/overkill 方法。举个例子,如果我只是 reference floatChannelData 来自我的 AKAudioFile 它会自动向堆中添加大约 300 兆字节!即使没有复制、附加等......

对于更有经验的 DSP 音频开发人员,是否有任何资源可以很好地 heap/stack 管理您程序中的大浮点数? AudioKit 可以录制到 16 位吗?我目前正在用 C 和 C++ 进行处理,所以如果性能更高的话,我觉得在那里进行任何类型的数学或转换都很舒服。任何线索都非常感谢,谢谢!

AudioKit 使用各种需要 32 位浮点数组格式数据的第 3 方 DSP 例程。 Swift 复制 Swift 数组,当以特定方式引用这些数组,或以特定方式作为参数传递时。因此,如果您将基本的 Swift 编码技术与常见的 AudioKit APIs.

一起使用,您可能会遇到大量内存使用问题。

另一种方法是不将 AudioKit API 与标准 Swift 数组一起使用,并仅在需要时将数据转换为 32 位。

例如,您可以内存映射 (mmap) 您的 WAVE 文件,这允许 iOS 根据需要将 16 位数据分页到 VM 系统,而不是一次全部到 32 位音频套件格式。然后使用 vDSP 仅根据需要将映射文件中的 16 位 WAVE 数据切片转换为更小的预分配 C 浮点数组,这是调用 DSP 例程所需的最小值(可能与 AudioKit 内部使用的 C 代码相同) . Swift 在将(可变不安全原始)指针传递给 C 例程时,通常不会复制这些预分配的 C 数组。

这些技术可以让您的应用的内存占用量小得多,使用更少的 CPU 周期,并有助于防止您的应用 运行 耗尽 iOS 设备的电池) .