你需要看看调制技术。正常程序如下:用纠错码使二进制数据冗余
将数据调制成离散信号
D/A转换器
物理介质传输
A/D转换器采样
解调
误差修正
如果你想做的更简单,那么你可以跳过纠错部分,但这会带来风险,你的整个数据在稍微不太理想的环境下被破坏。在
让我们来快速看看这个软件部分。在
添加纠错码
有很多代码可以做到这一点。一个非常简单的方法就是将每个比特重复多次,在纠错阶段取所有接收比特的平均值。在
调制
你有一个1和0的序列,想把它转换成波形。你可以把它们映射到不同的基信号。在一个简单的情况下,这些信号可以只是不同频率的窦性信号,一般来说,它们可以是任何信号,但应该是正交的,以便在统计上独立。
然后您需要指定一个位的发送时间,即符号长度。你发送信号的时间越长,检测它就越容易,但是每次发送的数据就越少。请记住,我们正在创建一个离散信号,然后通过一些D/a转换器(我们的声卡)。在
一个例子
我们要发送模式00110100,0的正弦值为5000赫兹,1的正弦值为10000赫兹。我们选择我们的符号长度为1毫秒,所以它是我们两个基本信号周期的倍数,这改善了形状。
所以我们发送一个频率为5000Hz的正弦信号,持续2ms,然后发送10000Hz的信号,然后发送5000Hz的信号,持续1ms,然后发送5000Hz的信号,持续1ms,最后发送5000Hz的信号,持续2ms。
要为此创建采样点,我们必须选择音频格式。我们使用44 kHz的采样频率。
执行此操作的代码与此类似:for bit in data:
for i in range(0, sampling_frequency * symbol_length):
signal.append(sin(i * sample_length * symbol_frequency(bit)))
采样频率大约为44 kHz,符号长度为1ms,采样长度为1/采样频率,0的采样频率为5000 Hz,1的采样频率为10000 Hz。在
解调
这可以通过相关函数来实现。基本上你假设你有一个符号,然后看看你接收到的信号和这个符号产生的信号有多相似。相似性是接收样本与理论样本乘积的所有样本之和。如果你的频率匹配,整个信号中的符号应该是相等的,所以这是一个很大的值,对于不同的频率,符号在不同的点发生变化,所有的符号都会在0附近结束。对于我们这个简单的例子,你可以用一个假设的1和一个假设的零来计算相关函数,然后用更大的那个作为你接收到的符号。在