2011-09-30 15 views
5

我目前正在开展一个比较简单的项目,直到现在。基础项目是使用音频转换在激光器上传输数据/消息。 简而言之过程目前是这样通过激光器进行Python音频传输

  1. 用户输入一个消息
  2. 消息变成二进制
  3. 对于每个1和0的二进制消息中,它起着对应音调的信号,其在我的情况下,250赫兹为1和450赫兹为0.
  4. 输出音频通过立体声电缆发送到音频变压器,使用镭射装置
  5. 太阳能电池板充当麦克风并记录传入“声音”作为文件
  6. 它们播放文件并读取音调,并尝试将每个250和450赫兹与1或0(这是我的问题所在)匹配。

直到声音的实际处理很好,我目前的问题如下。

我在x时间播放每个音调,在接收端记录y个时间,y时间被削减多次采样,然后通过样本分析样本,然后记录每个频率。这是低效和不准确的。无论何时播放音调,我都有过许多问题,因为它经常听到两次音,或根本听不到它,这完全抛弃了整个信息。
我试图将它的采样率与每个音调播放的时间相匹配,但除非相应对齐,否则不起作用。我只对“测试”和“嗨”等消息进行过一些成功的测试。我已经看过bpsk和fsk,但我感觉好像我已经在做类似的事情,但是我有一个糟糕的接收端来破译它。

这是全部用Python编写的,我非常感谢您提供的任何提示,建议或可能的实现。另外对于音调发射,我使用pyaudiere和录音我使用pyaudio

谢谢!

-Steve

+3

好问题 - 这是更多的DSP相关的不是编程有关,但这样你可能会想尝试http://DSP.stackexchange.com –

+0

多久的是什么方法您目前使用的检测每个音调和? –

+0

可能重复[Binary Phase Shift Keying in Python](http://stackoverflow.com/questions/7466715/binary-phase-shift-keying-in-python) –

回答

2

这听起来像一个硬件问题。我很确定它 FSK的工作。大多数现代FSK型系统使用PLL(锁相环芯片)进行实际检测。频率 - 电压或频率 - 电流电路也可用。

我已经在几十个爱好者书籍,数据表和网站上看到了实用电路。这里有几个:

Circuit for demodulating an FSK signal

PLL Tutorial

我希望这不只是一个行程下来的兔子洞,你 - 祝你好运!

0

使用自计时信号表示诸如Manchester code。这样你的时间只需要“足够好”,而且你主要担心在这种情况下检测频率的变化。在链接的文章中,高电平和低电平指的是电压,但没有必要的理由。您可以轻松使用高频和低频,或打开/关闭单个激光。

+0

曼彻斯特码是一个很好的建议,但仍然存在实际音频检测的问题。 –

+0

你可以在这个问题上抛出一个神经网络,给它一个样本的滑动窗口,并在每个时钟周期询问它在那个时刻的性质。您必须在训练数据上手动作出这些决定。 – wberry

1

你做通过听声音文件完整性检查(发送和接收),或与音频编辑器中查看波形,看他们是否大致声音或看起来是一样的?这样,您可以将问题缩小到通道引发的错误与您的软件分析。

你的解码/解调软件将需要能够确定并跟踪时间,从调制的一个频率到另一个音频信号的变化,那么你将需要单独测试此同步方法为偏移误差的同步方法。

1

我会解决使用两个FIR滤波器,一个用于您正试图检测每个频率的接收端。滤波器的系数只是您正在查找的信号的副本(即一种情况下为250Hz,另一种情况下为450Hz)。您必须查看太阳能电池板的输出,以确定它是方波,正弦波还是其他类型的波形。过滤器的长度对应于音调的持续时间(即问题中的'x')。样品并行馈入两个滤波器。需要

每个滤波器的输出进行整流(即取绝对值)和平滑。可以使用简单的移动平均在大约一半的时间内完成平滑(您可以尝试查找最佳值)。然后,如果比较平滑值(即a> b或b> a),则应该得到0和1的流。

事情要意识到:这是假设该通道表现为两个频率相同(即你得到类似SNR和衰减)。您可能需要调整一下您的频率,因为450Hz非常接近500Hz,这是250Hz的谐波。