8

使用C或python(首选python),我如何将二进制文件编码为音频,然后通过耳机插孔输出,我如何使用来自麦克风插孔的输入将音频解码回二进制,到目前为止我已经学会了如何使用 python 将文本文件转换为二进制文件,类似于 RTTY 通信。

这样我就可以将数据记录到盒式磁带上。

import binascii

a = open('/Users/kyle/Desktop/untitled folder/unix commands.txt', 'r')
f = open('/Users/kyle/Desktop/file_test.txt', 'w')
c = a.read()
b = bin(int(binascii.hexlify(c), 16))
f.write(b)
f.close()
4

4 回答 4

7

根据您的评论,您希望逐位处理二进制数据,将每一位转换为高音或低音。

你仍然需要准确地确定那些高音和低音是什么,以及每个声音的时长(以及两者之间是否有间隙,等等)。如果你让它变慢,比如每个声音 1/4 秒,那么你就是把它们当作音符。如果你让它非常快,比如 1/44100 秒,你就把它们当作样本。人耳在一秒钟内听不到 44100 种不同的声音;相反,它会听到高达 22050Hz 的单一声音。

一旦你做出了这些决定,你的问题就有两个部分。

首先,您必须生成一个样本流——例如,每秒包含 44100 个 16 位整数的流。对于非常简单的事情,比如以 44k 16 位单声道格式播放一段原始 PCM 文件,或者生成方波,这是微不足道的。对于更复杂的情况,例如播放一段 MP3 文件或从正弦波和滤波器合成声音,您需要一些帮助。该audioop模块以及 stdlib 中的其他一些模块可以为您提供基础知识;除此之外,您还需要在 PyPI 中搜索合适的模块。

其次,您必须将该样本流发送到耳机插孔。Python 中没有对此的内置支持。在某些平台上,您只需打开一个特殊文件并写入即可。但是,更一般地说,您需要在 PyPI 上找到第三方库。

更简单的模块适用于一种特定类型的音频系统。Mac 和 Windows 各有自己的标准,而 Linux 有六种不同的标准。还有一些 Python 模块与更高级别的包装器通信;您可能必须安装和设置包装器,但是一旦您这样做了,您的代码就可以在任何系统上运行。


所以,让我们通过一个非常简单的例子来工作。假设您已经在系统上设置了 PortAudio,并且您已经安装了PyAudio来与它对话。这段代码将播放 441Hz 和 220.5Hz(略高于中 C 和低 C)的方波,持续时间不到 1/4 秒(因为这真的很容易)。

import binascii

a = open('/Users/kyle/Desktop/untitled folder/unix commands.txt', 'r')
c = a.read()
b = bin(int(binascii.hexlify(c), 16))

sample_stream = []
high_note = (b'\xFF'*100 + b'\0'*100) * 50
low_note = (b'\xFF'*50 + b'\0'*50) * 100
for bit in b[2:]:
    if bit == '1':
        sample_stream.extend(high_note)
    else:
        sample_stream.extend(low_note)

sample_buffer = b''.join(sample_stream)

p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(8),
                channels=1,
                rate=44100,
                output=True)
stream.write(sample_buffer)
于 2013-06-05T02:08:34.057 回答
6

那么您想使用音频传输数字信息吗?基本上你想在软件中实现一个MODEM(不管是纯软件,还是叫modem)。

调制解调器(MOdulator-DEModulator)是一种调制模拟载波信号以对数字信息进行编码的设备,并且还解调此类载波信号以对传输的信息进行解码。目标是产生可以轻松传输和解码以再现原始数字数据的信号。调制解调器可用于任何传输模拟信号的方式,从发光二极管到无线电。[维基百科]

您需要通过模拟媒体传输数据的任何地方都有调制解调器,无论是声音、光还是无线电波。您的电视遥控器可能是红外调制解调器。

以纯软件实现的调制解调器称为软调制解调器。我在野外看到的大多数软调制解调器都使用某种形式的FSK调制:

频移键控 (FSK) 是一种频率调制方案,其中数字信息通过载波的离散频率变化来传输。1最简单的 FSK 是二进制 FSK (BFSK)。BFSK 使用一对离散频率来传输二进制(0 和 1)信息。2在此方案中,“1”称为标记频率,“0”称为空间频率。FSK 调制载波的时域如右图所示。[维基百科]

有非常有趣的应用程序通过声波通过大气进行数据传输 - 我猜这是shopkick用来验证用户存在的东西。

对于 Python,请检查GnuRadio项目。

对于 C 库,请查看Steve Underwood的工作(但请不要用愚蠢的问题与他联系)。我用他的软调制解调器为Asterisk引导了一个传真到电子邮件网关(传真传输只不过是一个用音频编码的 B/W TIFF文件,以便通过电话线传输)。

于 2013-06-05T02:05:24.420 回答
1

所以,这里是 Abarnert 的代码,更新到 python3。

import binascii
import pyaudio

a = open('/home/ian/Python-programs/modem/testy_mcTest.txt', 'rb')
c = a.read()
b = bin(int(binascii.hexlify(c), 16))

sample_stream = []
high_note = (b'\xFF'*100 + b'\0'*100) * 50
low_note = (b'\xFF'*50 + b'\0'*50) * 100
for bit in b[2:]:
    if bit == '1':
        sample_stream.extend(high_note)
    else:
        sample_stream.extend(low_note)


sample_buffer = ''.join(map(str, sample_stream))

p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(1),
                channels=1,
                rate=44100,
                output=True)
stream.write(sample_buffer)

# stop stream (4)
stream.stop_stream()
stream.close()

# close PyAudio (5)
p.terminate()


于 2021-01-21T04:52:59.330 回答
0

如果您正在寻找执行此操作的库,我建议您使用libquiet。它使用现有的 SDR 库来执行调制,并提供二进制文件,在一端为您提供管道,另一端使用 PortAudio 将声音直接馈送到声卡。它具有用于“空中”低比特率传输的 GMSK 和用于基于电缆的更高比特率的 QAM。

于 2016-03-12T05:18:25.953 回答