Использование vecLib/vDSP для создания генератора синусоидального сигнала с конвертом
Я хочу создать генератор синусоидальных тонов с помощью Accelerate Framework. Я бы хотел, чтобы у моего генератора была настройка атаки / выпуска (то есть огибающая амплитуды).
Я понимаю, как создать вектор, полный значений синуса. Чего я не знаю, так это как применить амплитудную огибающую к моим векторным данным.
Я знаю, что мог бы создать линейный вектор, используя vDSP_vgen для создания вектора огибающей линейного объема и умножить мой вектор синуса на мой вектор огибающей. Однако это кажется расточительным, потому что я имею дело со многими точками данных и создаю промежуточный вектор только для хранения огибающей амплитуды, что приводит к расточительству памяти в моей среде.
Как лучше всего работать с огибающей амплитуды с помощью фреймворка Accelerate?
Примечание: я новичок в векторном программировании, поэтому, пожалуйста, держитесь со мной.
2 ответа
Вам не нужно использовать только векторные функции для создания или работы с векторами. Векторные функции полезны, если они существуют и работают быстрее. Я бы сравнил последовательность векторных операций с созданием вашего синуса с конвертом, используя вызовы вашего envelope() * sinf() для каждого векторного элемента, и посмотрим, что быстрее на ваших тестовых устройствах iOS.
Если у вас достаточно памяти для хранения длинных промежуточных векторов и их повторного использования (например, многократного использования конвертов), это может повысить производительность для последующих итераций. Типичное использование памяти в сравнении с производительностью Ytrade-off.
Для музыкальных приложений линейный усилитель не очень распространен / полезен.
для нелинейной рампы ваши основные параметры:
- создайте буфер для умножения на длину конверта, а затем используйте умножение vdsp.
- просто умножьте на значения конверта, которые вы генерируете на лету.