|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
Передача информации по акустическому каналу06.11.2019, 13:03. Показов 8229. Ответов 41
Метки нет (Все метки)
Доброго времени суток. Передо мной стоит задача написать программу, которая позволяла бы двум ноутбукам обмениваться текстовой информацией при помощи звука. Как я сам вижу алгоритм для решения данной задачи: 1) Вводится текст; 2) Введенный текст преобразуется в двоичный код, например, по таблице Unicode; 3) Для 0 и 1 задаются определенные частоты; 4) В соответствии с заданными частотами создается и воспроизводится аудио-файл; 5) Второй ноутбук, выступающий в качестве приемника, должен принять аудио-файл с первого ноутбука и перевести его обратно в текст.
Собственно мой вопрос заключается в том, каким образом реализовать данный алгоритм? Для C# есть библиотека для работы со звуком nAudio, но у меня не получилось найти к ней нормальной документации. Буду рад любым предложениям и мыслям по способам реализации данной задачи. Возможно кто-то с чем-то подобным уже сталкивался или видел какие-нибудь интересные статьи по этой тематике?
0
|
|
| 06.11.2019, 13:03 | |
|
Ответы с готовыми решениями:
41
Передача знаков по каналу Передача данных по дуплексному каналу связи Передача пакетов по дуплексному каналу связи |
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 07.11.2019, 12:03 | |
|
c1gnum, здравствуйте!
Способов на самом деле можно придумать множество. Можно не частоты передавать, а 0 и 1 (к примеру нулевая громкость и высокая), только длительностью не 1 семпл, а 5-10, к примеру. И CRC в конце каждого блока. А в конце сообщения получаем ответ о том, какие блоки получены успешно, а какие получены с ошибкой. Я думаю, это будет даже проще (и может быть даже точнее и менее затратно с точки зрения кол-ва семплов на бит, хотя тут утверждать не возьмусь). Если с nAudio проблемы, можно использовать что-то другое, тот же BASS. Добавлено через 1 минуту Т.е. придумать какой-то протокол, чтобы легко было опознавать начало сообщения и пр. Можно за основу взять какие-то сетевые протоколы.
2
|
|
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 07.11.2019, 19:25 [ТС] | |
|
Jin X, спасибо за совет. Буду разбираться в данной библиотеке.
0
|
|
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 09.11.2019, 16:49 [ТС] | |
|
Правильно ли я понимаю, что библиотека bass.dll не имеет функционала для синтеза звука, а предназначена для воспроизведения/записи звуковых файлов, регулировки громкости, баланса и т.д.? Другими словами, я не могу понять, как мне синтезировать звук. Допустим, введенный текст я преобразовал в бинарный код, а как теперь в соответствии с определенными заранее заданными параметрами, например, для 1 - должен быть один уровень громкости, а для 0 другой, создать звуковой файл?
0
|
|
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
||||||
| 10.11.2019, 21:24 [ТС] | ||||||
|
Я нашел код, который может создавать WAV-файл:
0
|
||||||
|
es geht mir gut
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
|
||||||
| 10.11.2019, 21:40 | ||||||
|
5 килогерц длительность 1 сек.
![]()
1
|
||||||
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 11.11.2019, 01:35 [ТС] | |
|
SoftIce, ничего себе, я и не знал, что вот так просто можно сгенерировать звук. Большое спасибо!
0
|
|
|
es geht mir gut
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
|
|||||||
| 11.11.2019, 08:48 | |||||||
|
Добавлено через 2 часа 13 минут c1gnum, вот еще пример на основе Вашего кода. Строка разбивается на буквы, буквы на байты. Каждому байту соответствует своя частота.
1
|
|||||||
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 11.11.2019, 12:00 [ТС] | |
|
Спасибо, буду разбираться.
0
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
||
| 11.11.2019, 20:16 | ||
|
Добавлено через 1 минуту А при приёме брать абсолютную величину и проверять – 0 или, скажем, больше, чем 10% от максимума (т.к. громкость может варьироваться). Добавлено через 16 секунд Ну это просто мысли. Сам не пробовал.
1
|
||
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 11.11.2019, 23:43 [ТС] | |
|
Можете поделиться мыслями о том, как бы вы реализовали программу на компьютере-приемнике? Т.е. вот я преобразовал введенную строку, записал wav-файл, воспроизвожу его, и как теперь должен работать приемник? Он должен записать этот звук, воспроизведенный первым компьютером (опять же в wav-файл)? И затем каким-либо образом нужно извлечь из этого файла необходимые данные (частота/амплитуда)? Мне кажется, что записанный файл будет отличаться от исходного, допустим из-за эффекта эха или из-за наложения звуковых волн, или я ошибаюсь, и записанный звуковой файл будет иметь +- те же характеристики?
0
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 12.11.2019, 22:35 | |
|
c1gnum, да, я бы на одном воспроизводил, а на другом записывал. Вернее, там двухсторонняя передача будет. Нужно же ответить, что всё принято.
Я думаю, что ± характеристики будут те же. Откуда возьмётся наложение? Вы же по проводу будете передавать, правильно я понимаю (джек-джек)? Может быть (теоретически) звук будет в противофазе, хотя причин к этому я не вижу, но такую вероятность я бы учёл. Тут главное передавать и записывать данные с одной частотой дискретизации и не по одному семплу, а по несколько (например, по 5 или 10 на 1 бит при побитовой передаче 0/1; а при кодировке частотами затрудняюсь сказать, надо тестить, какое кол-во семплов будет достаточно, чтобы с необходимой достоверностью декодировать нужное кол-во частот – тут и от максимального кол-ва частот может зависеть; но 10 явно будет мало, может, 1000 вообще, без понятия). Я бы не заморачивался с частотами, а сделал тупо по битам. Хотя, может, я не прав, и по частотам больше информации можно передать – не знаю. Про побитную передачу. Берём, допустим, 48 кГц. Если достаточно низкой скорости (скажем, 1 Кб в секунду, то можно и по 40 семплов передавать на бит). Если нужна более высокая скорость, можно попробовать по 4, скажем (12 Кб/сек). Можно ещё стерео передавать, будет в 2 раза больше информации. Можно передавать по 2 бита сразу. Скажем, если звук 16-битный, то 0, 10000, 20000, 30000, к примеру. Или по 4. Или так: передаём 2 бита (либо 0, 8000, 16000, 24000, 32000, либо стерео: 0 и 32000 в каждом канале, допустим). Старший означает, что это обычные данные или служебные. Младший – сами данные. Служебные данные – это синхронизация, номер пакета, CRC, команды (сброс, запрос, повтор и т.д.) и пр. В любом случае сначала идёт калибровка громкости (т.к. если мы передаём семпл со значением 10000, это не значит, что он как 10000 и запишется; может записаться и как 1000, и как 5000, и как 25000). Для этого сначала один компьютер отправляет, данные, состоящие из последовательного перебора значений (0, 1, 0, 1 или 0, 1, 2, 3, 0, 1, 2, 3 и т.д., смотря сколько бит используется). Второй записывает и регулирует громкость записи, чтобы она была приемлемой (не было перегруза или чересчур тихо, скажем, < 10% от максимума). Потом меняются местами, т.к. обратная связь должна быть всё же. На самом деле это всё не настолько банально, как может показаться изначально ![]() Может быть и обрыв какой-то. И какая-то левая прога издала звук (да хоть или сам Windows). Или какая-то левая прога изменила громкость. Или комп завис/перезагрузился. Или кто-то провод задел (или сам провод плохой). Или произошёл сбой и CRC не совпадает (скажем, наводки какие-то вмешались) и нужно передать пакет заново. И т.д. Короче, масса подводных нюансов. Как в сетевой передаче и даже больше, может быть. Добавлено через 5 минут Хотя раньше во времена ZX Spectrum'а всё записывалось на аудиокассету. С одной попытки. И с одной попытки загружалось. Можете покопать в этом направлении, как там было устроено (какие частоты, как кодировались данные и пр). Сейчас технологии всё же шагнули вперёд и передача комп-комп по кабелю будет явно более надёжной, чем перед аудиокассету, поэтому если взять ту же технологию, то наверное, такую передачу можно считать вполне надёжной. Хотя проверку CRC всё равно делать нужно и всё, что за этим следует ![]() Добавлено через 1 минуту Да и вообще, не исключено, что кто-то вашу задумку уже реализовал. Можно поискать что-то об этом. Поспрашивать людей.
1
|
|
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 13.11.2019, 11:06 [ТС] | |
|
Jin X, спасибо за столь развернутый ответ. В моей задаче все же предполагается передача именно звуком а не через кабель, т.е. один компьютер воспроизводит через динамик, а второй принимает через микрофон.
0
|
|
|
es geht mir gut
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
|
||||||
| 13.11.2019, 12:14 | ||||||
|
Вот так можно записать звук с микрофона в файл.
1
|
||||||
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 13.11.2019, 12:23 [ТС] | |
|
На данный момент я разобрался как записывать wav-файл, при этом устанавливая определенное количество сэмплов для записи одного символа, за что спасибо SoftIce. Я немного переделал тот код для того, чтобы все таки был перевод символов введенной строки в двоичное представление. Затем я могу задавать следующие параметры для 0 и 1: количество сэмплов для записи одного 0 или 1, свою определенную частоту и амплитуду для 0 и другую частоту и амплитуду для 1. Также в начало звукового файла я могу добавлять звуковой отрезок определенной частоты, амплитуды и длительности (для инициализации момента, после которого компьютер-приемник должен начать записывать звук).
Итого я получаю следующую картину звука: Либо же, если для 0 устанавливаю нулевую амплитуду: Далее я вижу следующий путь для реализации программы на компьютере-приемнике: компьютер-приемник записывает звук, принимая его через микрофон, затем из этого файла начинает считывать выборки, состоящие из количества сэмплов, которое было задано для записи одного символа (0 или 1), находит среднее значение амплитуды или частоты для каждой выборки и, опираясь на эти данные придает этим выборкам значения, соответственно либо 0, либо 1, и далее восстанавливается исходная строка.
0
|
|
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 13.11.2019, 12:26 [ТС] | |
|
SoftIce, спасибо, как раз в скором времени планирую начать разбираться в вопросе записи звука через микрофон.
0
|
|
|
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,110
|
|
| 13.11.2019, 12:37 | |
|
c1gnum, можно сделать сперва создание буфера (или wav) со звуком и анализ буфера (или wav) со звуком, а работу с реальным устройством прикрутить чуть позже. Хотя, при передачи через динамики можно вносить дополнительные шумы и так проверять ваш алгоритм на помехоустойчивость.
Если будете кодировать частотами, то есть такая штука как цифровые фильтры. С их помощью можно делать полосные фильтры. По сути, на входе такого фильтра звуковая последовательность, а на выходе средняя амплитуда сигнала в заданной частоте. Есть сигнал на нужной частоте присутствует, то значение большое, отсутствует - малое. Как пример, есть такая штука как DTMF, к нему можно найти в Интернете готовые фильтры и алгоритмы. Если делать уровнем громкости, то можно посмотреть ещё разные варианты RZ и NRZ кодирования. Возможно есть смысл подумать о том, как будете синхронизировать частоту и фазу передатчика и приёмника. Возможно было бы полезно ввести пакетную передачу, а для пакета определить стартовую последовательность или какие-то биты синхронизации.
1
|
|
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 13.11.2019, 12:45 [ТС] | |
|
Ygg, спасибо буду разбираться в тех темах, что вы озвучили.
0
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
||
| 14.11.2019, 00:11 | ||
![]() Ну тогда вероятность ошибки повышается, т.к. микрофон будет ловить ещё и посторонние звуки и реверберацию (хотя, её амплитуда будет незначительной, если вы только не в металлическую бочку их поместите). К тому же, нужно как-то сделать так, чтобы они не стали одновременно воспроизводить звук. Т.е. каждый компьютер должен находиться либо в режиме записи, либо в режиме воспроизведения, причём они должны как-то заранее договориться о том, в какой момент тот или иной компьютер будет находиться в том или ином режиме (ведь себя компьютер будет "слышать" громче, чем собеседника). При этом нужно учитывать скорость звука, т.е. если компьютеры находятся на расстоянии 3-х метров, то после последней отправки ответ можно получить примерно через 10*2=20 миллисек (при 48 кГц это порядка 900 семплов). И то, что громкость должна быть достаточной, чтобы они нормально слышали друг друга (а не помехи). При этом уровень шума будет достаточно высоким, что может раздражать окружающих (если что-то будет присутствовать в этой или соседней комнате) ![]() И ещё. Тут всё же придётся передавать именно частоты: присутствует ли нужная частота с достаточной громкостью. Только пока не очень понятно, чтобы нормально распознавать данные, с какой длительностью должна передаваться одна группа данных (скажем, 4 бита - 16 значений) и какое "расстояние" должно быть между частотами (я думаю, оно должно быть логарифмическим, например, 240, 312, 406, 527, 685, 891, 1158, 1506, 1958, 2545, 3309, 4301, 5592, 7269, 9450, 12285 Гц - умножаю каждый раз на 1.3, итого получилось 16 значений - 4 бита). По отдельным семплам не получится. Т.к. если выдавать постоянно 0, второй компьютер ничего не услышит (запишет 0). И если передавать всё время 30000 (значение семпла), второй компьютер так же ничего не "услышит". Хотя, интереса ради, это можно потестировать. Кстати говоря, я сейчас прикинул... не факт, конечно, что при передаче через кабель, можно "поймать" значение семпла. Хотя, наверное, это должно сработать, всё же тут передаётся электричество (напряжение). Самому стало любопытно ![]() Если не секрет, почему необходим именно такой странный способ передачи данных (даже без кабеля)?
1
|
||
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 14.11.2019, 10:53 [ТС] | |
|
Jin X, спасибо, я уже сам начинаю понимать, что программу для приемника будет написать не просто. Пока буду заниматься основами ЦОС.
Это моя тема для диплома.
0
|
|
| 14.11.2019, 10:53 | |
|
Помогаю со студенческими работами здесь
20
Передача текста по радио каналу(чат)
Передача информации Передача информации Передача информации из массива GET Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|