激光传输Python音频

5 投票
4 回答
1072 浏览
提问于 2025-04-17 03:24

我现在在做一个项目,之前一直比较简单,直到现在为止。这个项目的主要目的是通过激光传输数据或信息,使用音频转换的方式。简单来说,整个过程是这样的:

  1. 用户输入一条信息
  2. 信息被转换成二进制
  3. 对于二进制信息中的每个1和0,播放对应的音调来表示,具体来说,我用250赫兹表示1,用450赫兹表示0。
  4. 发出的音调通过立体声电缆发送到一个连接激光的音频变换器上
  5. 一个太阳能板充当麦克风,记录接收到的“声音”作为文件
  6. 然后它播放这个文件,读取音调,并尝试将每个250赫兹和450赫兹匹配为1或0(这就是我遇到的问题所在)。

到目前为止,声音的实际处理还算正常,但我现在面临以下问题。

我播放每个音调的时间是x,而在接收端录制的时间是y,y的时间被多次切割采样,然后逐个样本进行分析,记录每个频率。这种方法效率低下且不准确。无论我播放音调的时间多长,它经常会听到一个音调两次,或者根本听不到,这样就会完全搞乱整个信息。
我尝试将采样的速率与每个音调播放的时间对齐,但如果没有正确对齐,就无法正常工作。我只成功测试过几条信息,比如'test'和'hi'。我已经研究过bpsk和fsk,但我觉得我已经在做类似的事情,只是接收端的解码效果不好。

这一切都是用Python编写的,如果你能提供任何建议、提示或可能的实现方案,我将非常感激。此外,我在发出音调时使用的是pyaudiere,而录音时使用的是pyaudio

谢谢!

-Steve

4 个回答

1

我会用两个FIR滤波器来处理接收端,一个滤波器用来检测250Hz的信号,另一个用来检测450Hz的信号。这些滤波器的系数其实就是你想要寻找的信号的样子。你需要观察太阳能板的输出,看看它是方波、正弦波,还是介于两者之间的波形。滤波器的长度对应于音调的持续时间,也就是你问题中的'x'。然后,把样本同时输入到这两个滤波器中。

每个滤波器的输出需要进行整流(也就是取绝对值)和光滑处理。光滑处理可以通过简单的移动平均来实现,时间大约是'x'的一半(你可以试着找出最合适的值)。然后,如果你比较这些光滑后的值(比如a是否大于b,或者b是否大于a),你应该能得到一串0和1的信号。

需要注意的是:这个方法假设两个频率的信道表现是一样的(也就是说信噪比和衰减差不多)。你可能需要稍微调整一下频率,因为450Hz离500Hz很近,而500Hz是250Hz的谐波。

1

你有没有通过听声音文件(包括发送和接收的)或者用音频编辑软件查看波形,来检查一下它们听起来或看起来是否大致相同?这样你就可以把问题缩小到是通道引起的错误,还是你的软件分析的问题。

你的解码/解调软件需要一种同步方法,这种方法可以确定并跟踪音频信号从一种调制频率变化到另一种的时间,然后你还需要单独测试这个同步方法,以找出是否有偏差错误。

2

这听起来像是硬件方面的问题。我很确定这确实是FSK的工作。大多数现代的FSK系统使用相位锁定环(PLL芯片)来进行实际的信号检测。频率转电压或频率转电流的电路也可以使用。

我在很多爱好者的书籍、数据手册和网站上见过实际的电路。这里有几个例子:

FSK信号解调电路

PLL教程

希望这不是让你又一次陷入复杂问题的深渊——祝你好运!

撰写回答