|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
Передача информации по акустическому каналу06.11.2019, 13:03. Показов 8554. Ответов 41
Метки нет (Все метки)
Доброго времени суток. Передо мной стоит задача написать программу, которая позволяла бы двум ноутбукам обмениваться текстовой информацией при помощи звука. Как я сам вижу алгоритм для решения данной задачи: 1) Вводится текст; 2) Введенный текст преобразуется в двоичный код, например, по таблице Unicode; 3) Для 0 и 1 задаются определенные частоты; 4) В соответствии с заданными частотами создается и воспроизводится аудио-файл; 5) Второй ноутбук, выступающий в качестве приемника, должен принять аудио-файл с первого ноутбука и перевести его обратно в текст.
Собственно мой вопрос заключается в том, каким образом реализовать данный алгоритм? Для C# есть библиотека для работы со звуком nAudio, но у меня не получилось найти к ней нормальной документации. Буду рад любым предложениям и мыслям по способам реализации данной задачи. Возможно кто-то с чем-то подобным уже сталкивался или видел какие-нибудь интересные статьи по этой тематике?
0
|
|
| 06.11.2019, 13:03 | |
|
Ответы с готовыми решениями:
41
Передача знаков по каналу Передача данных по дуплексному каналу связи Передача пакетов по дуплексному каналу связи |
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 14.11.2019, 15:21 [ТС] | |
|
Ygg, спасибо, приму к сведению.
0
|
|
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
||||||
| 08.05.2020, 13:13 [ТС] | ||||||
|
Здравствуйте, кто-нибудь может подсказать, какие коррективы необходимо внести в код, чтобы микрофон начинал записывать звук только после того, как уровень амплитуды звука превысит определенное заданное значение и заканчивал запись, например, спустя 1 секунду после того, как уровень амплитуды снизился до определенного значения?
0
|
||||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 08.05.2020, 23:15 | |
|
c1gnum, не записывая звук, вы не сможете определить уровень сигнала.
Но можно начинать использовать сигнал после достижения им определённого пика (а до этого игнорировать). Про определение пикового уровня есть в доках: https://github.com/naudio/NAud... elMeter.md Только вам надо не определить пик во всём буфере, а просто найти место, где амплитуда превышает определённое пороговое значение. После этого начинаете отсчитывать 8000 семплов (если у вас 8 кГц и нужна 1 секунда). Если в течение этого периода будет найдено значение, превышающее нижний порог, значит начинаете отсчёт заново (снова 8000). До тех пор, пока все значения не будут ниже порога отключения.
1
|
|
| 09.05.2020, 10:14 | ||
|
Не по теме:
0
|
||
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 11.05.2020, 00:03 [ТС] | |
|
Доброго времени суток. Не могли бы вы дать ссылки на примеры "захвата" звука. Мне это необходимо для того, чтобы программа, услышав определенный звук (пусть звук, превышающий определенный уровень громкости) , сама начинала запись и затем останавливала. На данный момент я сам нажимаю на кнопки для того, чтобы начать и остановить запись.
Ещё можете подсказать, каким образом выбрать частоты для передачи? Я реализовал два варианта: передача по битам, в этом случае используются всего 2 частоты, и передача по байтам с использованием 16 частот. Первый вариант работает более менее, но при использовании 16 частот очень часто возникают ошибки. Я пробовал увеличивать количество семплов для передачи одного байта - количество ошибок уменьшается, но все равно они возникают довольно часто, в особенности, когда происходит переход с низких частот (100-500 Гц) на более высокие (1кГц и выше). Частоты определяются с помощью fft с количеством отсчётов равным половине частоты дискретизации, точнее чуть большим (4096 для частоты дискретизации 8 кГц). Заметил, что ошибки возникают, когда микрофон и динамик не находятся в зоне прямой видимости (я использую в качестве микрофона микрофон веб-камеры, если ее поставить прямо перед колонкой, то сигналы распознаются довольно точно, если же вебку поставить, например, за монитор, а за ним идёт сразу стена, и, соответственно, микрофон принимает отраженный звук, то в этом случае только часть символов распознаются точно. Я не знаю, особо не вникал в физику звука, может волны определенных частот гасят друг друга?
0
|
|
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
|
||
| 11.05.2020, 10:38 | ||
|
Объект waweIn отвечает за захват данных в память компьютера. Объект waveWriter отвечает за запись захваченных данных в файл на диски. Захват производится блоками семплов. Каждый раз, когда очередной блок захвачен, вызывается функция waveIn_DataAvailable. Сейчас внутри этой функции нет никакого анализа, только передача данных на запись в файл. Опишите более детально, как именно вы превращаете двоичные данные в семплы звука. Добавлено через 53 минуты При анализе звука с помощью fft есть определённая зависимость от положения окна анализа. Так, сдвинув окно на четверть вы можете получить уже совсем иной результат распределения частот. Сколько длится одна посылка данных, как данные разделяются, как вы определяете смещение для окна анализа и как его двигаете? Есть ещё алгоритм Гёрцеля. С его помощью можно вычислять амплитуды отдельных частот. Если частот не много, то это может оказаться значительно быстрее вычисления всего спектра с помощью fft.
1
|
||
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|||||||||||||||||||||||
| 11.05.2020, 12:53 [ТС] | |||||||||||||||||||||||
Вот код для fft, я его нашел в интернете, так как не очень понимаю математику этого преобразования.
Вот сами приложения: Projects.rar
0
|
|||||||||||||||||||||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 11.05.2020, 15:50 | |
|
Я сейчас попробовал на ноуте через микрофон записать звук, генерируемый с настольного компа через колоночки. Получился трэш вообще. Мало того, что громкость и так довольно низкая, так после ≈ 4 кГц она сильно падает, а после ≈ 8 кГц вообще ничего не записывается. Да ещё и форма волны вообще получается совершенно иной, с кучей паразитных частот. Даже чередуя звук 2 кГц и 4 кГц по 0.01 сек (с записью 48 кГц), по волне вообще очень сложно понять, что там происходит. Т.е., записывая без кабеля, вряд ли вы добьётесь нормальной скорости передачи (передать пару сотен байт в секунду – это будет уже серьёзный прогресс, ИМХО).
0
|
|
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
|
|
| 11.05.2020, 16:50 | |
|
----------
Не, я не правильно посчитал. Вроде с частотами при генерации у вас всё хорошо. Может с частотами при анализе что-то не очень... Добавлено через 15 минут Да, при анализе что-то не понятное. f[i] - это индекс частоты, а не частота. А сравниваете вы её с частотой fre. Верну назад формулу для пересчёта индекса в частоту, которую уже стёр.При построение ДПФ частоты считаются по формуле: F(k)=Fд*k/N F(k) - частота гармоники с индексом k Fд - частота дискретизации (8 КГц) k - номер гармоники, от 0 до 1023 N - количество отчётов (1024) F(0)=8000*0/1024=0 F(1)=8000*1/1024=7,8125 F(2)=8000*2/1024=15,625 ... F(512)=8000*512/1024=4000 - частота отсечения ...
0
|
|
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
||
| 11.05.2020, 17:51 [ТС] | ||
|
Как видно, пик приходит на значение равное 103. По той формуле, что вы привели, получится следующее значение частоты: F(103) = 8000 * 103 / 1024 = 804,6875.
0
|
||
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
|
|
| 11.05.2020, 19:36 | |
|
c1gnum, а почему на вашей картинке более 4000 значений?
0
|
|
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 11.05.2020, 19:45 [ТС] | |
|
0
|
|
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
|
||
| 11.05.2020, 19:51 | ||
|
F(0)=8000*0/8192 F(1)=8000*1/8192 F(2)=8000*2/8192 ... При таких значениях частоты и количества выборок индекс очень близок к частоте индекса.
1
|
||
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 11.05.2020, 20:04 [ТС] | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 12.05.2020, 21:11 [ТС] | |
|
Сейчас при генерации сигнала, у меня рисуется следующая картина:
т.е. происходит смещение фазы в моменты смены частот. Эти смещения фазы при воспроизведении звука воспринимаются как короткие щелчки. Я думаю, что из-за этого явления могут возникать ошибки при дешифровке. Можно ли как-то устранить эти сдвиги по фазе, например, чтобы частоты сменялись только в моменты пересечения нуля?
0
|
|
|
|
||||||
| 12.05.2020, 22:46 | ||||||
|
c1gnum, я думаю это как-то можно привязать формулой к частоте дискретизации и частоте несущей. При 800 отсчетах на один hex при дискретизации 8000 разрыва не видно.
0
|
||||||
|
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
|
|
| 12.05.2020, 23:05 [ТС] | |
|
У меня получается как таковой несущей нет.
Т.е. есть, если приводить аналогию, то имеются генераторы, формирующие синусоиды различных частот, и в зависимости от модулирующего сигнала выбирается та или иная частота.
0
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||
| 13.05.2020, 11:57 | |||
|
Код не читал ваш, но для генерации синусоиды используем формулу: Sin(i*2*Pi*Freq/Rate+StAng)*Amp, где Freq – частота звука, Rate – частота дискретизации, i – номер семпла, Amp – амплитуда, StAng – начальный угол (фаза). Изначально StAng = 0.Например, была частота 500 Гц, сгенерили 100 семплов (i менялось от 1 до 100, лучше с 1). Нужно перейти к частоте 300 Гц. Запоминаем значение, которое было последним: StAng = 100*2*Pi*500/Rate+StAng. Далее будем использовать этот начальный угол StAng при генерации следующей частоты (Sin(i*2*Pi*300/Rate+StAng)*Amp). Почему i лучше начинать с 1? Потому что если будем генерить с нуля, то первый семпл новой частоты будет повторять последней сгенерированный предыдущей частоты (т.к. 0*2*Pi*Freq/Rate = 0).Добавлено через 4 минуты Т.е. если длительность 480 семплов при 48 кГц (480/48000 = 0,01 сек), значит частоты должны быть кратными 1/0,01 = 100 Гц. Можно выбрать 500 и 1000 Гц, например (да хоть 1300 и 2700).
1
|
|||
| 13.05.2020, 11:57 | |
|
Передача текста по радио каналу(чат)
Передача информации Передача информации Передача информации из массива GET Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни
1. Механизм отложенного высвобождения фосфора
Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ
Реализована разная скорость. . .
|
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2.
Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
|
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её.
Всё это стресс конечно. Почему?. . .
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|