Я работаю над личным проектом. Я хочу передать некоторые данные по радиоканалу по старому радио.
Мой первый черновик приложения работает так:
Я строю один байт с 4 «сигналами»:
5000 Гц означает «00»
6 кГц означает «01»
7 кГц означает «10»
8 кГц означает «11»
9 кГц означает то же, что и предыдущий
затем я объединяю эти 4 пары битов и начинаю снова со следующего.
Демодуляция работает отлично и должна быть достаточно быстрой, но у меня проблема с генерацией звука … она медленная …
Вот мой код отладки:
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
Beep( 5000, 100 );
Beep( 6000, 100 );
Beep( 7000, 100 );
Beep( 8000, 100 );
Beep( 9000, 100 );
return 0;
}
Я ожидаю 5 звуковых сигналов, близко друг к другу, по 100 мс каждый, но вот что я получаю (сверху — пять звуковых сигналов по 100 мс () и снизу пять звуковых сигналов по 20 мс ():
Как вы можете видеть, я получаю звуковые сигналы 50 мс с паузой 75 мс, когда я хочу звуковые сигналы 100 мс, и 10-мс звуковые сигналы с паузой 100 мс, когда я хочу звуковой сигнал 20 мс.
Есть ли что-то более быстрое и точное, чем Beep () для Windows? (то, что работает и с Linux, будет еще лучше, потому что конечное приложение должно работать на Raspberry Pi)
Я получил бы более высокую полезную полосу пропускания со звуками 3 мс (…. 41 байт / сек …., что более чем достаточно для моего приложения)
Компилятор: g ++ (mingw)
Os: семь 64 бит
Один из способов (который подойдет, так как вы тоже хотите использовать Linux) — создать файл WAV и воспроизвести его. (Есть простые способы играть WAV-файлы в Windows и Linux.)
Вы можете использовать библиотеку для создания файла WAV или создать его самостоятельно, оба подхода довольно просты. Здесь очень много Примеры в сети.
Если вы делаете это самостоятельно:
/* WAV header, 44 bytes */
struct wav_header {
uint32_t riff packed;
uint32_t len packed;
uint32_t wave packed;
uint32_t fmt packed;
uint32_t flen packed;
uint16_t one packed;
uint16_t chan packed;
uint32_t hz packed;
uint32_t bpsec packed;
uint16_t bpsmp packed;
uint16_t bitpsmp packed;
uint32_t dat packed;
uint32_t dlen packed;
};
Инициализировать с помощью:
void wav_header(wav_header *p, uint32_t dlen)
{
memcpy(p->riff, "RIFF", 4);
p->len = dlen + 44;
memcpy(p->wave, "WAVE", 4);
memcpy(p->fmt, "fmt ", 4);
p->flen = 0x10;
p->one = 1;
p->chan = 1;
p->hz = 22050;
p->bpsec = hz;
p->bpsmp = 1;
p->bitpsmp = 8;
memcpy(p->dat, "data", 4);
p->dlen = dlen;
}
Других решений пока нет …