|
3 / 3 / 0
Регистрация: 02.01.2016
Сообщений: 160
|
|
Ввод/вывод звука по I2S, используя ESP3203.06.2021, 19:53. Показов 29912. Ответов 40
Добрый день друзья!
Подскажите пожалуйста ответ на такую задачу. Есть необходимость сделать следующее. Перечислю устройства последовательно, по мере прохождения звукового сигнала. 1. Всенаправленный MEMS-микрофон интерфейса I2S - INMP441 INMP441. 2. ESP32. 3. Плата DAC декодера интерфейса I2S - PCM5102A. Далее. Звук с микрофона по шине I2S заворачиваем на ESP32 (благо есть такой интерфейс), обрабатываем как нам необходимо и также по шине I2S передаем на ЦАП PCM5102A. Под обработкой, как нам необходимо, в идеале, следует понимать применение шифрования. Т.е. ESP32 предполагается использовать для шифрования и соответственно расшифровки. Но для начала шифрование вообще не будем затрагивать. На данном этапе задача - это с микрофона ввести звук по шине I2S в ESP32 и вывести этот же звук по I2S на ЦАП. Сразу честно скажу, что прям такого большого опыта с обработкой звука у меня нет. Были различные другие проекты с датчиками температуры, модулями Lora и т.д. Со звуком не работал и также с шиной I2S. В интернете много различной информации, но вот как сделать одновременно - вводить и тут же выводить звук на/с ESP32 я не нашел... Если возможно, подскажите пожалуйста или направьте! Буду очень признателен. Если у кого был также опыт с шифрованием звука, то подскажите если можно (посоветуйте какую библиотеку или подобные проекты...). СПАСИБО!
0
|
|
| 03.06.2021, 19:53 | |
|
Ответы с готовыми решениями:
40
Ввод звука и его последующий вывод в записывающее устройство Ввод-вывод звука черезмикрофон/динамики - кто делал? |
|
3 / 3 / 0
Регистрация: 02.01.2016
Сообщений: 160
|
|
| 23.06.2021, 13:48 [ТС] | |
|
Добрый день!
Объясните пожалуйста по простому и как можно подробней следующее. Почему, если я вставляю что-либо, что требует время на обработку, между функцией i2s_read_bytes и функцией i2s_write_bytes, то на выходе шипение и бульканье? Как я рассуждаю: 1. Считали buf (определенное количество сэмплов) с микрофона. 2. Ждем (некоторое время, в мс). Эта пауза нужна для обработки сэмплов. 3. Записываем обработанный buf на ЦАП. 4. Цикл повторяется. Да, получается что после того, как мы считали с микрофона, далее мы ничего не считываем, а обрабатываем и потом отправляем buf на ЦАП. Только после этого мы опять считываем с микрофона. Т.е. для шины I2S микрофона есть пауза между концом считывания и началом считывания. Тоже самое и для шины I2S для ЦАПа. Как решить это? Посоветуйте! Мне важно понять как это работает и почему из-за небольшой паузы между i2s_read_bytes и функцией i2s_write_bytes возникает ерунда...
0
|
|
|
|
|||||
| 24.06.2021, 22:45 | |||||
|
1
|
|||||
|
3 / 3 / 0
Регистрация: 02.01.2016
Сообщений: 160
|
|
| 24.06.2021, 23:34 [ТС] | |
|
locm, большое спасибо за подробное объяснение!!!
Принцип я понял. Начал прикидывать как это реализовать и возник такой вопрос. Исходя из Вашего объяснения нужно делать вот так: Примем, что buf_1 - это буфер считывания, buf_2 - буфер обработки, buf_3 - буфер отправки. Тогда работа должна идти следующим образом. В каждый такт мы должны одновременно выполнять все три операции: считывание, обработку и отправку. Но для того, чтобы начать первый такт, нам нужны пустые (случайные) buf_2 и buf_3, чтобы было что обрабатывать и отправлять. На втором такте уже все будет. Но как это организовать одновременно? Что я имею ввиду?... Опишу, например, такт 2: loop{ 1. Считываем, получаем buf_1. 2. Обрабатываем buf_1 (предыдущего такта), получаем buf_2. 3. Отправляем buf_3 - (обработанный buf_2 предыдущего такта). } В loop все равно происходит последовательная работа 1 --> 2 --> 3. И между функциями i2s_read_bytes (операция 1) и i2s_write_bytes (операция 3) есть операция 2, которая тоже занимает какое-то время. Получается, что считывание из I2S и отправка в I2S как таково не будет происходить одно за другим. Т.е. (для проверки этого) операцию 2 можно заменить delay(x), и то, что прочитали, потом отправлять (как я сделал в последнем своем коде). Или я в чем-то не прав? Пожалуйста поправьте.
0
|
|
|
3 / 3 / 0
Регистрация: 02.01.2016
Сообщений: 160
|
|
| 25.06.2021, 08:29 [ТС] | |
|
Возможно нужно к тому что сказано выше применить функции i2s_start() и i2s_stop() ?
Как сделать, чтобы именно в один и тот же момент времени происходило считывание, обработка и отправка?
0
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
|
| 25.06.2021, 08:39 | |
|
0
|
|
|
3 / 3 / 0
Регистрация: 02.01.2016
Сообщений: 160
|
||
| 25.06.2021, 10:39 [ТС] | ||
|
locm, если возможно, ответьте пожалуйста на мои последние сообщения.
0
|
||
|
|
||
| 25.06.2021, 11:54 | ||
|
0
|
||
|
3 / 3 / 0
Регистрация: 02.01.2016
Сообщений: 160
|
||||||||||||||||
| 29.06.2021, 09:55 [ТС] | ||||||||||||||||
|
Привет Друзья!
Сразу говорю, что в отношении аудиоконвейера ничего не сделал. Я работаю в Arduino IDE, и под неё не нашел подходящих библиотек. Зато нашел другую библиотеку шифрования, при помощи которой можно шифровать примерно в сотни раз быстрей и думаю все должно получиться. Если прошлая библиотека шифровала 16 значений примерно за 3,5 мс, то эта библиотека за 50 мкс. Это я проверял лично. Вот код со сравнением:
У меня большие подозрения, что это связано в выделением памяти и объявлением массивов. Проверял шифрование отдельно - все работает хорошо (и шифрует и расшифровывает). Посмотрите пожалуйста в этом отношении, может где-то не в том месте объявил массив или не должным образом. Добавлено через 22 минуты Если закомментировать строку 59 ->
0
|
||||||||||||||||
|
|
|||
| 29.06.2021, 12:27 | |||
|
1
|
|||
|
3 / 3 / 0
Регистрация: 02.01.2016
Сообщений: 160
|
||||||||
| 29.06.2021, 14:54 [ТС] | ||||||||
|
Ура! Спасибо! Все получилось!!! Вот код:
BlockC - зашифрованный буфер; BlockD - расшифрованный буфер, который отправляем по I2S на ЦАП. Если сделать как написано, то расшифрованный звук отлично слышен на ЦАПе. А вот если на ЦАП послать зашифрованный звук, т.е. буфер BlockC , то в динамике слышен равномерный шум, который не влияет от "говорения" в микрофон. Т.е. если buf (отсчеты звука с микрофона) или BlockD (расшифрованные отсчеты звука) направить по I2S на ЦАП, то звук отличный. Если по I2S на ЦАП направить зашифрованный буфер - BlockC, то в динамике сплошной равномерный шум, который не зависит от звуковых волн, направляемых на микрофон. Вопрос: почему я в динамике ЦАПа слышу сплошной равномерный шум? почему он пропорционально не изменяется с тем, как я говорю в микрофон? Или отсчеты после шифрования принимают какие-то значения, что вызывают в ЦАПе этот шум?
0
|
||||||||
|
4084 / 2689 / 590
Регистрация: 11.09.2009
Сообщений: 9,577
|
||
| 29.06.2021, 17:28 | ||
|
Или вы совсем не понимаете, что вы делаете?
0
|
||
|
3 / 3 / 0
Регистрация: 02.01.2016
Сообщений: 160
|
||
| 29.06.2021, 17:31 [ТС] | ||
|
0
|
||
|
4084 / 2689 / 590
Регистрация: 11.09.2009
Сообщений: 9,577
|
|||||
| 29.06.2021, 21:04 | |||||
|
Ответ был строго по сути вопроса
0
|
|||||
|
3 / 3 / 0
Регистрация: 02.01.2016
Сообщений: 160
|
||||
| 29.06.2021, 21:35 [ТС] | ||||
|
На такие подобные смешные комментарии я всегда говорю: "Напишите лучше, тогда и поговорим!" Конечно Вы скажите: "Да зачем мне это нужно еще что-то писать?". А я Вам отвечу: "Тогда не зачем писать подобную Вашу ерунду!". На самом деле вопрос был конкретный, а именно в отношении равномерного шума, не изменяющегося по мере вещания в микрофон. А Вы выхватили Пример_1 и Пример_2. Возьмите эти два онлайн примера и Вы поймете, что то, что Вы писали в отношении одинакового сигнала на выходе - некорректно... Как тогда по Вашему по одинаковому сигналу будет проходить расшифрование? В приведенных примерах четко показано что это не так. Можно ввести самостоятельно и сам исходный текст и ключ, зашифровать и расшифровать. Ничего подобного, о чем Вы пишите, там и близко нет.
0
|
||||
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
|||||
| 30.06.2021, 14:25 | |||||
. Хамская беседа так и подталкивает людей заниматься вашими вопросами
0
|
|||||
|
4084 / 2689 / 590
Регистрация: 11.09.2009
Сообщений: 9,577
|
|||
| 30.06.2021, 15:46 | |||
![]() Соображение очень простое. Алгоритм шифрования никак не зависит от содержимого входного потока данных. Ему всё равно, что отсчёты звука, что нули... А если алгоритм при потоке нулей на входе выдаёт на выходе поток нулей, то это очень плохой алгоритм шифрования.
1
|
|||
|
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
|
|||
| 30.06.2021, 16:21 | |||
А идея ваша вполне годная
0
|
|||
| 30.06.2021, 23:56 | |
|
0
|
|
|
1 / 1 / 0
Регистрация: 07.11.2023
Сообщений: 2
|
|
| 07.11.2023, 21:02 | |
|
Осмелюсь заметить, что из того обстоятельства что, зашифрованный звуковой сигнал воспринимается нашим слухом как шум отнюдь не следует что зашифрованная "тишина" то же шумит. В данном конкретном случае если на вход шифратора AES подавать массив состоящий из "0", на выходе получается некоторая периодическая последовательность, периодичность которой видимо зависит от длинны ключа и других параметров шифрования. Именно на это пытался видимо обратить внимание miki86 ссылаясь на Пример1 и 2. На слух такая последовательность воспринимается как однородный тон. Причиной же шума который miki86 слышал в закодированном канале вместо тона, являются закодированные собственные шумы I2S микрофона, поскольку микрофон он не отсоединял от шины i2s, а просто в него не говорил.
1
|
|
|
Модератор
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
|
|
| 07.11.2023, 22:19 | |
|
0
|
|
| 07.11.2023, 22:19 | |
|
Ввод и вывод структуры используя файлы Ввод и вывод структуры используя файлы Ввод/вывод данных организовать, используя книгу Excel Ввод и вывод строк осуществлять, используя функции gets и puts Расчет по формуле. Ввод и вывод, используя текстовые поля Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|