Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
Из-за все большего распространения быстрых микроконтроллеров, таких как ESP32 и ARM M series, декодирование MP3 больше не требуется с помощью специального оборудования. Теперь декодирование можно производить в программном обеспечении.
От Earlephilhower доступна отличная библиотека, которая показывает, как декодировать широкий спектр аудиофайлов и воспроизводить их на микроконтроллерах ESP. Вдохновленный этим, я адаптировал часть кода для создания модульного метода чтения файлов MP3 на микроконтроллерах.
Я надеюсь, что этот метод будет достаточно универсальным для использования на любом достаточно быстром микроконтроллере (не только на плате ESP32), но на данный момент я тестировал только на ESP32.
Запасы
Как я уже сказал, я надеюсь, что этот метод будет работать с любым быстрым микроконтроллером, но может и не работать. Поэтому для тиражирования моих результатов вам понадобятся:
- Плата ESP32
- Коммутационная плата SD
- SD Card
- Провода перемычки
- макет
- кабель micro USB (для загрузки скетча)
- IDE Arduino
Шаг 1: разметка макета
Поместите разъем для ESP32 и SD-карты на макетную плату.
Шаг 2: Подключение SD-карты
Подключения SD-карты (ESP32 SD breakout) следующие:
GND GND
3v3 VDD
23 DI (MOSI)
19 ДО (MISO)
18 SCLK
5 CS
Обратите внимание, что эти подключения будут другими, если вы используете другой микроконтроллер.
Шаг 3. Библиотеки программного обеспечения
если у вас не установлен ESP-IDF, перейдите на их веб-сайт и установите его.
Затем установите библиотеку микродекодера. Вы можете сделать это, загрузив репозиторий и поместив его в папку с библиотеками Arduino. Библиотека микродекодера в настоящее время поддерживает файлы.wav и.mp3.
Независимо от формата, с каждым классом связано несколько общих методов, которые описаны в приведенном ниже коде. К ним относятся получение некоторых метаданных файлов и их печать на последовательном мониторе.
#include "SD.h" // ввод
#include "mp3.h" // декодер #include "pcm.h" // контейнер сырых аудиоданных mp3 MP3; void setup () {Serial.begin (115200); // Настраиваем Serial SD.begin (); // Настраиваем SD-соединение File file = SD.open ("/ cc.mp3"); // Открываем MP3-файл MP3.begin (file); // сообщаем классу MP3, какой файл обрабатывать MP3.getMetadata (); // получаем метаданные Serial.print ("Bits per Sample:"); Serial.println (MP3.bitsPerSample); // печатаем бит на выборку Serial.print ("Sample Rate:"); Serial.println (MP3. Fs); // и частота дискретизации} void loop () {}
Шаг 4: отобразите данные MP3 на последовательном мониторе
С помощью приведенного ниже кода вы можете отобразить некоторые аудиоданные на последовательном мониторе. Это будет очень медленно, но покажет вам, как использовать библиотеку MP3. Он также выполняет субдискретизацию данных в 16 раз, так что при нанесении данных на график они выглядят как звуковая волна. Этот код взят из примера SPI_MP3_Serial.ino, который поставляется с библиотекой микродекодера. Конечно, в дальнейшем вам захочется как-нибудь воспроизвести эти аудиоданные, но это тема другого руководства.
#include "SD.h" // ввод
#include "mp3.h" // декодер mp3 MP3; // Класс MP3 pcm audio; // необработанные аудиоданные void setup () {Serial.begin (115200); // Настраиваем Serial SD.begin (); // Настраиваем SD-соединение File file = SD.open ("/ cc.mp3"); // Открываем MP3-файл MP3.begin (file); // Передаем файл в класс MP3} void loop () {audio = MP3.decode (); // Декодирование аудиоданных в класс pcm / * в audio.interleaved 32 отсчета (16 слева и 16 справа) *, но мы собираемся построить только первую точку данных в каждом канале. * Это эффективно понижает дискретизацию данных в 16 раз (* только для просмотра формы сигнала) * / Serial.print (audio.interleaved [0]); // левый канал Serial.print (""); Serial.println (audio.interleaved [1]); // правый канал}