我正在做个人项目.我想用旧火腿收音机通过空中传输一些数据.
我的第一个草案申请就是这样的:
我用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;
}
Run Code Online (Sandbox Code Playgroud)
我期待5次哔哔声,靠近在一起,每次100毫秒,但这是我得到的(在顶部,五个"100ms哔哔声()",在底部,五个"20ms哔哔声()":
正如你所看到的,我得到的是50ms的哔哔声,然后75ms暂停,当我想要100ms的哔哔声,10ms的哔哔声,接着是100ms的暂停,当我想要20ms的哔哔声时.
对于Windows,有比Beep()更快更准确的东西吗?(适用于Linux的东西会更好,因为最终的应用程序应该在覆盆子pi上工作)
我会用3ms的声音获得更高的可用带宽(...... 41字节/秒......这对我的应用来说已经足够了)
编译器:g ++(mingw)
Os:七个64位
一种方法(这可能是合适的,因为您也想以 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;
};
Run Code Online (Sandbox Code Playgroud)
初始化为:
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;
}
Run Code Online (Sandbox Code Playgroud)