Амплитуда сигнала на выходе звуковой карты

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Ser100
Встал на лапы
Сообщения: 97
Зарегистрирован: Вс янв 08, 2023 06:21:42

Амплитуда сигнала на выходе звуковой карты

Сообщение Ser100 »

Вложение WebCamGen_2.jpg больше недоступно
В предыдущей теме "Инфразвук (создание буфера данных и воспроизведение)" https://radiokot.ru/forum/viewtopic.php?f=24&t=187325 я решил проблему генератора инфразвука, но сейчас возникли проблемы с вэбкамерой, т.к. скорость перемещения интерференционных полос по матрице вэбкамеры при проведение новых экспериментов с моим интерферометром оказалась очень большой и вэбкамера со скоростью записи 30 кадров в секунду (fps ) не может зафиксировать движение полос. Тогда я приобрел две более-менее скоростные вэбкамеры ELM-USBFHD01M-SF https://aliexpress.ru/item/100500314519 ... 4339533247 , которая может писать 120 fps и ELM-USBGS800P03-KL16 https://aliexpress.ru/item/100500607863 ... 733epc13h4 , которая использует глобальный затвор и поэтому может записывать 640 fps форматом MJPEG (для картинки 160*120) и даже 480 fps форматом YUY2 (для картинки 160*120).

И тут возникла еще и другая проблема - моя программа, написанная с использованием VideoForWindows, т.е. VfW (avicap32.dll), работает только с форматом данных YUY2, но он не может обеспечить высокую скорость передачи данных. Тогда мне пришлось написать еще и код с использованием DirectShow (quartz.dll), где можно использовать и формат MJPEG.. Сейчас моя программа выглядит так, как изображено на скриншоте, а скачать исходный код на языке Visual Basic 6 вместе с исполняемым файлом можно здесь http://modsys.narod.ru/Prog/Prog_Prog/WebCamGen.rar (в архиве есть библиотека FSFWrap.dll, которая нужна для работы с DirectShow. Ее надо поместить в папку C:\Windows\System32 и потом зарегистрировать).

Изображение

Но, в связи с тем, что после того как буферы с данными инфразвука запущены на воспроизведение, я не могу контролировать работу компьютера, а я не уверен, что буферы будут воспроизводиться периодически точно через 1 секунду, у меня сейчас возникла новая проблема. Ведь, если буферы будут воспроизводиться не через 1 секунду, а через 1, 001 секунды, то меня уже это не устроит, т.к. при многократном повторение звука, например, 100 раз погрешность составит уже 0,1 секунды. Поэтому я сейчас ищу способ как проконтролировать время воспроизведения буферов звуковых данных, а еще лучше как узнать амплитуду сигнала в тот момент, когда я через заданный период времени делаю снимок с вэбкамеры.

Конечно, идеальным решением было бы как то узнать амплитуду сигнала на выходе звуковой карты, но как это сделать я не знаю. Да, в интернете есть несколько программ, которые определяют уровень сигнала, например, поступающего с микрофона, но там, как я понял, опять таки сигнал сначала записывается в буфер, а потом данные оттуда выводятся на экран. Т.е. здесь мы определяем амплитуду сигнала не в конкретный момент времени, а на каком то прошедшем отрезке времени. Можно, конечно, синхронно с основной вэбкамерой измерять напряжение каким то прибором на динамике, куда поступает сигнал от моего генератора, и фиксировать эти показания, например, еще одной вэбкамерой и накладывать это изображение на картинку с интерференционными полосами, снятую основной вэбкамерой, но боюсь, что это значительно снизит скорость работы программы. Есть и программы различных осциллографов, которые тоже можно было бы как то использовать при этом, но я не знаю можно ли их использовать непосредственно в коде моей программы.

С наилучшими пожеланиями Сергей Юдин.
Вложения
WebCamGen.rar
(100.14 КБ) 66 скачиваний
Последний раз редактировалось Ser100 Сб дек 16, 2023 09:50:32, всего редактировалось 1 раз.
Реклама
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 431
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: Амплитуда сигнала на выходе звуковой карты

Сообщение HardWareMan »

А никак не узнаешь, ведь в любой момент может вмешаться микшер, который у Windows программный. Только делать дополнительную железку, которая будет контролировать сигнал на выходе и возвращать уровень обратно в комп по любому из доступных цифровых каналов (например, USB). Контроль уровня через встроенный в звуковую карту АЦП тоже не даст гарантированного результата.
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Реклама
Аватара пользователя
Муркиз
Друг Кота
Сообщения: 25819
Зарегистрирован: Пн фев 09, 2009 22:19:49
Откуда: Когда-то был прекрасный город для людей

Re: Амплитуда сигнала на выходе звуковой карты

Сообщение Муркиз »

А с учётом того, что в вынде невозможно точно управлять квантование процессов, то и выдержать синхронизацию с заполненной точностью не получится.

Для решения подобных задач требуется аппаратно- программный комплекс.

Да собственно, подобную названной здесь задачу, моим знакомым разработчикам удалось решить именно за счёт проведения первичной обработки и оцифровки сигналов на внешнем аппаратном многоканальном обработчике.
Ser100
Встал на лапы
Сообщения: 97
Зарегистрирован: Вс янв 08, 2023 06:21:42

Re: Амплитуда сигнала на выходе звуковой карты

