Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить

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

Сб дек 16, 2023 07:46:47

Вложение WebCamGen_2.jpg больше недоступно.
В предыдущей теме "Инфразвук (создание буфера данных и воспроизведение)" 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 KiB) Скачиваний: 16
Последний раз редактировалось Ser100 Сб дек 16, 2023 09:50:32, всего редактировалось 1 раз.

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

Сб дек 16, 2023 09:11:42

А никак не узнаешь, ведь в любой момент может вмешаться микшер, который у Windows программный. Только делать дополнительную железку, которая будет контролировать сигнал на выходе и возвращать уровень обратно в комп по любому из доступных цифровых каналов (например, USB). Контроль уровня через встроенный в звуковую карту АЦП тоже не даст гарантированного результата.

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

Сб дек 16, 2023 09:37:37

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

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

Да собственно, подобную названной здесь задачу, моим знакомым разработчикам удалось решить именно за счёт проведения первичной обработки и оцифровки сигналов на внешнем аппаратном многоканальном обработчике.

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

Сб дек 16, 2023 10:12:58

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

Я понял, что управлять процессом вывода звука я не могу. Но, хоть узнать какая была амплитуда сигнала при записи картинки я могу ? И, если, после проведения эксперимента, выяснится, что рассинхронизации не было, то эксперимент можно будет признать корректным. А, если выяснится, что период звукового сигнала будет отличаться от периода с которым будет записываться картинка, но будет стабильным, то можно будет подкорректировать или периодичность записи картинок или период синусоиды при заполнение буфера данных.

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

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

Сб дек 16, 2023 12:27:58

Ну так если задача не стоит в выделении артефактов из потока, то вполне можно использовать статистический подсчет,и например, со скользящем интервалом.

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

Сб дек 16, 2023 19:42:37

DirectShow имеет временные метки для каждого фрейма. Т.е. можно синхронизировать камеру и звук.

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

Вс дек 17, 2023 13:18:29

DirectShow имеет временные метки для каждого фрейма. Т.е. можно синхронизировать камеру и звук.


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

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

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

Пн дек 18, 2023 11:43:38

Нашел несколько примеров работы с функцией 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 ... rue-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 KiB) Скачиваний: 17

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

Сб дек 23, 2023 07:40:06

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

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