Использование vecLib/vDSP для создания генератора синусоидального сигнала с конвертом

Я хочу создать генератор синусоидальных тонов с помощью Accelerate Framework. Я бы хотел, чтобы у моего генератора была настройка атаки / выпуска (то есть огибающая амплитуды).

Я понимаю, как создать вектор, полный значений синуса. Чего я не знаю, так это как применить амплитудную огибающую к моим векторным данным.

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

Как лучше всего работать с огибающей амплитуды с помощью фреймворка Accelerate?

Примечание: я новичок в векторном программировании, поэтому, пожалуйста, держитесь со мной.

2 ответа

Вам не нужно использовать только векторные функции для создания или работы с векторами. Векторные функции полезны, если они существуют и работают быстрее. Я бы сравнил последовательность векторных операций с созданием вашего синуса с конвертом, используя вызовы вашего envelope() * sinf() для каждого векторного элемента, и посмотрим, что быстрее на ваших тестовых устройствах iOS.

Если у вас достаточно памяти для хранения длинных промежуточных векторов и их повторного использования (например, многократного использования конвертов), это может повысить производительность для последующих итераций. Типичное использование памяти в сравнении с производительностью Ytrade-off.

Для музыкальных приложений линейный усилитель не очень распространен / полезен.

для нелинейной рампы ваши основные параметры:

  1. создайте буфер для умножения на длину конверта, а затем используйте умножение vdsp.
  2. просто умножьте на значения конверта, которые вы генерируете на лету.
Другие вопросы по тегам