我正在从事个人项目。我想通过一个旧的火腿无线电传输一些数据。
我的第一份申请草案就是这样:
我用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哔哔声()”:
正如你所看到的,我得到的是50ms的哔哔声,当我想要100ms的哔哔声,然后是10ms的哔哔声,然后是100ms的暂停,当我想要20ms的哔哔声时,停止75ms。
对于Windows,是否有比Beep()更快更准确的内容? (与linux一起工作的东西会更好,因为最终的应用程序应该在覆盆子pi上工作)
我会用3ms的声音获得更高的可用带宽(...... 41字节/秒......这对我的应用来说已经足够了)
编译器:g ++(mingw)
Os:七个64位
答案 0 :(得分:2)
一种方法(因为你想要定位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;
}