Сообщение Ser100 »

[uquote="Муркиз",url="/forum/viewtopic.php?p=4518080#p4518080"]А с учётом того, что в вынде невозможно точно управлять квантование процессов, то и выдержать синхронизацию с заполненной точностью не получится.[/uquote]
Я понял, что управлять процессом вывода звука я не могу. Но, хоть узнать какая была амплитуда сигнала при записи картинки я могу ? И, если, после проведения эксперимента, выяснится, что рассинхронизации не было, то эксперимент можно будет признать корректным. А, если выяснится, что период звукового сигнала будет отличаться от периода с которым будет записываться картинка, но будет стабильным, то можно будет подкорректировать или периодичность записи картинок или период синусоиды при заполнение буфера данных.

С наилучшими пожеланиями Сергей Юдин.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Муркиз
Друг Кота
Сообщения: 25819
Зарегистрирован: Пн фев 09, 2009 22:19:49
Откуда: Когда-то был прекрасный город для людей

Re: Амплитуда сигнала на выходе звуковой карты

Сообщение Муркиз »

Ну так если задача не стоит в выделении артефактов из потока, то вполне можно использовать статистический подсчет,и например, со скользящем интервалом.
Реклама
Аватара пользователя
alexander.k
Потрогал лапой паяльник
Сообщения: 325
Зарегистрирован: Пт дек 11, 2015 12:56:49
Откуда: Ростов на Дону

Re: Амплитуда сигнала на выходе звуковой карты

Сообщение alexander.k »

DirectShow имеет временные метки для каждого фрейма. Т.е. можно синхронизировать камеру и звук.
Реклама
Ser100
Встал на лапы
Сообщения: 97
Зарегистрирован: Вс янв 08, 2023 06:21:42

Re: Амплитуда сигнала на выходе звуковой карты

Сообщение Ser100 »

[uquote="alexander.k",url="/forum/viewtopic.php?p=4518288#p4518288"]DirectShow имеет временные метки для каждого фрейма. Т.е. можно синхронизировать камеру и звук.[/uquote]

А вы не могли бы дать ссылки на несколько примеров определения этих меток ?

С наилучшими пожеланиями Сергей Юдин.
Ser100
Встал на лапы
Сообщения: 97
Зарегистрирован: Вс янв 08, 2023 06:21:42

Re: Амплитуда сигнала на выходе звуковой карты

Сообщение Ser100 »

Нашел несколько примеров работы с функцией waveOutGetPosition, которая выдает номер позиции в буфере, который сейчас воспроизводится, Proect_1 и Proect_3. В первом примере все более-менее понятно. Там загружаются в 5-ть буферов по 0,1 секунды данные из файла wav и через 0,1 секунды от таймера берется текущая позиция и выводится в горизонтальную полосу прокрутки. Не понятно только зачем и там и там 0,1 секунды. А во втором примере данные берутся со звуковой карты, где воспроизводятся любые звуки и размер кода там гораздо меньше (если выкинуть графику, которая мне не нужна), но там используется библиотека от языка программирования VB7 Classic (это тот же VB6, но для работы на современных компьютерах) а вот с ней у меня программа отказывается работать. А мне бы хотелось использовать код именно 2-го примера. Поэтому буду признателен, если мне помогут разобраться с этим кодом.

Этот пример привел сам разработчик языка VB7 Classic (Olaf Schmidt) , который обсуждает проблемы создания этого языка вот здесь https://www.vbforums.com/showthread.php ... ue-VB-7-0) , а нужную для работы этого примера библиотеку vbRichClient5.dll я скачал вот отсюда https://vbrichclient.com/#/en/Downloads.htm (я ее тоже прикреплю как архив vbRC5BaseDlls.zip). Вот только у меня этот код не работает, т.к. при запуске программа выдает ошибку уже в 3-ей строчке, где объявляет новые объекты. Я думал, что это потому, что библиотека vbRichClient5.dll не зарегистрирована, но программа отказывается работать и после того, как я ее регистрирую с использованием скрипта, который распространяется вместе с этой библиотекой (я его положил в папку с проектом, а также на всякий случай положил и файл манифеста). Кстати, стандартной регистрацией из командной строки с использованием того же файла regsvr32.exe почему то не получается зарегистрировать эту библиотеку. В общем, я тут совсем не понимаю, что надо делать.

С наилучшими пожеланиями Сергей Юдин.

Добавлено after 22 minutes 24 seconds:
Не могу загрузить на форум Proect_3 и vbRC5BaseDlls.zip (наверное, потому что они больше 1 МБ). Вот ссылки на них на моем сайте

http://modsys.narod.ru/Prog/Prog_Prog/Proect_3.rar
http://modsys.narod.ru/Prog/Prog_Prog/vbRC5BaseDlls.zip

С наилучшими пожеланиями Сергей Юдин.
Вложения
Proect_1.rar
(108.31 КБ) 66 скачиваний
Ser100
Встал на лапы
Сообщения: 97
Зарегистрирован: Вс янв 08, 2023 06:21:42

Re: Амплитуда сигнала на выходе звуковой карты

Сообщение Ser100 »

Всем спасибо. Вопрос решился с использованием функции waveOutGetPosition .

С наилучшими пожеланиями Сергей Юдин.
Ответить

Вернуться в «Интеграция с ПК»