|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
Передача информации по акустическому каналу06.11.2019, 13:03. Показов 8343. Ответов 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
|
|
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,123
|
|
| 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
|
|
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|