我正在做一个个人项目。我想用一台旧的业余 radio 通过空中传输一些数据。
我的第一份申请草稿是这样的:
我用 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 Beeps()”,在底部,五个“20ms Beeps()”):
如您所见,当我想要 100 毫秒的蜂鸣声时,我得到的是 50 毫秒的蜂鸣声和 75 毫秒的暂停,而当我想要 20 毫秒的蜂鸣声时,我得到的是 10 毫秒的蜂鸣声和 100 毫秒的暂停。
有没有比 Beep() for Windows 更快更准确的东西? (也适用于 linux 的东西会更好,因为最终的应用程序应该可以在树莓派上运行)
我将获得更高的可用带宽和 3 毫秒的声音(...... 41 字节/秒...... 这对我的应用程序来说绰绰有余)
编译器:g++ (mingw)
操作系统:7 个 64 位
最佳答案
一种方法(这很合适,因为您也想以 Linux 为目标)是生成一个 WAV 文件,然后播放它。 (有一些简单的方法可以在 Windows 和 Linux 上生成 play WAV 文件。)
您可以使用库生成 WAV 文件,也可以自己创建,这两种方法都非常简单。有很多examples在网络上。
如果你自己做:
/* 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;
}
关于c++ - windows.h 的 Beep() 的更快替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15992253/