более быстрая альтернатива звуковому сигналу windows.h ()

Я работаю над личным проектом. Я хочу передать некоторые данные по радиоканалу по старому радио.

Мой первый черновик приложения работает так:

Я строю один байт с 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 бит

7

Решение

Один из способов (который подойдет, так как вы тоже хотите использовать 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;
}
2

Другие решения

Других решений пока нет …