咻咻咻咻

Context

之前一时兴起买了raspberry pi,本来想用来加上摄像头来做监视器的,但是时间一长就忘记了~

撸完论文就想着,要不要把它用起来,这样就不会感到内疚了。

灵机一动,想到了支付宝以前的声波支付,觉得很有意思,我也拿来做一下吧。

几年前支付宝刚推出声波支付的时候,我们恰好学习了信号与系统,于是我就用手机采集声音,然后进行频谱分析,印象中在20kHz左右的位置出现了两座峰,用Matlab进行过滤掉高频信号后进行播放依然是咻咻咻咻的声音,所以很明显数据是通过高频信号传输的。

这次,我打算也做一套这样的系统,用raspberry Pi做下位机,用手机发出声波数据。就和支付宝声波支付一样。

这个系统想想,好像还挺简单的,但是越做坑儿越多~

下面几章顺序可能有点儿乱,因为我一边做一边改方案,所以做完之后已经忘了学习顺序了,哈哈。

Sound

这次做这个系统,特地借了几本声学的书。

学到了几个新的名词,有声音遮蔽,有声音痛感等。

声音遮蔽还挺有意思的,是说对于人的耳朵来说,某个频率的声音响度高于一个阈值之后,会将其他频率的声音遮蔽。用这个方法可以做数字水印,信息隐藏。

在一条不安全的语音线路上,用语音信号遮蔽隐藏的数据信号,可以迷惑劫持线路的中间人。这还是挺有意思的~

Signal && System

在学习信号与系统这门课之前,都不知道信号还可以在频遇上进行分析。一些时域上很复杂的信号,通过傅立叶变换后进行频域分析,竟然可以得到不复杂的频谱图。

频段串扰?

一开始我打算用两个频段混合使用,这样一个时间窗口内一个频段可以代表一个0或1,如此一来可以一个时间窗口就可以用两个频段来传2个码元了。

但是传输时,发现只能看到一个频段,另一个频段基本看不到,而已我选用的17.5kHz和19.5kHz两个频段进行传输,这两个频段的声音人耳一般是听不见的(反正我是听不见),但是两个使用两个频段一起传输时,可以听到很奇怪的噪声。

我很怀疑是不是不能一个时刻传两个频段的声音,于是去翻了信号与系统的课本。虽然说课本上写着

x(t)+y(t)->X(w)+Y(w)

不过这个可是周期信号,在某个时间窗中两个信号并不是周期信号,所以可能并不能直接加起来,也就是说,会出现新的频段。也就是噪声频段。

这大概是DSP领域的知识了,学得不好下次再研究~

奈奎斯特采样定律

学霸们的自信总是会出问题的~

再记一遍。采样频率是信号最大频率的2倍,一开始把奈奎斯特采样定律记反了,就挺尴尬的了。

系统使用44100Hz的采样频率。根据奈奎斯特采样定律,可以将最大频率为22050Hz的信号无失真的采集,这也是为什么数据传输使用17500hz和19500hz。加上信号带宽后,19500hz数据的最高频率应该还是小于22000Hz的。
所以从理论上来说,使用44100Hz是可以采集到数据的。

PCM

人耳听到的是模拟信号,但是机器只能处理数字信号,所以需要一个方法来将模拟信号转换为数字信号。这就有了PCM,脉冲编码调制。

在采样后,将每个采样点得到的电平分成x分,用一个整数来表示。比如8位的PCM,就将电平分为正负128位。16位PCM就将电平分为正负32768位。

位数越高,声音就采集的越准确。这也是踩了坑才想明白的~

一开始想节省一些内存空间,打算使用8位的PCM来进行发声,然后发出的声音其难听无比,而且完全没有把预想的频段信息播放出来,我甚至觉得是Android端的发声代码写错了。

后来我将PCM数据打印出来一看,确实连我自己都不能相信我发送的是正弦波。毕竟在高频率采样的情况下,几个点就需要表示数据信号的一个周期,如果使用8位PCM,很可能会将数据变成一个三角波的样子。于是我改用了16位PCM,就正常了很多。

Frame

帧格式还是要有的,毕竟是个数字系统。

帧头+数据长度+数据+Checksum+帧尾

其实还挺长的,确定了帧格式就可以设计状态机,从而做到一边接收一边解析。

ASK && FSK

一开始我还在纠结,我做的究竟是个数字通信系统还是模拟通信系统。因为我想了想感觉自己仿佛是在用17k,19k的载波进行调制后通信的。但是后面一想,我都有帧格式了,我都有码元了,那一定是数字通信系统了!

于是翻开通信原理这本书,看到了ASK、FSK、PSK等等等等,最简单的就是ASK了。使用一个频段进行通信,没有检测到信号则代表0,检测到信号则代表1,就是这么简单。

FSK也还行,一个频段代表0,另一个频段代表1。

通信系统和我的系统有些区别,就是通信系统的时间同步做的比较好,但是我的系统没有时间概念,容易出现数据黏包,而这个问题将在下一篇中好好讲讲

Decode

这个也留到下一篇去说,因为感觉挺长的~

End

这个系统做完后,我发现我又重学了信号与系统,通信原理,还学习了很多声学的知识。收获还是挺大的呢。

学了Android的音频开发,Python的音频开发等等,感觉这并不是个简单的系统哇。