7

我正在做一个个人项目。我想用一台旧的业余无线电通过空中传输一些数据。

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

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

  • 5000hz 表示“00”

  • 6khz的意思是“01”

  • 7khz的意思是“10”

  • 8khz的意思是“11”

  • 9khz的意思和上一个一样

然后我将这 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 毫秒,但这是我得到的(顶部是五个“100ms 哔声()”,底部是五个“20ms 哔声()”: 一个

正如你所看到的,当我想要 100 毫秒的哔声时,我得到的是 50 毫秒的哔声,然后是 75 毫秒的暂停,当我想要 20 毫秒的哔声时,我得到的是 10 毫秒的哔声,然后是 100 毫秒的暂停。

有没有比 Beep() for Windows 更快、更准确的方法?(同样适用于 linux 的东西会更好,因为最终的应用程序应该在树莓派上运行)

我会用 3ms 的声音获得更高的可用带宽(...... 41 字节/秒......这对我的应用程序来说已经足够了)

编译器:g++ (mingw)

操作系统:7 个 64 位

4

1 回答 1

2

一种方法(因为您也想以 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;
}
于 2013-04-13T20:03:51.423 回答