Форум программистов, компьютерный форум, киберфорум
Программирование звука
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/35: Рейтинг темы: голосов - 35, средняя оценка - 4.83
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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.11.2019, 13:03
Ответы с готовыми решениями:

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

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

Передача пакетов по дуплексному каналу связи
В системе передачи данных производится обмен пакетами между пунктами А и В по дуплексному каналу связи (возможна одновременная передача...

41
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
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-файл:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication8
{
    class Program
    {
        public static double Sine(int index, double frequency)
        {
            return Math.Sin(frequency * index);
        }
 
        public static void SaveWave(Stream stream, short[] data, int sampleRate)
        {
            BinaryWriter writer = new BinaryWriter(stream);
            short frameSize = (short)(16 / 8); // Количество байт в блоке (16 бит делим на 8).
            writer.Write(0x46464952); // Заголовок "RIFF".
            writer.Write(36 + data.Length * frameSize); // Размер файла от данной точки.
            writer.Write(0x45564157); // Заголовок "WAVE".
            writer.Write(0x20746D66); // Заголовок "frm ".
            writer.Write(16); // Размер блока формата.
            writer.Write((short)1); // Формат 1 значит PCM.
            writer.Write((short)1); // Количество дорожек.
            writer.Write(sampleRate); // Частота дискретизации.
            writer.Write(sampleRate * frameSize); // Байтрейт (Как битрейт только в байтах).
            writer.Write(frameSize); // Количество байт в блоке.
            writer.Write((short)16); // разрядность.
            writer.Write(0x61746164); // Заголовок "DATA".
            writer.Write(data.Length * frameSize); // Размер данных в байтах.
            for (int index = 0; index < data.Length; index++)
            { // Начинаем записывать данные из нашего массива.
                foreach (byte element in BitConverter.GetBytes(data[index]))
                { // Разбиваем каждый элемент нашего массива на байты.
                    stream.WriteByte(element); // И записываем их в поток.
                }
            }
        }
 
        static void Main(string[] args)
        {
            int sampleRate = 8000; // наша частота дискретизации.
            short[] data = new short[sampleRate];  // Инициализируем массив 16 битных значений.
            double frequency = Math.PI * 2 * 440.0 / sampleRate; // Рассчитываем требующуюся частоту.
            for (int index = 0; index < sampleRate; index++)
            { // Перебираем его.
                data[index] = (short)(Sine(index, frequency) * short.MaxValue); // Приводим уровень к амплитуде от 32767 до -32767.
 
            }
            Stream file = File.Create("test.wav"); // Создаем новый файл и стыкуем его с потоком.
            SaveWave(file, data, sampleRate); // Записываем наши данные в поток.
            file.Close(); // Закрываем поток.
        }
    }
}
Можно ли его преобразовать так, чтобы создавался звуковой файл на основании двоичного кода, полученного при преобразовании текста, допустим для 0 задается одна частота/громкость, для 1 другая?
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
10.11.2019, 21:40
5 килогерц длительность 1 сек.


C#
1
 Console.Beep(5000, 1000);
1
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
11.11.2019, 01:35  [ТС]
SoftIce, ничего себе, я и не знал, что вот так просто можно сгенерировать звук. Большое спасибо!
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
11.11.2019, 08:48
Цитата Сообщение от c1gnum Посмотреть сообщение
просто можно сгенерировать звук
Но обратите внимание, что этот метод нестабилен и ненадёжен.

Добавлено через 2 часа 13 минут
c1gnum, вот еще пример на основе Вашего кода.
Строка разбивается на буквы, буквы на байты. Каждому байту соответствует своя частота.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication8
{
    class Program
    {
        public static double Sine(int index, double frequency)
        {
            return Math.Sin(frequency * index);
        }
 
        public static void SaveWave(Stream stream, short[] data, int sampleRate)
        {
            BinaryWriter writer = new BinaryWriter(stream);
            short frameSize = (short)(16 / 8); // Количество байт в блоке (16 бит делим на 8).
            writer.Write(0x46464952); // Заголовок "RIFF".
            writer.Write(36 + data.Length * frameSize); // Размер файла от данной точки.
            writer.Write(0x45564157); // Заголовок "WAVE".
            writer.Write(0x20746D66); // Заголовок "frm ".
            writer.Write(16); // Размер блока формата.
            writer.Write((short)1); // Формат 1 значит PCM.
            writer.Write((short)1); // Количество дорожек.
            writer.Write(sampleRate); // Частота дискретизации.
            writer.Write(sampleRate * frameSize); // Байтрейт (Как битрейт только в байтах).
            writer.Write(frameSize); // Количество байт в блоке.
            writer.Write((short)16); // разрядность.
            writer.Write(0x61746164); // Заголовок "DATA".
            writer.Write(data.Length * frameSize); // Размер данных в байтах.
            for (int index = 0; index < data.Length; index++)
            { // Начинаем записывать данные из нашего массива.
                foreach (byte element in BitConverter.GetBytes(data[index]))
                { // Разбиваем каждый элемент нашего массива на байты.
                    stream.WriteByte(element); // И записываем их в поток.
                }
            }
        }
 
        static void Main(string[] args)
        {
            Test("Раз два три четыре пять");
        }
 
        static void Test(string txt)
                    {
            char[]ch = new char[txt.Length];
            ch  = txt.ToCharArray();
            int ind = 0;
            int sampleRate = 8000; // наша частота дискретизации.
            short[] data = new short[(sampleRate * ch.Length/4 ) ]; 
            for (int i = 0; i < ch.Length; i++)
            {
                byte[] b = BitConverter.GetBytes(ch[i]);
            
               // Инициализируем массив 16 битных значений.
                for (int j = 0; j <= 1; j++)
                {
                    double frequency = Math.PI * 2 * (b[j]*40 ) / sampleRate; // Рассчитываем требующуюся частоту.
                    for (int index = 0; index <  (data.Length / (ch.Length))  ; index+=2)
                    { // Перебираем его.
                        data[ind] = (short)(Sine(index, frequency) * short.MaxValue); // Приводим уровень к амплитуде от 32767 до -32767.
                        ind++;
                    }
                   
                }
            }
            Stream file = File.Create("test.wav"); // Создаем новый файл и стыкуем его с потоком.
            SaveWave(file, data, sampleRate); // Записываем наши данные в поток.
            file.Close(); // Закрываем поток.
        }
    }
}
1
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 41
11.11.2019, 12:00  [ТС]
Спасибо, буду разбираться.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
11.11.2019, 20:16
Цитата Сообщение от c1gnum Посмотреть сообщение
для 1 - должен быть один уровень громкости, а для 0 другой
Я думаю, тут достаточно сделать 0 и максимальную громкость (или половину от максимума).

Добавлено через 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
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
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
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
13.11.2019, 12:14
Вот так можно записать звук с микрофона в файл.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NAudio.Wave;
namespace WindowsFormsApplication8
{
   
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        WaveIn waveIn;
        WaveFileWriter waveWriter;
 
 
        private void waveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            if (waveWriter == null) return;
 
            waveWriter.Write(e.Buffer, 0, e.BytesRecorded);
            waveWriter.Flush();
        }
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            waveIn = new WaveIn();
            waveIn.DeviceNumber = 0;
            string outputFilename = Application.StartupPath + "\\123.wav"; 
            waveIn.WaveFormat = new WaveFormat(44100, WaveIn.GetCapabilities(waveIn.DeviceNumber).Channels);
 
            waveIn.DataAvailable += new EventHandler<WaveInEventArgs>(waveIn_DataAvailable);
            waveWriter = new WaveFileWriter(outputFilename, waveIn.WaveFormat);
            waveIn.StartRecording();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
 
            if (waveIn != null)
            {
                waveIn.StopRecording();
                waveIn.Dispose();
                waveIn = null;
            }
            if (waveWriter != null)
            {
                waveWriter.Dispose();
                waveWriter = null;
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
 
 
  
    }
}
Вложения
Тип файла: rar WindowsFormsApplication8.rar (200.9 Кб, 10 просмотров)
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
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,305
Записей в блоге: 12
14.11.2019, 00:11
Цитата Сообщение от c1gnum Посмотреть сообщение
В моей задаче все же предполагается передача именно звуком а не через кабель, т.е. один компьютер воспроизводит через динамик, а второй принимает через микрофон
Интересно
Ну тогда вероятность ошибки повышается, т.к. микрофон будет ловить ещё и посторонние звуки и реверберацию (хотя, её амплитуда будет незначительной, если вы только не в металлическую бочку их поместите). К тому же, нужно как-то сделать так, чтобы они не стали одновременно воспроизводить звук. Т.е. каждый компьютер должен находиться либо в режиме записи, либо в режиме воспроизведения, причём они должны как-то заранее договориться о том, в какой момент тот или иной компьютер будет находиться в том или ином режиме (ведь себя компьютер будет "слышать" громче, чем собеседника). При этом нужно учитывать скорость звука, т.е. если компьютеры находятся на расстоянии 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.11.2019, 10:53
Помогаю со студенческими работами здесь

Передача текста по радио каналу(чат)
Задумал сделать передачу текста, предложений по радио каналу, нашёл исходники подправил под себя, но текст в терминале отображается...

Передача информации
Здравствуйте,скажите пожалуйста вот такая ситуация: создана БД Гостиница в ней 3 таблицы клиенты,заказы и проживание так вот диаграмма у...

Передача информации
Файл передается V=100 Кбит/c(сделать combobox с ед.измерения) Q=1 мб(сделать combobox с ед.измерения) t=? t=Q/V=1 мб/100 Кбит/c...

Передача информации
Здравствуйте.Программирую в C++/Qt Проблема состоит в передаче данных между формами.Мне нужно передать информацию введенную на Form1 в...

Передача информации из массива GET
&lt;?php session_start(); if(isset($_GET)){ header('location: g1.php'); } ?&gt; &lt;form method=&quot;GET&quot; action...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru