使用Python使用音频传输数据

时间:2014-11-29 15:59:43

标签: python audio audio-recording data-transfer

我有一个项目,包括取一个字符串并转换成一系列不同频率的声音,然后将声音读回原始文本。

机器1:

“Hello World” - >一些音频

机器2:

部分音频 - > “你好世界”

是否有任何图书馆或项目允许我这样做?如果没有,有关如何实现这一点的任何建议?

1 个答案:

答案 0 :(得分:4)

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

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

如果你想这样做更简单,那么你可以跳过错误纠正部分,但这会带来风险,即你的整个数据在略微不理想的环境下被破坏。

让我们快速浏览一下这个软件部分。

添加纠错码

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

调制

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

示例

我们希望使用5000 Hz的正弦值发送模式00110100为0和10000 Hz作为1.我们选择符号长度为1 ms,因此它是我们两个基本信号的周期的倍数,这改善了形状。 因此,我们发送频率为5000 Hz的正弦波2 ms,然后发送10000 Hz 2 ms,然后发送5000 Hz 1 ms,10000 Hz发送1 ms,最后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)))

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

解调

这可以通过相关函数来完成。基本上你假设你有一个符号,然后看你的接收信号与该符号产生的信号有多相似。相似性是所接收样品和理论样品的所有样品的总和。如果你的频率匹配,那么整个信号的符号应该是相等的,所以这最终会成为一个很大的值,对于不同的频率,符号会在不同的点上发生变化,所有这些都会在零附近结束。对于我们的简单情况,您可以使用假设的零和假定的零来计算相关函数,然后使用较大的一个作为您的接收符号。

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