我正在研究一些使用音频转换通过激光传输消息/文件/和其他数据的代码。我当前的代码使用python中binascii模块的hexlify函数将数据转换为二进制,然后为1发出一个音调,为0发出不同的音调。这在理论上有效,尽管不是最快的编码/解码方式,但在测试中证明有一些错误。
产生的音调没有点亮,即:发射150Hz在接收端可能会变成145-155Hz,这不是一个大问题,因为我可以设置接收端的边界较低或更高。
真正的问题是,如果我发出一个音调并且播放它,接收端的计算机可能会多次读取它,或者根据它对输入音频进行采样的速率完全不读取它。我尝试以相同的速度播放音调,但这是非常不确定的。
总之,我使用短消息进行了几次成功的运行,但由于上述问题,这是非常不可靠和不准确的。
我已经对此进行了进一步的研究,对此的解决方案看起来可能涉及BPSK或二进制相移键控,尽管我不确定如何实现这一点。任何建议或代码示例将不胜感激!
我可以找到项目代码here,但我正在处理的主要文件是二进制解码和编码,here和here。我不是python的专家所以请原谅我,如果我说的是错的,我的代码不是最好的,或者如果我忽略了一些基本的东西。
谢谢! : - )
答案 0 :(得分:7)
看看GNU Radio!
http://gnuradio.org/redmine/projects/gnuradio/wiki
GNU Radio是一个用软件完成无线电信号传输或接收的项目。因为无线电已经使用相移键控,GNU Radio的人已经为你解决了这个问题,GNU Radio已经是一个Python项目了!复杂的DSP内容是用C ++编写的,速度很快,但包装在Python中使用。
这是一个讨论使用差分二进制相移键控(DBPSK)/差分正交相移键控(DQPSK)来传输二进制数据(在该示例中为JPEG图像)的项目的页面。 Python源代码可供下载。
http://www.wu.ece.ufl.edu/projects/softwareRadio/
我看到你的项目是在MIT许可下。 GNU Radio属于GPL3,这对您来说可能是一个问题。您需要弄清楚是否可以使用GNU Radio而无需将项目转换为派生工作,从而迫使您更改许可证。应该可以创建一个独立的“发送守护进程”和一个独立的“接收守护进程”,它们的源代码都是GPL3,然后让你的MIT代码通过套接字连接到它们。
顺便说一句,我的一次搜索发现了BPSK如何工作的非常明确的解释:
祝你好运!答案 1 :(得分:4)
回应关于频率的第一个问题:
查看你的解码器,我看到你的采样率是44100,你的块大小是2048.如果我正确读取,这意味着你的FFT大小是2048.这将使你的FFT bin大小在~21hz。您是否尝试过零填充FFT?零填充FFT不会改变频率,但会提供更好的分辨率。我确实看到你正在使用二次插值来改善你的频率估计。我没有使用过这种技术,所以我不熟悉你从中获得的改进。也许在零填充和二次插值之间取得平衡可以获得更好的频率精度。
此外,根据进行发送和接收的硬件,频率误差可能是驱动A / D的不同时钟的结果 - 其中一个或两个时钟的精确度不是44100Hz。这样的事情可能会影响您在FFT输出上看到的频率。