使用 Python 使用音频传输数据

car*_*rte 1 python audio data-transfer audio-recording

我有一个项目,涉及将字符串转换为不同频率的声音序列,然后将声音读回原始文本。

机器1:

"Hello World" --> 一些音频

机器2:

一些音频 --> "Hello World"

是否有任何图书馆或项目可以让我这样做?如果没有,有关如何实现这一目标的任何建议?

Leo*_*z0r 6

您将需要了解调制技术。正常的程序是这样的:

  • 使用一些纠错码使二进制数据冗余
  • 将数据调制为离散信号
  • 数模转换器
  • 通过物理介质传输
  • A/D 转换器采样
  • 解调
  • 纠错

如果您想更简单地做到这一点,那么您可以跳过纠错部分,但这会带来风险,即您的整个数据在稍微不是最佳的环境下被破坏。

让我们快速浏览一下它的软件部分。

添加纠错码

有很多代码可以做到这一点。一个非常简单的方法是多次重复每一位,并在纠错阶段取所有接收位的平均值。

调制

您有一个由 1 和 0 组成的序列,并希望将其转换为波形模式。您可以通过将它们映射到不同的基本信号来做到这一点。在一个简单的情况下,这些信号可以是不同频率的正弦信号,通常它们可以是任何信号,但应该是正交的以在统计上独立。然后你需要指定一个比特将被发送多长时间,这称为符号长度。您发送信号的时间越长,就越容易检测到它,但是您每次发送的数据更少。请记住,我们正在创建一个离散信号,然后通过一些 D/A 转换器(我们的声卡)。

一个例子

我们想发送模式 00110100 使用 0 的 5000 Hz 正弦和 1 的 10000 Hz 正弦。我们选择符号长度为 1 ms,因此它是我们两个基本信号周期的倍数,这改善了形状。因此,我们发送频率为 5000 Hz 的 2 ms,然后是 10000 Hz 的 2 ms,然后是 5000 Hz 的 1 ms,10000 Hz 的 1ms,最后是 5000 Hz 的 2 ms。要为此创建采样点,我们必须选择一种音频格式。让我们使用 44 kHz 采样频率。执行此操作的代码类似于以下内容:

for bit in data:
    for i in range(0, sampling_frequency * symbol_length):
        signal.append(sin(i * sample_length * symbol_frequency(bit)))
Run Code Online (Sandbox Code Playgroud)

sample_frequency 将类似于 44 kHz,symbol_length 为 1ms,sample_length 为 1/sampling_frequency,symbol_frequency 为 0 为 5000 Hz,1 为 10000 Hz。

解调

这可以通过相关函数来完成。基本上,您假设您有一个符号,然后查看接收到的信号与该符号生成的信号的相似程度。相似度是接收样本和理论样本的乘积的所有样本的总和。如果您的频率匹配,则整个信号中的符号应该相等,因此这最终会成为一个很大的值,对于不同的频率,符号会在不同的点发生变化,并且最终都会在零附近。对于我们的简单情况,您可以使用假设的 1 和假设的 0 计算相关函数,然后使用较大的作为接收到的符号。

要将创建的音频读取和写入文件,您可以使用默认的 Python 波形库:https : //docs.python.org/2/library/wave.html

  • 这是一个可以完成您所说的项目。https://github.com/romanz/amodem/blob/master/README.rst (2认同)