2011-09-19 24 views
6

我目前正在研究一些使用音频转换在激光器上传输消息/文件/和其他数据的代码。我当前的代码使用Python中binascii模块的hexlify函数将数据转换为二进制,然后为1发出一个音调,为0发出一个不同的音调。这在理论上是有效的,尽管不是编码/解码的最快方式,但在测试中证明存在一些错误。Python中的二进制相移键控

  1. 产生未发现对音调,即:发射在150Hz可以变成是145-155Hz在接收端,这不是一个大问题,因为我可以只设置在接收端的边界更低或更高。

  2. 真正的问题是,如果我发出一个音并且它被播放,接收端的计算机可能会多次读取它,或根本不会根据它对采样音频进行采样的速率来读取它。我试图以它采样的速度播放这些音调,但这非常不方便。

总之,我已经有几次使用短消息的成功运行,但由于上述问题,这是非常不可靠和不准确的。

我已经进一步研究了这个问题,对此的解决方案看起来可能涉及BPSK或二进制相移键控,尽管我不知道如何实现这一点。任何建议或代码示例将不胜感激!

我的项目代码可以找到here但我正在处理的主要文件是二进制解码和编码,它是herehere。我不是python的专家,所以请原谅我,如果我说的是错误的,我的代码不是最好的,或者如果我忽略了一些基本的东西。

谢谢! :-)

回答

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如何运作这个解释得很清楚:

http://cnx.org/content/m10280/latest/

祝你好运!

+0

谢谢,这会有很大帮助! – sbrichards

4

在回答关于频率的第一个问题:

看你的解码器,我看你的采样率是44100,你的块大小为2048。如果我读这一权利,这意味着你的FFT的大小2048.这会使你的FFT bin大小在〜21hz。你有没有试图填充你的FFT?零填充FFT不会改变频率,但会给您更好的分辨率。我确实看到你正在使用二次插值来改善你的频率估计。我没有使用过这种技术,所以我不熟悉你从中获得的改进。也许在零填充和做二次插值之间的平衡会让你获得更好的频率精度。另外,根据硬件进行发送和接收,频率误差可能是不同时钟驱动A/D的结果 - 一个或两个时钟都不是精确的44100Hz。类似的东西可能会影响你在FFT输出中看到的频率。

+0

用于零填充。如果你能提高块大小并处理更多数据,那更好。 http://zone.ni.com/devzone/cda/tut/p/id/4880 – steveha

+0

非常感谢!不能接受两个答案:/ – sbrichards