не постоянное значение с аналогового входа как логические 1 и 0
- Войдите на сайт для отправки комментариев
Вс, 29/08/2021 - 00:22
Всем привет!
Ни как не могу справиться с созданием автомикшера
задача устройства:
есть 2 аудио плеера. Пл1 и Пл2.
На Пл1 воспроизводится фоновая музыка.
На Пл2 воспроизводится речевое объявление.
Требуется на время звучания речевого объявления, плавно уменьшать громкость фоновой музыки.
Управление громкостью реализованно через микросхему pt2258
вот что у меня получилось:
#include <PT2258.h> #include <Wire.h> #define AUDIOPIN 0 // Аудиовход PT2258 pt2258; // PT2258 Object int volume = 0; // громкость Пл1 (фоновая музыка) по умолчанию максимальная int val; /*макс СИГНАЛ РЕЧЕВОГО СООБЩЕНИЯ с Пл2 int value; исходный/сырой сигнал с Пл2 void setup() { ADCSRA &=0xFE;//настройка АЦП, частота 250 кГц ADCSRA |=0x06; Serial.begin(9600); //UART begin Wire.setClock(100000); // установка частоты синхронизации шины I2C 100KHz /*проверяем может ли Arduino обмениваться данными с микросхемой PT2258 или нет*/ if (!pt2258.init()) Serial.println("PT2258 Successfully Initiated"); else Serial.println("Failed to Initiate PT2258"); /*инициализируем PT2258 и устанавливаем в ней уровни звука по умолчанию*/ pt2258.setChannelVolume(volume, 0); pt2258.setChannelVolume(volume, 1); } void loop() { // пытаюсь отобрать только максимальные значения unsigned int oldValue = value; value = analogRead(AUDIOPIN); if (value > oldValue) val=value; delayMicroseconds(10); // интервал опроса АЦП Serial.println(val); if (val > 560 ) /* если воспроизводится речевое сообщение с Пл2...( при отсутствии речевого сообщения уровень сигнала на А0 = 490 иногда скачет до 530 даем запас еще в 30) { while(volume < 30) { /*ЕСЛИ громкость пл1(ФОНОВОЙ МУЗЫКИ) меньше -30 дб ( т.е. громкость 0 дб - максимальная ) volume++; /* устанавливаем громкость пл1 (плеера с фоновой музыкой) на -30 db (УБАВЛЯЕМ) Serial.print("volume: "); // выводим уровень звука в окно монитора последовательной связи Serial.println(volume); /*устанавливаем уровень звука для канала 1,2 */ pt2258.setChannelVolume(volume, 0); pt2258.setChannelVolume(volume, 1); delay(50); /* для плавности } } else /*иначе (если сигнал с (речевоге сообщение) отсутствует и значение val ~ равен 490 , что меньше 560 ) while(volume > 0){ значение громкости б volume--; /* убавляем уровень до -30 дб delay(50); Serial.print("volume: "); // выводим уровень звука в окно монитора последовательной связи Serial.println(volume); /*устанавливаем уровень звука для канала 1,2*/ pt2258.setChannelVolume(volume, 0); pt2258.setChannelVolume(volume, 1); } }
Всем привет!
Ни как не могу справиться с созданием автомикшера
задача устройства:
есть 2 аудио плеера. Пл1 и Пл2.
На Пл1 воспроизводится фоновая музыка.
На Пл2 воспроизводится речевое объявление.
Требуется на время звучания речевого объявления, плавно уменьшать громкость фоновой музыки.
Управление громкостью реализованно через микросхему pt2258
вот что у меня получилось:
} }
прошу прощения не закончил
вообщем при таких условиях все работает хорошо
пока нет речевого сообщения громкость фоновой музыки пл1 максимум... когда появляется сигнал речевого сообщения, громкость фоновой музыки убавляется, но сразу же прибавляется потому, что аналоговый звуковой сигнал, при проигрывании, может принимать значения, в том числе и < 560, что соответствует отсутствию сигнала.
надеюсь понятно выразился )
может я пошел вообще по неправильному пути... по сути мне нужно дискретное значение наличия или отсутствия звукового сигнала.
подскажите как тогда быть всю голову сломал уже
заранее спасибо
код из самого поста с ошибкой....актуальный см в этом сообщении
Ну надо, наверно, сделать задержку перед убавкой. И пиковый детектор вместо для нормального обнаружения сигнала без альясинга было бы очень хорошо.
Вам надо ориентироваться не на громкость речевого сообщения, а на сам факт его наличия. Т.е. громкость музыки уменьшается одновременно с включением речевого сообщения и увеличивается с его выключением.
Это я понимаю, но какреализовать не знаю.
Это я понимаю, но какреализовать не знаю.
детектировать, сгладить через фильтр 15ком, 10мкф, скомпарировать в уровень лог.1
сгладить через фильтр 15ком, 10мкф
Не надо никаких фильтров. И компаратор лишний.
ТС! Только не нужно делать пиковый детектор и задержку. Иначе импульсная помеха в канале - щелчок случайный - вызовет затихание музыки на время задержки.
Нужно оценить наличие сообщения по интегралу за разумный промежуток времени - хотя бы 50-100 мс.
Вообще покажи осциллограммы с входа A0 без сообщения и с ним - я тебе детектирующий кусок кода бэээз-платно подарю, от души! ;)) Если выложишь сюда осциллограммы - это обязательное условие. Сними так, чтобы на экране ослика уложилось хотя бы 50 мс, то есть разрешение по времени примерно 5 мс/деление, тут от ослика зависит.
И еще приведи схему входа. Звуковой сигнал двуполярный, на пин А0 ты его со смещением подаешь или через диод? Нарисуй, короче.
я тебе детектирующий кусок кода бэээз-платно подарю, от души! ;)) Если выложишь сюда осциллограммы - это обязательное условие.
интриган )))
я тебе детектирующий кусок кода бэээз-платно подарю, от души! ;)) Если выложишь сюда осциллограммы - это обязательное условие.
интриган )))
Стимулирую профессиональный рост контингента. ;))
ТС! Только не нужно делать пиковый детектор и задержку. Иначе импульсная помеха в канале - щелчок случайный - вызовет затихание музыки на время задержки.
Нужно оценить наличие сообщения по интегралу за разумный промежуток времени - хотя бы 50-100 мс.
Вообще покажи осциллограммы с входа A0 без сообщения и с ним - я тебе детектирующий кусок кода бэээз-платно подарю, от души! ;)) Если выложишь сюда осциллограммы - это обязательное условие. Сними так, чтобы на экране ослика уложилось хотя бы 50 мс, то есть разрешение по времени примерно 5 мс/деление, тут от ослика зависит.
И еще приведи схему входа. Звуковой сигнал двуполярный, на пин А0 ты его со смещением подаешь или через диод? Нарисуй, короче.
да пожалуйста
https://youtu.be/mEzJHS-iEjM
да пожалуйста
https://youtu.be/mEzJHS-iEjM
ОК, дорогой. Я посмотрел. Завтра немного занят, но может найду полчасика написать тебе детектор. Если нет, то послезавтра.
Резюме такое - на входе А0 звуковой сигнал со смещением в 2.5В амплитудой примерно 2В, так?
Мне достаточно.
Еще можешь указать размер задержки восстановления громкости фона. 1 сек, 0.5 сек? По мне, так 1 сек - нормально.
Все верно,задержка на восстановление 1 сек тоже годится.
Если можно код прокомментируйте пожалуйста, чтобы мне понять его суть (так сказать, чтобы был толк и прокачка опыта =)) и при необходимости я бы смог его подредактировать, а не просто вставить.
Буду ждать!
Заранее спасибо!
Я не понял, зачем вам value и oldValue, можно просто смотреть на уровень сигнала. Если от 450 до 530, то голоса нет, иначе есть.
Если вас устраивает ваш алгоритм определения наличия речи, то:
Если результат чтения АЦП говорит, что есть голос, устанавливаете счетчик МУЗЫКА_ВЫКЛ = N, где N зависит от длительности цикла, и того какую паузу между словами вы считаете окончанием сообщения. Если loop длится 50 мс и пауза равна 1 сек, то N = 20
Если результат чтения АЦП говорит, что нет голоса и МУЗЫКА_ВЫКЛ > 0. то уменьшаете МУЗЫКА_ВЫКЛ на 1.
Если МУЗЫКА_ВЫКЛ > 0 значит музыка должна быть выключена, если МУЗЫКА_ВЫКЛ == 0, то можно включать музыку.
а если поставить германиевый диод между электролитом и средней точкой минусом на среднюю точку, всё одно экспериментируешь
Вы это все серьезно?
Внимательно прочти комментарии.
три раза прочитал код чтобы понять идею )))
три раза прочитал код чтобы понять идею )))
;)))
Ты никогда не станешь хорошо играть "в эмбеддера" пока не прочувствуешь кожей, что loop() это цикл.
Никаких идей нет, все автоматы так и пишутся:
в каждом проходе loop() просматриваешь список элементарных действий и делаешь намеченные. Чтобы не путаться в последовательности всегда сперва намечаешь действие флагом, а потом исполняешь его по флагу, тогда твой код нечувствителен к размещению блоков. Автоматный способ мышления: проверка - флаг - действие.
Часто флаг может быть неявным, например установка временной метки.
три раза прочитал код чтобы понять идею )))
;)))
Ты никогда не станешь хорошо играть "в эмбеддера" пока не прочувствуешь кожей
я не об этом, так как электронщик в большей степени размышлял как почистить сигнал от шумов, ты жеж математик и, математическая реализация (я о pow) )))
направление мысли разное...
да, о 512, не надо гадать, посмотреть в мониторе порта при отсутствии сигнала самое видимо точное
Всем привет!
Конечно же огромное спасибо всем участникам темы и отдельное спасибо тов. wdrakula
Ваш код отлично мне подошел... правда пришлось его немного модернизировать. Мое устройство дополнилось парой потенциометров для гибкой настройки некоторых параметров.
вот что у меня получилось:
прошу прощения за дебильную подробность комментариев в коде, это на случай склероза... т.к. оч редко ваяю на ардуинке
Все работает, я счастлив, но осталось пару вопросов:
1) Как я понял значение трэшхолда Вы указали похоже в щестнадцатиричной системе? но тогда не вяжется значение в функции и в комментарии или это опечатка?
2) Как показала практика у чисто речевого сообщения, в отличие от музыки, есть абсолютные паузы (между словами) длительностью до 600 млсек. Их я не могу компенсировать, ни компрессией ни нормализацией. В этих паузах управляемый сигнал сразу же стремиться прибавиться.
Можно ли побороть это?
Можно ли сделать это увеличив время подсчета среднего значения, пожертвовав временем возврата громкости после окончания сообщения?
3) При попытке решения вышеописанного вопроса, аудио редактированием, меня посетила мысль сделать субтоновую подложку по верх голоса. Для начала я решил сгенерировать низкочастотный синус (ниже 20 Гц, чтобы ушам не мешал) и подать на вход вместо речи. Результат меня озадачил, тон даже в 2 (два)Гц отлично распознается ардуинкой, как устойчивый сигнал...
Как это возможно? Ведь на входе стоит последовательно включенный конденсатор. Не исключено, что могли присутствовать более высокочастотные гармоники т.к. сигнал подавал с дешевой звуковухи вообще не предназначенной для воспроизведения таких низких частот.
4) Для функциональной гибкости своего автомикшера, я решил оснастить его потенциометрами пока, что двумя. 1 - управление порогом срабатывания и 2 - управление глубиной "компрессии" (можно так сказать), но вместе с глубиной компрессии у меня получается управляется и скорость возвращения (сустейн) т.к. чем глубже я подавляю муз сигнал, тем большее количество шагов используется. А в нашем случае vSTEP длится vStepTime.
Я пробовал привязывать значение vStepTime к vMIN инверсируя и масштабирую его функцией map(),
но наверное (очень наверное! P.S. прошу сильно не пинать) из за нелинейности потенциомерта у меня получалось, что в крайних положениях произведение количества шагов и их длительности укладывалось в 900 милсек, а в средних положениях превышало в разы примерно до 3 сек.
Возможно ли это как-то реализовать линейную зависимость, что бы возврат с любой минимальной громкости длился всегда 900 милсек?
Прошу сильно не пинать если очень криво выражаюсь, в электронике и программировании я большой новичок!
В продолжение ночного монолога...
Вопрос №4 отпал сам собой... "Ларчик просто открывался"
wdrakula!
Был Граф стал Товарищ )))
wdrakula!
Был Граф стал Товарищ )))
;)) Главное, чтобы Интернационал петь не заставляли!
===========
ТС, дорогой. Прости, но дальше сам, если бесплатно.
И еще 4e3 это не неизвестная "шыснацатиричная" форма, а просто число в "научном" формате он же "экспоненциальная запись", читается "четыре на десять в третьей".
Ну нельзя быть таким дремучим! ;))
===========================
...добавлено позже...
ЗЫ: задумался, что я почувствовал от заплесневелого обращения "тов."... Да пипец какой-то, если честно! Руки потянулись искать комсомольский значок. Билет-то я торжественно спустил в сортир в 1986 году, года поступил на МехМат. На учет пытались заставить встать, этим и допекли. Послал нахер и выкинул билет.
Совок издох, и я очень надеюсь, что без возможности воскреснуть!
Совок издох, и я очень надеюсь, что без возможности воскреснуть!
это уж врядли )))
Да, и про конденсатор тоже лихо
Да, и про конденсатор тоже лихо
?????
Как это возможно? Ведь на входе стоит последовательно включенный конденсатор. Не исключено, что могли присутствовать более высокочастотные гармоники т.к. сигнал подавал с дешевой звуковухи вообще не предназначенной для воспроизведения таких низких частот.
Для начала следовало бы посмотреть осциллограмму этого сигнала.
Вполне допускаю существование людей, абсолютно уверенных, что спектр меандра состоит из единственной частоты.
Опять же, схемы нет, - какой там конденсатор, и каково сходное сопротивление следующего каскада - неизвестно.
Для начала следовало бы посмотреть осциллограмму этого сигнала.
Вполне допускаю существование людей, абсолютно уверенных, что спектр меандра состоит из единственной частоты.
Опять же, схемы нет, - какой там конденсатор, и каково сходное сопротивление следующего каскада - неизвестно.
всё там было (я о ролике) )))
если не изменяет память, то 8 килоом реактивности вполне адекватно будут себя вести на 2 герцах
Да, и про конденсатор тоже лихо
Ну не знает ТС, что конденсатор переменку пропускает пуще водопада. Что лихого то в этом?
Нет, ну при указанных в видео номиналах частота среза составит 3 Гц, т.е. подаваемые 2 Гц будут завалены всего на несколько дБ.