CN114783475A - 基于可编程芯片的usb麦克风阵列实时完整数据流方法 - Google Patents
基于可编程芯片的usb麦克风阵列实时完整数据流方法 Download PDFInfo
- Publication number
- CN114783475A CN114783475A CN202210370519.3A CN202210370519A CN114783475A CN 114783475 A CN114783475 A CN 114783475A CN 202210370519 A CN202210370519 A CN 202210370519A CN 114783475 A CN114783475 A CN 114783475A
- Authority
- CN
- China
- Prior art keywords
- data
- ptr
- data stream
- usb
- circular queue
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G11—INFORMATION STORAGE
- G11C—STATIC STORES
- G11C7/00—Arrangements for writing information into, or reading information out from, a digital store
- G11C7/16—Storage of analogue signals in digital stores using an arrangement comprising analogue/digital [A/D] converters, digital memories and digital/analogue [D/A] converters
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/14—Handling requests for interconnection or transfer
- G06F13/20—Handling requests for interconnection or transfer for access to input/output bus
- G06F13/28—Handling requests for interconnection or transfer for access to input/output bus using burst mode transfer, e.g. direct memory access DMA, cycle steal
- G06F13/282—Cycle stealing DMA
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Transfer Systems (AREA)
Abstract
基于可编程芯片的USB麦克风阵列实时完整数据流方法,包括:乒乓缓冲,主循环解码,环形队列、USB IN中断程序模块。麦克风阵列内需传输处理庞大数据流,而其过程需确保数据流的实时和完整性。为此,首先设计一种软件的乒乓缓冲,通过开辟等长的两段缓存数组,用于交替接收麦克风连续输出的PDM数据流;然后每当某段乒乓缓冲存满数据,便将其整块放入主循环程序内抽取解码,得到PCM数据块;最后将每次解码完成的PCM数据块直接写入设计的环形队列内,待USB IN中断,采用自适应算法从环形队列动态读取数据上传。此外,本发明设计乒乓缓冲大小以保证数据流完整性。以可编程芯片为核心的麦克风阵列,本方法能保障其内庞大数据流传输处理的实时与完整性。
Description
技术领域
本发明属于电子与通信技术领域,更具体地说,涉及基于可编程芯片的USB麦克风阵列实时完整数据流方法。
背景技术
麦克风阵列是实现声源定位、智能视频会议、智能感知等应用的基础,基于嵌入式可编程芯片开发的USB麦克风阵列平台是一种便捷且低成本的方案,商用应用价值大。阵列功能实现的关键在于可编程芯片固件程序的设计,而固件程序的核心是音频数据流架构。为方便开发者基于便捷开源的可编程芯片开发USB音频类设备应用,现有数据流方案难以在计算能力有限的可编程芯片内传输处理庞大音频数据流的过程中保证数据的实时性和完整性。因此,对于以可编程芯片为核心的麦克风阵列,需要一种更加高效,详细,且能够最大化地保证数据流实时与完整性的音频数据流架构方法。音频数据流的设计需考虑解决以下关键问题:
1)音频数据流传输卡顿及丢帧
由于固件程序需要实时完成庞大音频数据流的读写、传输以及处理等过程,主控芯片内部程序任务繁忙。若程序出现阻塞和执行过程中耗时严重,以及数据在读写过程中出现丢帧现象,会使得实时音频数据流受到破坏,丢失有效数据。
2)USB的异步时钟传输
由于USB总线上未设置同步时钟线,USB底层协议也不提供固有的时钟同步机制,因此USB麦克风阵列与系统平台间是异步时钟通信,音频数据流传输过程会出现跨时钟域读写不同步的问题,随着工作时间增长会出现缓存区内数据溢出或读空的现象,即丢失有效数据。
发明内容
为了克服上述现有技术的缺点,对于以嵌入式可编程芯片为控制核心的USB麦克风阵列,本发明对其内部音频数据流架构进行了精巧设计与详细优化,其目的在于提供一种更加高效,详细,且能够最大化地保证数据流实时与完整性的音频数据流架构方法。
为了实现上述目的,本发明采用的技术方案是:
基于可编程芯片的USB麦克风阵列实时完整数据流方法,包括:
乒乓缓冲程序模块,用于提供高效的临时缓冲区,以保证对麦克风PDM数据流进行接收以及后续抽取解码操作的实时性,其主要技术方法是:开辟等长的两段缓存数组buffer0和bufferl,在DMA传输过程使两段缓存不断被交替接收麦克风连续输出的PDM数据流;
主循环解码程序模块,用于对麦克风输出的PDM数据流进行软件上的抽取滤波,以解码为所需的PCM数据流,其过程耗占CPU资源,其主要技术方法是:每当判定乒乓缓冲中的某一段缓存数组存满PDM数据,主循环便将该段缓存数组整块进行抽取解码,进而解码为一PCM数据块;
环形队列程序模块,用于提供足够的内存空间进行快速的数据读写,保证数据流的实时性外,还需保证数据流的完整性,即不丢帧,其主要方法为:在MCU内存中开辟一段元素个数为M=2N(N为正整数)的一维数组que[M],利用位与运算实现读/写指针(即数组元素的索引值,分别用wr_ptr/rd_ptr指代)的反转操作。
USB IN中断程序模块,主要是采用一种自适应算法,从环形队列动态读取适量的音频数据,使得设备内数据量稳定,待系统平台请求数据时进行上传。
优选地,所述乒乓缓冲程序和主循环解码程序模块的进行,需要开启MCU片内的DMA接收中断机制来完成,如:首次时,开启DMA接收任务和DMA接收完成中断,DMA传输PDM数据流的目标缓存为buffer0,当buffer0存满便触发中断;继而,在中断处理函数内,先调换DMA接收的目标缓存为buffer1,然后设定buffer0的写满标志;同时,主循环内循环判定buffer0和buffer1的写满标志,若判定为真,便将对应的一段缓存数组整块地进行软件上的抽取解码。
优选地,所述环形队列程序模块,其实现方法为:
1)分别采用如下操作实现向环形队列快速写入PCM数据:
que[wr_ptr]=wr_value
wr_ptr=(wr_ptr++)&(M-1)
其中,当wr_ptr增至为M的整数倍时,设定wr_ptr=0,即完成写指针wr_ptr的反转;
2)分别采用如下操作实现向环形队列快速读取PCM数据用于USB上传:
rd_value=que[rd_ptr]
rd_ptr=(rd_ptr++)&(M-1)
其中,当rd_ptr增至为M的整数倍大小时,设定rd_ptr=0,即完成读指针rd_ptr的反转。
优选地,对于主循环解码程序模块解码的PCM数据块,环形队列程序模块内采取直接写入环形队列的模式,同时为避免临近尾部时出现写数据指针越界而造成丢帧的问题,方法如下:
将乒乓缓冲的两段缓存buffer0和bufferl大小L都设定为2kwords,则每段缓存抽取解码为PCM数据块后的长度m为2k-1words(每32bit的PDM数据块转化为16bit的1帧),因而环形队列的长度M为PCM数据块长度m的整数倍,避免了数据块直接写入环形队列为满时出现块内数据丢帧的现象。
优选地,所述主循环解码程序模块,将解码的m=2k-1 words PCM数据块写入环形队列后,更新环形队列的写指针:wrptr+=m。
优选地,所述USB IN中断程序模块使用IN端点,为维持设备数据量稳定,采用一种自适应算法,从环形队列内动态读取适量数据上传至系统,主要方法为:首先准确计算当前已采集且未上传的数据量,然后与环形队列半满的数据量进行比较、计算得到调整量,最后由调整量去动态增减上传数据量,使得当前已采集且未上传的数据量保持在环形队列约半满的状态,具体方法如下:
1)准确计算当前已采集且未上传的数据量remain_len的方法为:
remain_len=(wr_ptr-rd_ptr)+(L-remain_DMA_len)/2
式中,remain_DMA_len表示DMA未接收完成的剩余数据量,单位为words。
2)对于调整量的计算,对remain_len与环形队列半满数据量的差值(remain_len-M/2)缩放8倍作为调整量diff,即
diff=(remain_len-M/2)/8
上述方法以减少数据波动,使数据量调整逐步归于同步。
3)由调整量确定上传数据量sendlen。以原本96的上传数据量为基底,若差值大于0,则上传数据量为sendlen=96+diff;若差值小于0,则上传数据量为sendlen=96-diff;其中,需要限制最大调整量,当计算的调整量diff大于24时只取24,即sendlen的范围为72~120words之间。
本发明提出一种更加高效,详细,且能够最大化地保证数据流实时与完整性的音频数据流架构方法,可以使用在基于可编程芯片开发的麦克风阵列固件内,使得阵列设备性能良好。
附图说明
图1是本发明的整体架构图。
图2是本发明的主循环解码程序模块。
图3是本发明的环形队列数据结构及数据读/写示意图。
图4是本发明展示的直接数据写入而产生越界丢帧现象的示意图。
图5是本发明的自适应算法从环形队列动态读取适量数据的计算示意图。
具体实施方式
下面结合附图和实施例详细说明本发明的实施方式。
基于可编程芯片的USB麦克风阵列实时完整数据流方法,其整体架构如图1所示,包括:
乒乓缓冲程序模块,用于提供高效的临时缓冲区,以保证对麦克风PDM数据流进行接收以及后续抽取解码操作的实时性,其主要技术方法是:开辟等长的两段缓存数组buffer0和buffer1,在DMA传输过程使两段缓存不断被交替接收麦克风连续输出的PDM数据流;
主循环解码程序模块,如图2所示,用于对麦克风输出的PDM数据流进行软件上的抽取滤波,以解码为所需的PCM数据流,其过程耗占CPU资源,其主要技术方法是:每当判定乒乓缓冲中的某一段缓存数组存满PDM数据,主循环便将该段缓存数组整块进行抽取解码,进而解码为一PCM数据块;
环形队列程序模块,如图3所示,用于提供足够的内存空间进行快速的数据读写,保证数据流的实时性外,还需保证数据流的完整性,即不丢帧,其主要方法为:在MCU内存中开辟一段元素个数为M=2N(N为正整数)的一维数组que[M],利用位与运算实现读/写指针(即数组元素的索引值,分别用wr_ptr/rd_ptr指代)的反转操作。
USB IN中断程序模块,主要是采用一种自适应算法,图5形象地展示了该自适应算法动态调整读取数据量的计算方法,其主要实现从环形队列动态读取适量的音频数据,使得设备内数据量稳定,待系统平台请求数据时进行上传。
优选地,所述乒乓缓冲程序和主循环解码程序模块的进行,需要开启MCU片内的DMA接收中断机制来完成,如:首次时,开启DMA接收任务和DMA接收完成中断,DMA传输PDM数据流的目标缓存为buffer0,当buffer0存满便触发中断;继而,在中断处理函数内,先调换DMA接收的目标缓存为buffer1,然后设定buffer0的写满标志;同时,主循环内循环判定buffer0和buffer1的写满标志,若判定为真,便将对应的一段缓存数组整块地进行软件上的抽取解码。
优选地,所述环形队列程序模块,其实现方法为:
1)分别采用如下操作实现向环形队列快速写入PCM数据:
que[wr_ptr]=wr_value
wr_ptr=(wr_ptr++)&(M-1)
其中,当wr_ptr增至为M的整数倍时,设定wr_ptr=0,即完成写指针wr_ptr的反转;
2)分别采用如下操作实现向环形队列快速读取PCM数据用于USB上传:
rd_value=que[rd_ptr]
rd_ptr=(rd_ptr++)&(M-1)
其中,当rd_ptr增至为M的整数倍大小时,设定rd_ptr=0,即完成读指针rd_ptr的反转。
优选地,对于主循环解码程序模块解码的PCM数据块,环形队列程序模块内采取直接写入环形队列的模式,同时为避免临近尾部时出现写数据指针越界而造成丢帧的问题,丢帧现象如图4所示,为此,其主要方法如下:
将乒乓缓冲的两段缓存buffer0和buffer1大小L都设定为2kwords,则每段缓存抽取解码为PCM数据块后的长度m为2k-1words(每32bit的PDM数据块转化为16bit的1帧),因而环形队列的长度M为PCM数据块长度m的整数倍,避免了数据块直接写入环形队列为满时出现块内数据丢帧的现象。
优选地,所述主循环解码程序模块,将解码的m=2k-1 words PCM数据块写入环形队列后,更新环形队列的写指针:wrptr+=m。
优选地,所述USB IN中断程序模块使用IN端点,为维持设备数据量稳定,采用一种自适应算法,从环形队列内动态读取适量数据上传至系统,主要方法为:首先,准确计算当前已采集且未上传的数据量;然后,与环形队列半满的数据量进行比较、计算得到调整量;最后,由调整量去动态增减上传数据量,使得当前已采集且未上传的数据量保持在环形队列约半满的状态,具体方法如下:
1)准确计算当前已采集且未上传的数据量remain_len的方法为:
remain_len=(wr_ptr-rd_ptr)+(L-remain_DMA_len)/2
式中,remain_DMA_len表示DMA未接收完成的剩余数据量,单位为words。
2)对于调整量的计算,对remain_len与环形队列半满数据量的差值(remain_len-M/2)缩放8倍作为调整量diff;即
diff=(remain_len-M/2)/8
上述方法以减少数据波动,使数据量调整逐步归于同步。
3)由调整量确定上传数据量sendlen。以96的上传数据量为基底,若差值大于0,则上传数据量为sendlen=96+diff;若差值小于0,则上传数据量为sendlen=96-diff;其中,需要限制最大调整量,当计算的调整量diff大于24时,只取24,即sendlen的范围为72~120words之间。
本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的;本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,这些均属于本发明的保护之内。
Claims (6)
1.基于可编程芯片的USB麦克风阵列实时完整数据流方法,其特征在于,包括:
乒乓缓冲程序模块,用于提供高效的临时缓冲区,以保证对麦克风PDM数据流进行接收以及后续抽取解码操作的实时性,其主要技术方法是:开辟等长的两段缓存数组buffer0和buffer1,在DMA传输过程使两段缓存不断被交替接收麦克风连续输出的PDM数据流;
主循环解码程序模块,用于对麦克风输出的PDM数据流进行软件上的抽取滤波,以解码为所需的PCM数据流,其过程耗占CPU资源,主要技术方法是:每当判定乒乓缓冲的某段缓存数组存满PDM数据,主循环便将该段缓存数组整块进行抽取解码,进而将解码的PCM数据块写入到后续的环形队列;
环形队列程序模块,用于提供足够的内存空间进行快速的数据读写,保证数据流的实时性外,还需保证数据流的完整性,即不丢帧,其主要方法为:在MCU内存中开辟一段元素个数为M=2N(N为正整数)的一维数组que[M],利用位与运算实现读/写指针(即数组元素的索引值,分别用wr_ptr/rd_ptr指代)的反转操作;
USB IN中断程序模块,主要是采用一种自适应算法,从环形队列动态读取适量的音频数据,使得设备内数据量稳定,待系统平台请求数据时进行上传。
2.根据权利要求1所述的基于可编程芯片的USB麦克风阵列实时完整数据流方法,其特征在于,所述乒乓缓冲程序和主循环解码程序模块的进行,需要开启MCU片内的DMA接收中断机制来完成,如:首次时,开启DMA接收任务和DMA接收完成中断,DMA传输PDM数据流的目标缓存为buffer0,当buffer0存满便触发中断;继而,在中断处理函数内,先调换DMA接收的目标缓存为buffer1,然后设定buffer0的写满标志;同时,主循环内循环判定buffer0和buffer1的写满标志,若判定为真,便将对应的一段缓存数组整块地进行软件上的抽取解码。
3.根据权利要求1所述的基于可编程芯片的USB麦克风阵列实时完整数据流方法,其特征在于,所述环形队列程序模块,其实现方法为:利用que[wr_ptr]=wr_value和wr_ptr=(wr_ptr++)&(M-1)操作实现向环形队列快速写入PCM数据,当wr_ptr增至为M的整数倍时,设定wr_ptr=0,即完成写指针wr_ptr的反转;同理,利用rd_value=que[rd_ptr]和rd_ptr=(rd_ptr++)&(M-1)操作不断从环形队列内快速读取PCM数据用于USB上传,当rd_ptr增至为M的整数倍大小时,设定rd_ptr=0,即完成读指针rd_ptr的反转。
4.根据权利要求1、2和3所述的基于可编程芯片的USB麦克风阵列实时完整数据流方法,其特征在于,对于主循环解码程序模块解码的PCM数据块,环形队列程序模块内采取直接写入环形队列的模式,同时为避免临近尾部时出现写数据指针越界而造成丢帧的问题,方法如下:将乒乓缓冲的两段缓存buffer0和buffer1大小L都设定为2kwords,则每段缓存抽取解码为PCM数据块后的长度m为2k-1words(每32bit的PDM数据块转化为16bit的1帧),因而环形队列的长度M为PCM数据块长度m的整数倍,避免了数据块直接写入环形队列为满时出现块内数据丢帧的现象。
5.根据权利要求1所述的基于可编程芯片的USB麦克风阵列实时完整数据流方法,其特征在于,所述主循环解码程序模块,将解码的m=2k-1words PCM数据块写入环形队列后,更新环形队列的写指针:wr_ptr+=m。
6.根据权利要求1和3所述的基于可编程芯片的USB麦克风阵列实时完整数据流方法,其特征在于,所述USB IN中断程序模块使用IN端点,为维持设备数据量稳定,采用一种自适应算法,从环形队列内动态读取适量数据上传至系统,主要方法为:首先准确计算当前已采集且未上传的数据量,然后与环形队列半满的数据量进行比较、计算得到调整量,最后由调整量去动态增减上传数据量,使得当前已采集且未上传的数据量保持在环形队列约半满的状态,具体步骤如下:
首先,准确计算当前已采集且未上传的数据量remain_len的方法为:
remain_len=(wr_ptr-rd_ptr)+(L-remain_DMA_len)/2
式中,remain_DMA_len表示DMA未接收完成的剩余数据量,单位为words;
然后,对于调整量的计算,对remain_len与环形队列半满数据量的差值(remain_len-M/2)缩放8倍作为调整量diff,以减少数据波动,使数据量调整逐步归于同步;
最后,由调整量确定上传数据量sendlen。以96的上传数据量为基底,若差值大于0,则上传数据量为sendlen=96+diff;若差值小于0,则上传数据量为sendlen=96-diff;其中,限制最大调整量,当计算的调整量diff大于24时,只取24,即sendlen的范围为72~120words之间。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210370519.3A CN114783475A (zh) | 2022-04-10 | 2022-04-10 | 基于可编程芯片的usb麦克风阵列实时完整数据流方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210370519.3A CN114783475A (zh) | 2022-04-10 | 2022-04-10 | 基于可编程芯片的usb麦克风阵列实时完整数据流方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114783475A true CN114783475A (zh) | 2022-07-22 |
Family
ID=82428755
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210370519.3A Pending CN114783475A (zh) | 2022-04-10 | 2022-04-10 | 基于可编程芯片的usb麦克风阵列实时完整数据流方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114783475A (zh) |
-
2022
- 2022-04-10 CN CN202210370519.3A patent/CN114783475A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109271335B (zh) | 一种多通道数据源ddr缓存的fpga实现方法 | |
US20180027174A1 (en) | Signaling camera configuration changes using metadata defined for a camera command set | |
US20070079161A1 (en) | Power-efficient technique for invoking a co-processor | |
KR101168498B1 (ko) | 전력 효율적인 일괄 프레임 오디오 디코딩 장치, 시스템 및 방법 | |
JP2007520766A (ja) | データドリブンアーキテクチャにおける選択可能なハードウェアアクセラレータのための装置及び方法 | |
AU2004221088B2 (en) | Pre-empting low-priority traffic with high-priority traffic | |
CN109996104A (zh) | 一种视频播放方法、装置及电子设备 | |
TW201729187A (zh) | 用於使用前饋壓縮統計控制記憶體頻率之系統及方法 | |
US7827386B2 (en) | Controlling memory access devices in a data driven architecture mesh array | |
WO2024077890A1 (zh) | 一种异步fifo读写控制方法、系统及电子设备 | |
CN115344881B (zh) | 一种硬盘加密解密装置、方法、硬盘及i/o接口 | |
US8464006B2 (en) | Method and apparatus for data transmission between processors using memory remapping | |
CN114879584B (zh) | 一种基于fpga的dma控制器边界对齐方法及其电路 | |
CN109408427B (zh) | 一种跨时钟域数据处理方法及系统 | |
WO2020211000A1 (zh) | 数据解压缩的装置与方法 | |
CN114817114A (zh) | 一种mipi接口、及其控制方法、装置及介质 | |
CN114783475A (zh) | 基于可编程芯片的usb麦克风阵列实时完整数据流方法 | |
CN104113933B (zh) | 一种信息传输方法、装置和移动终端 | |
WO2021134909A1 (zh) | 一种节省硬件资源的 vbo 信号处理的方法、装置及终端 | |
CN107846328B (zh) | 基于并发无锁环形队列的网络速率实时统计方法 | |
CN114168503A (zh) | 一种接口ip核控制方法、接口ip核、装置及介质 | |
US7467240B2 (en) | Serial host interface generates index word that indicates whether operation is read or write operation | |
CN207835492U (zh) | 一种双缓存载波解调系统 | |
CN103984586A (zh) | 嵌入式Linux系统下的EMIF与FPGA的接口驱动方法 | |
CN109213710B (zh) | 高速串行接口装置与其数据传输方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |