基于可编程芯片的usb麦克风阵列实时完整数据流方法
技术领域
1.本发明属于电子与通信技术领域,更具体地说,涉及基于可编程芯片的usb麦克风阵列实时完整数据流方法。
背景技术:2.麦克风阵列是实现声源定位、智能视频会议、智能感知等应用的基础,基于嵌入式可编程芯片开发的usb麦克风阵列平台是一种便捷且低成本的方案,商用应用价值大。阵列功能实现的关键在于可编程芯片固件程序的设计,而固件程序的核心是音频数据流架构。为方便开发者基于便捷开源的可编程芯片开发usb音频类设备应用,现有数据流方案难以在计算能力有限的可编程芯片内传输处理庞大音频数据流的过程中保证数据的实时性和完整性。因此,对于以可编程芯片为核心的麦克风阵列,需要一种更加高效,详细,且能够最大化地保证数据流实时与完整性的音频数据流架构方法。音频数据流的设计需考虑解决以下关键问题:
3.1)音频数据流传输卡顿及丢帧
4.由于固件程序需要实时完成庞大音频数据流的读写、传输以及处理等过程,主控芯片内部程序任务繁忙。若程序出现阻塞和执行过程中耗时严重,以及数据在读写过程中出现丢帧现象,会使得实时音频数据流受到破坏,丢失有效数据。
5.2)usb的异步时钟传输
6.由于usb总线上未设置同步时钟线,usb底层协议也不提供固有的时钟同步机制,因此usb麦克风阵列与系统平台间是异步时钟通信,音频数据流传输过程会出现跨时钟域读写不同步的问题,随着工作时间增长会出现缓存区内数据溢出或读空的现象,即丢失有效数据。
技术实现要素:7.为了克服上述现有技术的缺点,对于以嵌入式可编程芯片为控制核心的usb麦克风阵列,本发明对其内部音频数据流架构进行了精巧设计与详细优化,其目的在于提供一种更加高效,详细,且能够最大化地保证数据流实时与完整性的音频数据流架构方法。
8.为了实现上述目的,本发明采用的技术方案是:
9.基于可编程芯片的usb麦克风阵列实时完整数据流方法,包括:
10.乒乓缓冲程序模块,用于提供高效的临时缓冲区,以保证对麦克风pdm数据流进行接收以及后续抽取解码操作的实时性,其主要技术方法是:开辟等长的两段缓存数组buffer0和bufferl,在dma传输过程使两段缓存不断被交替接收麦克风连续输出的pdm数据流;
11.主循环解码程序模块,用于对麦克风输出的pdm数据流进行软件上的抽取滤波,以解码为所需的pcm数据流,其过程耗占cpu资源,其主要技术方法是:每当判定乒乓缓冲中的某一段缓存数组存满pdm数据,主循环便将该段缓存数组整块进行抽取解码,进而解码为一
pcm数据块;
12.环形队列程序模块,用于提供足够的内存空间进行快速的数据读写,保证数据流的实时性外,还需保证数据流的完整性,即不丢帧,其主要方法为:在mcu内存中开辟一段元素个数为m=2n(n为正整数)的一维数组que[m],利用位与运算实现读/写指针(即数组元素的索引值,分别用wr_ptr/rd_ptr指代)的反转操作。
[0013]
usb in中断程序模块,主要是采用一种自适应算法,从环形队列动态读取适量的音频数据,使得设备内数据量稳定,待系统平台请求数据时进行上传。
[0014]
优选地,所述乒乓缓冲程序和主循环解码程序模块的进行,需要开启mcu片内的dma接收中断机制来完成,如:首次时,开启dma接收任务和dma接收完成中断,dma传输pdm数据流的目标缓存为buffer0,当buffer0存满便触发中断;继而,在中断处理函数内,先调换dma接收的目标缓存为buffer1,然后设定buffer0的写满标志;同时,主循环内循环判定buffer0和buffer1的写满标志,若判定为真,便将对应的一段缓存数组整块地进行软件上的抽取解码。
[0015]
优选地,所述环形队列程序模块,其实现方法为:
[0016]
1)分别采用如下操作实现向环形队列快速写入pcm数据:
[0017]
que[wr_ptr]=wr_value
[0018]
wr_ptr=(wr_ptr++)&(m-1)
[0019]
其中,当wr_ptr增至为m的整数倍时,设定wr_ptr=0,即完成写指针wr_ptr的反转;
[0020]
2)分别采用如下操作实现向环形队列快速读取pcm数据用于usb上传:
[0021]
rd_value=que[rd_ptr]
[0022]
rd_ptr=(rd_ptr++)&(m-1)
[0023]
其中,当rd_ptr增至为m的整数倍大小时,设定rd_ptr=0,即完成读指针rd_ptr的反转。
[0024]
优选地,对于主循环解码程序模块解码的pcm数据块,环形队列程序模块内采取直接写入环形队列的模式,同时为避免临近尾部时出现写数据指针越界而造成丢帧的问题,方法如下:
[0025]
将乒乓缓冲的两段缓存buffer0和bufferl大小l都设定为2kwords,则每段缓存抽取解码为pcm数据块后的长度m为2
k-1
words(每32bit的pdm数据块转化为16bit的1帧),因而环形队列的长度m为pcm数据块长度m的整数倍,避免了数据块直接写入环形队列为满时出现块内数据丢帧的现象。
[0026]
优选地,所述主循环解码程序模块,将解码的m=2
k-1 words pcm数据块写入环形队列后,更新环形队列的写指针:wrptr+=m。
[0027]
优选地,所述usb in中断程序模块使用in端点,为维持设备数据量稳定,采用一种自适应算法,从环形队列内动态读取适量数据上传至系统,主要方法为:首先准确计算当前已采集且未上传的数据量,然后与环形队列半满的数据量进行比较、计算得到调整量,最后由调整量去动态增减上传数据量,使得当前已采集且未上传的数据量保持在环形队列约半满的状态,具体方法如下:
[0028]
1)准确计算当前已采集且未上传的数据量remain_len的方法为:
[0029]
remain_len=(wr_ptr-rd_ptr)+(l-remain_dma_len)/2
[0030]
式中,remain_dma_len表示dma未接收完成的剩余数据量,单位为words。
[0031]
2)对于调整量的计算,对remain_len与环形队列半满数据量的差值(remain_len-m/2)缩放8倍作为调整量diff,即
[0032]
diff=(remain_len-m/2)/8
[0033]
上述方法以减少数据波动,使数据量调整逐步归于同步。
[0034]
3)由调整量确定上传数据量sendlen。以原本96的上传数据量为基底,若差值大于0,则上传数据量为sendlen=96+diff;若差值小于0,则上传数据量为sendlen=96-diff;其中,需要限制最大调整量,当计算的调整量diff大于24时只取24,即sendlen的范围为72~120words之间。
[0035]
本发明提出一种更加高效,详细,且能够最大化地保证数据流实时与完整性的音频数据流架构方法,可以使用在基于可编程芯片开发的麦克风阵列固件内,使得阵列设备性能良好。
附图说明
[0036]
图1是本发明的整体架构图。
[0037]
图2是本发明的主循环解码程序模块。
[0038]
图3是本发明的环形队列数据结构及数据读/写示意图。
[0039]
图4是本发明展示的直接数据写入而产生越界丢帧现象的示意图。
[0040]
图5是本发明的自适应算法从环形队列动态读取适量数据的计算示意图。
具体实施方式
[0041]
下面结合附图和实施例详细说明本发明的实施方式。
[0042]
基于可编程芯片的usb麦克风阵列实时完整数据流方法,其整体架构如图1所示,包括:
[0043]
乒乓缓冲程序模块,用于提供高效的临时缓冲区,以保证对麦克风pdm数据流进行接收以及后续抽取解码操作的实时性,其主要技术方法是:开辟等长的两段缓存数组buffer0和buffer1,在dma传输过程使两段缓存不断被交替接收麦克风连续输出的pdm数据流;
[0044]
主循环解码程序模块,如图2所示,用于对麦克风输出的pdm数据流进行软件上的抽取滤波,以解码为所需的pcm数据流,其过程耗占cpu资源,其主要技术方法是:每当判定乒乓缓冲中的某一段缓存数组存满pdm数据,主循环便将该段缓存数组整块进行抽取解码,进而解码为一pcm数据块;
[0045]
环形队列程序模块,如图3所示,用于提供足够的内存空间进行快速的数据读写,保证数据流的实时性外,还需保证数据流的完整性,即不丢帧,其主要方法为:在mcu内存中开辟一段元素个数为m=2n(n为正整数)的一维数组que[m],利用位与运算实现读/写指针(即数组元素的索引值,分别用wr_ptr/rd_ptr指代)的反转操作。
[0046]
usb in中断程序模块,主要是采用一种自适应算法,图5形象地展示了该自适应算法动态调整读取数据量的计算方法,其主要实现从环形队列动态读取适量的音频数据,使
得设备内数据量稳定,待系统平台请求数据时进行上传。
[0047]
优选地,所述乒乓缓冲程序和主循环解码程序模块的进行,需要开启mcu片内的dma接收中断机制来完成,如:首次时,开启dma接收任务和dma接收完成中断,dma传输pdm数据流的目标缓存为buffer0,当buffer0存满便触发中断;继而,在中断处理函数内,先调换dma接收的目标缓存为buffer1,然后设定buffer0的写满标志;同时,主循环内循环判定buffer0和buffer1的写满标志,若判定为真,便将对应的一段缓存数组整块地进行软件上的抽取解码。
[0048]
优选地,所述环形队列程序模块,其实现方法为:
[0049]
1)分别采用如下操作实现向环形队列快速写入pcm数据:
[0050]
que[wr_ptr]=wr_value
[0051]
wr_ptr=(wr_ptr++)&(m-1)
[0052]
其中,当wr_ptr增至为m的整数倍时,设定wr_ptr=0,即完成写指针wr_ptr的反转;
[0053]
2)分别采用如下操作实现向环形队列快速读取pcm数据用于usb上传:
[0054]
rd_value=que[rd_ptr]
[0055]
rd_ptr=(rd_ptr++)&(m-1)
[0056]
其中,当rd_ptr增至为m的整数倍大小时,设定rd_ptr=0,即完成读指针rd_ptr的反转。
[0057]
优选地,对于主循环解码程序模块解码的pcm数据块,环形队列程序模块内采取直接写入环形队列的模式,同时为避免临近尾部时出现写数据指针越界而造成丢帧的问题,丢帧现象如图4所示,为此,其主要方法如下:
[0058]
将乒乓缓冲的两段缓存buffer0和buffer1大小l都设定为2kwords,则每段缓存抽取解码为pcm数据块后的长度m为2
k-1
words(每32bit的pdm数据块转化为16bit的1帧),因而环形队列的长度m为pcm数据块长度m的整数倍,避免了数据块直接写入环形队列为满时出现块内数据丢帧的现象。
[0059]
优选地,所述主循环解码程序模块,将解码的m=2
k-1 words pcm数据块写入环形队列后,更新环形队列的写指针:wrptr+=m。
[0060]
优选地,所述usb in中断程序模块使用in端点,为维持设备数据量稳定,采用一种自适应算法,从环形队列内动态读取适量数据上传至系统,主要方法为:首先,准确计算当前已采集且未上传的数据量;然后,与环形队列半满的数据量进行比较、计算得到调整量;最后,由调整量去动态增减上传数据量,使得当前已采集且未上传的数据量保持在环形队列约半满的状态,具体方法如下:
[0061]
1)准确计算当前已采集且未上传的数据量remain_len的方法为:
[0062]
remain_len=(wr_ptr-rd_ptr)+(l-remain_dma_len)/2
[0063]
式中,remain_dma_len表示dma未接收完成的剩余数据量,单位为words。
[0064]
2)对于调整量的计算,对remain_len与环形队列半满数据量的差值(remain_len-m/2)缩放8倍作为调整量diff;即
[0065]
diff=(remain_len-m/2)/8
[0066]
上述方法以减少数据波动,使数据量调整逐步归于同步。
[0067]
3)由调整量确定上传数据量sendlen。以96的上传数据量为基底,若差值大于0,则上传数据量为sendlen=96+diff;若差值小于0,则上传数据量为sendlen=96-diff;其中,需要限制最大调整量,当计算的调整量diff大于24时,只取24,即sendlen的范围为72~120words之间。
[0068]
本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的;本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,这些均属于本发明的保护之内。