AudioKit / DSP: понимание различий между размером несжатого звука на диске и в памяти - PullRequest
0 голосов
/ 16 февраля 2019

Это более общий вопрос RTFM DSP, заданный кем-то, кто очень хорошо разбирается в аудиопроизводстве и программном обеспечении, но является новичком в разработке аудиопрограмм и касается разницы в размере между несжатыми (wav, caf, aiff) файлами (частота дискретизации 44,1, 16бит) на диске, в сравнении с фактическими значениями этого аудио в памяти.

Например, у меня есть тестовый WAV-файл, который в соответствии с MacOS составляет семь минут и четырнадцать секунд (7:14) и имеет размер 83,4 МБ.

Если я импортирую этот файл в свой проект и открою файл как AKAudioFile, то проверим свойство .floatChannelData (которое представляет собой массив из двух массивов, по одному для каждого канала (два стандарта для стереофайл)), этот файл, в частности, в общей сложности примерно 23 миллиона операций с плавающей запятой, около 180 мегабайт в куче.Это имеет смысл, поскольку стандартный объект Float в Swift представляет собой 32-разрядное число с плавающей запятой и 8 байтами на число с плавающей запятой.

Я понимаю размер, однако я надеюсь, что смогу работать с чем-то ближе к 16-битному, как, по крайней мере, в моих приложениях, я просто анализирую этот звук, не обрабатывая его каким-либо образом, и даже после некоторого базовогоОптимизация и предотвращение глубоких копий, любой звук, превышающий 10 минут или около того, уходит на использование памяти в куче.

Согласно этому SO вопросу есть несколько новых способов конвертировать 32-битные в 16-ти, но, честно говоря, это похоже на неправильный / избыточный подход к тому, что я хочу сделать.Например, если я просто ссылка floatChannelData из моего AKAudioFile, он автоматически добавляет около 300 мегабайт в кучу!Даже без копирования, добавления и т. Д.

Для более опытных разработчиков аудиосигналов DSP, есть ли ресурсы для хорошего управления кучей / стеком для больших чисел с плавающей запятой в вашей программе?Может ли AudioKit записывать вещи на 16 бит?В настоящее время я занимаюсь обработкой на C и C ++, поэтому я чувствую себя очень комфортно, выполняя любые математические вычисления или преобразования, если это более продуктивно.Любые предложения так благодарны, спасибо!

1 Ответ

0 голосов
/ 16 февраля 2019

AudioKit использует различные подпрограммы DSP сторонних производителей, которым требуются данные в формате 32-битного массива с плавающей запятой.Swift делает копии массивов Swift, когда на эти массивы ссылаются определенным образом или передают в качестве параметров определенным образом.Таким образом, вы, вероятно, застряли с большим использованием памяти, если используете базовые методы кодирования Swift с обычными API-интерфейсами AudioKit.

Альтернативой является не использовать API AudioKit со стандартными массивами Swift и преобразовывать данные только в 32-разрядныепри необходимости.

Например, вы можете отобразить в памяти (mmap) ваш WAVE-файл, который позволяет iOS при необходимости размещать 16-битные данные в системе VM, а не все сразу в 32-битной.Формат AudioKit.Затем используйте vDSP для преобразования только 16-битных срезов данных WAVE по мере необходимости из сопоставленного файла в меньшие предварительно распределенные массивы с плавающей запятой C, минимум, необходимый для вызовов к процедурам DSP (возможно, того же кода C, который AudioKit использует для внутреннего использования),Swift обычно не делает копии этих предварительно выделенных массивов C при передаче (необработанных) указателей в подпрограммы C.

Эти методы могут позволить уменьшить объем используемой памяти вашего приложения, уменьшить количество циклов ЦП и помочьне позволяйте приложению быстро разряжать аккумулятор устройства iOS).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...