Python中的二进制相移键控
Posted
技术标签:
【中文标题】Python中的二进制相移键控【英文标题】:Binary Phase Shift Keying in Python 【发布时间】:2011-09-19 05:15:50 【问题描述】:我目前正在编写一些代码,以使用音频转换通过激光传输消息/文件/和其他数据。我当前的代码使用 python 中 binascii 模块中的 hexlify 函数将数据转换为二进制,然后发出 1 的音调和 0 的不同音调。这在理论上可行,尽管不是编码/解码的最快方法,但在测试中证明存在一些错误。
生成的音调不准确,即:在接收端发出 150Hz 可能会变成 145-155Hz,这不是一个大问题,因为我可以将接收端的边界设置得更低或更高。
真正的问题是,如果我发出一个音调并播放它,接收端的计算机可能会根据它对传入音频的采样率读取多次或根本不读取它。我曾尝试以与采样相同的速度播放音调,但这非常不确定。
总的来说,我使用短信成功运行了几次,但由于上述问题,这非常不可靠且不准确。
我对此进行了进一步研究,对此的解决方案看起来可能涉及 BPSK 或二进制相移键控,尽管我不确定如何实现这一点。任何建议或代码示例将不胜感激!
我的项目代码可以在here 找到,但我正在处理的主要文件是二进制解码和编码,即here 和here。我不是python方面的专家,所以如果我说的有问题,我的代码不是最好的,或者我忽略了一些基本的东西,请原谅我。
谢谢! :-)
【问题讨论】:
【参考方案1】:看看 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/
祝你好运!
【讨论】:
谢谢,这将有很大帮助!【参考方案2】:针对第一个关于频率的问题:
查看您的解码器,我发现您的采样率为 44100,块大小为 2048。如果没看错,这意味着您的 FFT 大小为 2048。这将使您的 FFT 箱大小约为 21hz。您是否尝试过将 FFT 归零? FFT 零填充不会改变频率,但会给你更好的分辨率。我确实看到您正在使用二次插值来改善您的频率估计。我没有使用过这种技术,所以我不熟悉你从中获得的改进。也许零填充和进行二次插值之间的平衡将使您获得更好的频率精度。
此外,根据执行传输和接收的硬件,频率误差可能是由驱动 A/D 的不同时钟造成的 - 一个或两个时钟的频率不完全是 44100Hz。类似的事情可能会影响您在 FFT 输出上看到的频率。
【讨论】:
+1 用于零填充。如果您可以提高块大小并处理更多数据,那就更好了。 zone.ni.com/devzone/cda/tut/p/id/4880以上是关于Python中的二进制相移键控的主要内容,如果未能解决你的问题,请参考以下文章
OQPSK:Offset Quadrature Phase Shift Keying偏移正交相移键控的MATLAB仿真/FPGA实现
数字信号调制基于matlab GUI数字信号调制系统含Matlab源码 1030期