audio 应用:声波通讯(2)发送原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuweiwei1860/article/details/83930784

声波通讯的一般流程声波通讯流程
可以看到无论是发送还是接受关键的都是中间过程,也就是需要传输的信息内容转换成声音的过程,这个声音到底是什么呢?
声波通讯的信息
每一段都是一个信息的bit,这里很容易认为是通过这些信息bit的输出幅度来判定对应的是哪个ASCII码的,现实的情况是这样做基本不可能实现,音量的大小分辨率很低,通讯双方的距离、播放设备和接收设备的摆放角度和输出幅频响应都会严重影响最终的结果。声音的一个顽疾‘回声’更是会造成干扰。
我们换个角度看这些声波,从频域看一看
声波通讯的频域信息
可以看到这些波形其实是不同的频率的信号连接而成的,关于时域和频域的理解在大学讲的还是比较详细的,通过一个图也能够看清楚:
在这里插入图片描述
将时间轴的信息转换了能量维度。
选用的都是正弦信号,方波信号 三角波都存在其他频率分量,为了尽量减少其他的干扰。
生成方法是选用中学只是的正余弦公式
Y = sin( (2 *PI *Frequency) / SampleRate)
PI 就是常数3.14,Frequency是想要输出的频率,SampleRate 是采样率。
比如想要输出的是8KHZ信号,采样率是48K
正弦波输出公式

Frequency = 8000
SampleRate  = 48000
for(i=0;i<SampleRate  /Frequency ;i++)
data_out =  sin( (2 *PI *i)/(SampleRate  /Frequency) )

通过上面的过程我们就获得了一个完整的8KHZ正弦波的数值,但是这个数值是0~1的值,这里还需要根据输出信号位宽进行放大,
例如输出是16bit的位宽的信号,pcm 信号有极性,输出的最大正值是0x7ffff
sample_out = data_out * 0x7ffff
sample_out 就是最后写入到硬件fifo 发送到dal来播放的数据了。
有了任意频率的信号公式够我们需要建立一个频率和传输数据对应的一个表,建立一个查找表的数组解决这个问题,
在这里插入图片描述
这个函数输入时 0,1,2,3。。。输出就是对应频率的count值,
由于不同频率的信号每周期的采样点是不一样的,为了获得不同数据输出时间相同长度的数据信号,这里建立一个cyc_count的数组,这个数组是频率信号的周期数量。越大频率的信号周期越大。如果没有这个控制,就会出现高频的数据输出时间很短,很容易检测不到这个bit.
这样就可以是线整个过程的数据组合了,最后再调用输出接口将数据输出出去。
在这里插入图片描述

展开阅读全文

没有更多推荐了,返回首页