更快的替代windows.h的哔声()

我正在做一个个人项目。 我想用一个老式的无线电广播在空中传输一些数据。

我的初稿应用程序就像这样工作:

我用4个“信号”构造一个字节:

  • 5000hz的意思是“00”

  • 6khz的意思是“01”

  • 7khz的意思是“10”

  • 8khz的意思是“11”

  • 9khz与前一个相同

然后我将这四位数字合并在一起,然后重新开始。

解调工作很好,应该足够快,但我有一个问题的声音产生…这是缓慢的…

这是我的debugging代码:

#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个哔哔声,靠近在一起,每100ms,但这里是我得到的(顶部,五个“100ms的哔哔声(),并在底部,五个”20ms哔哔()“: 一个

正如你所看到的,当我想要100ms的哔哔声时,我会得到50ms的哔哔声,然后是75ms的暂停,当我想要20ms的嘟嘟声时,会发出10ms的嘟嘟声,然后是100ms的暂停。

有没有比用于Windows的Beep()更快,更准确? (与linux一起工作的东西会更好,因为最终的应用程序应该在树莓派上工作)

我会得到更高的可用带宽与3ms的声音(…. 41字节/秒…这是绰绰有余的我的应用程序)

编译器:g ++(mingw)

Os:七个64位

Solutions Collecting From Web of "更快的替代windows.h的哔声()"

一种方法(这将是适当的,因为你也想瞄准Linux)将产生一个WAV文件,然后播放。 (在Windows和Linux上都有简单的播放 WAV文件的方法。)

您可以使用库来生成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; }