Есть ли способ добавить внешнюю оперативную память (скажем, 100 МБ или 200 МБ) в этом контексте микширования аудиобуфера?
Я кодирую музыкальный сэмплер: для быстрого воспроизведения/минимальной задержки (всего несколько миллисекунд) лучше иметь все сэмплы аудио .wav, которые мы хотим использовать, в ОЗУ, чтобы при воспроизведении некоторых из них, массивы данных доступны сразу. Это то, что я сделал для проекта Raspberry Pi под названием SamplerBox. Это было возможно, потому что у RPi было 1 ГБ ОЗУ.
Примечание. При использовании чтения с SD-карты и одновременном воспроизведении множества нот (представьте, что пианист играет большой аккорд) это обычно не очень хорошо с точки зрения задержки.
Сейчас я думаю о переносе этого проекта на Arduino: в каком объеме мы можем добавить внешнюю оперативную память к ATmega? Или если не "ОЗУ", то какую-нибудь энергозависимую память (назовем ее "ОЗУ2"), которая будет в 10 раз быстрее, чем чтение с SD-карты.
Чего я хочу добиться:
загрузить 200 МБ аудиосэмплов в "RAM2"
Максимально допустимая полифония = 100, поэтому в данный момент времени все аудиобуферы, которые необходимо микшировать, можно скопировать из «RAM2» в «настоящую» RAM микроконтроллера, а микширование будет выполняться с помощью буферы (максимум 100) в реальном ОЗУ
@Basj, 👍3
Обсуждение2 ответа
Лучший ответ:
Существуют микросхемы/платы SRAM, однако не ожидайте 100 МБ, скорее 1 МБ (с номерами выводов и возможностью подключения/протоколами, которые предлагает Arduino).
С помощью Flash можно добиться гораздо большего, но его можно записать только несколько раз; не уверен, что это соответствует вашим требованиям.
Кроме того, я боюсь, что настоящая проблема заключается в скорости обработки. Смешивание 100 сэмплов со стереозвуком 48 кГц будет означать (48000 * 2) = 96 тыс. сэмплов/с. Поскольку частота Arduino составляет всего 16 МГц, у вас есть всего 16e6/96e3 = 166 тактовых циклов, чтобы смешать все эти 100 сэмплов. Наверное, слишком мало.
Обновить
Winbond — это торговая марка, поддерживаемая библиотеками Arduino, и самая большая поддерживаемая микросхема — это, например, W25Q128FVSSIG, которая составляет 128 Мбит, то есть 8 МБ. Для 200 МБ вам нужно 25 из них, что довольно много, и не уверен, что возникнут проблемы с использованием такого количества (не говоря уже о стоимости). Для этого вам не нужна файловая система, однако вам нужно написать ее постранично (если вы хотите сделать это эффективно). Что должно быть в порядке, так как SD-карта также считывается постранично (хотя, возможно, не такого же размера страницы). Однако вам все равно придется копировать флэш-память в SRAM, чтобы иметь возможность ее обрабатывать, поэтому это не то же самое, что SRAM. Получить 200 МБ SRAM будет очень дорого.
Спасибо за ваш ответ. Можем ли мы добавить флэш-память на 200 МБ к Arduino? Можем ли мы использовать его в качестве ОЗУ (просто загружать массивы с SD-карты в буфер памяти) или нам нужно использовать файловую систему, такую как диск (тогда это не очень полезно для аудиобуферов), @Basj
@Basj Я обновил свой ответ вашими дополнительными вопросами., @Michel Keijzers
Я также предлагаю изучить различные микропроцессоры. Модели Teensy часто имеют разъем для SD-карты, а Teensy 4 (особенно если они выпускают модели со встроенным разъемом для SD) чрезвычайно быстры и функциональны (600 МГц, двойные команды/цикл). Это было бы гораздо лучше, чем Arduino, хотя у вас все еще будут ограничения по оперативной памяти. (Где-то около 200 мегабайт, но у вас будет немного меньше проблем, чем с простыми 2-8 КБ ОЗУ Arduino. У них есть несколько сотен КБ до, возможно, пары МБ (обратите внимание, что я не уверен, что это на самом деле заходит так высоко))
Есть также RPI Zero, Zero W и Compute Module, которые можно попробовать использовать. Это система Raspberry Pi, к которой вы привыкли, при низкой стоимости или легко интегрируемом форм-факторе.
Короче говоря, для обработки звука вам также нужен более мощный процессор, чем, вероятно, есть в стандартном Arduino. Много оперативной памяти — это очевидная проблема, но также важно иметь вычислительную мощность, чтобы что-то с ней делать.
Обратите внимание, что чипы Winbond, упомянутые в другом ответе, ЯВЛЯЮТСЯ флэш-памятью, поэтому они могут испортиться, если увидят много записей.
- Последовательная печать из флэш-памяти (F() macro, PROGMEM, sprintf_P, SPTR)
- Есть ли способ подключить оперативную память компьютера к Arduino?
- Как уменьшить использование глобальных переменных? Attiny85
- Подключить SDRAM к STM32
- Оперативная память стоимость ввода функций
- Как заставить BLE и WiFi IoT работать с памятью без проблем ?
- Помогите сократить использование динамической памяти с помощью библиотеки LoRa
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Я бы подумал, что вам понадобится 100 Arduinos, каждая из которых воспроизводит один звук независимо, каждая со своим буфером SRAM, который очень быстро воспроизводится через шину SPI и ЦАП, а затем микширует все выходные сигналы в аналоговой области (вместо цифровой). Задержка от триггера до выхода ЦАП будет практически нулевой. Перед игрой можно загрузить каждую с SD-карты — иметь один «контроллер» для чтения SD-карты и отправки файла на каждое Arduino для хранения в его локально контролируемой SRAM., @CrossRoads