Xilinx社区
首页 > 技术专栏 > 骁龙820A汽车与智能设备间进行USB音频分享方案介绍—usb音频信号同步
骁龙820A汽车与智能设备间进行USB音频分享方案介绍—usb音频信号同步
来源:技术专家 时间:2018-01-01

上一篇《骁龙820A汽车与智能设备间进行USB音频分享方案介绍—USB虚拟双声卡 》对涉及到的技术关键细节作进一步的详细分析,这一篇是介绍usb音频信号同步解决方案。

        前篇文章已经介绍了USB虚拟双声卡基本原理,这次来说说解决USB音频信号同步的思路。USB总线协议经历了从USB1.1到USB2.0再到目前的USB OTG(USB On-The-Go)的发展过程,在USB不断发展完善的同时,越来越多的USB产品大量上市。现在的PC机通过USB Hub设备和多个USB控制器,能同时支持扩展的USB设备已经达到数百个。

        从市场上看,虽然在USB标准中定义了USB_DE-VICE_CLASS_AUDIO,但是很少有此类设备问世。目前称为USB音箱的设备,大都使用 USB_DEVICE_CLASS_POWER,仅仅将USB接口作为电源使用。信号仍然需要3.5 mm立体声音频线连接使用,连接相对复杂。这样没有体现USB设备连接简单,操作方便的优势,且采用模拟信号传送会产生一定的信号失真,影响音质。

1.USB_DEVICE_CLASS_AUDIO介绍

    为简化USB设备的开发过程,USB提出了设备类的概念。其中的音频设备类(USB_DEVICE_CLASS_AU-DIO)是目前为止使用比较少的类型。

  USB_DEVICE_CLASS_AUDIO是专门针对USB音频设备定义的一种专用类别,它不仅定义了音频输入/输出端点的标准,还提供了音量控制、混音器配置、左右声道平衡,甚至包括对支持杜比音效解码设备的支持,功能相当强大。不同的开发者可以根据不同的需求对主机列举自己的设备结构,主机则根据列举的不同设备结构提供相应的服务。

    USB_DEVICE_CLASS_AUDIO设备采用USB传输模式中的Isochronous transfers模式,Isochronous trans-fers传输模式是专门针对流媒体特点的传输方法。它依照设备在链接初始化时列举的参数,保证提供稳定的带宽给采用该模式的设备或端点。由于对实时性的要求,它不提供相应的接收/应答和握手协议。这很好地适应了音频数据流量稳定、对差错相对不敏感的特点。

        由于USB总线拓扑结构的特殊性,所有数据传输都由主机(PC)发起,在设备插上USB接口并完成初始化、列举等步骤以后,主机会按照设备列举的要求进行流量分配。USB全速模式总线以1 ms为1帧。由于采用Isoch-ronous transfers模式,为测试方便,音频格式采用8 k/s采样率,8位量化。

2. 自适应软件锁相环设计

  之前采用简单的缓存门限控制方法判断是否需要插值,即当缓存高于某门限时,丢弃一个PCM样点。而当低于某一门限时,插入一个PCM样点,由于时钟速度差异的长期固有性,在插入/丢弃一个PCM样点后,缓存数量仍然可能继续减少或增加,从而造成程序无规律的爆发式的插入或丢弃数据操作,产生不可接受的噪音。

因而在算法设计时,重点考虑以下几点:

操作的稳定性:不能有对数据突发性的操作。

操作的分散性:要尽量平均的控制信号,把插入/丢弃产生的失真平均化。

资源消耗量小:要适应嵌入式系统成本低廉、片上存储、运算资源不是很富裕的客观条件。

音频的实时性:声音对实时性要求较高,不能出现停顿、明显延迟等情况。

  因此,采用一种插入/丢弃样本间隔平均化的自适应模糊控制算法进行设计。

   针对两次插值/丢弃操作之间的样点数进行控制,而非对样点本身,在每次插值/丢弃操作后进行速率匹配判断,修改插值/丢弃间隔。由于通常这种时钟差异在千分之一量级,插入/丢弃操作间隔也在千样点量级,大大减少了频繁的判断操作,如下图所示:

图片1.png


3 测 试

(1)基本性能

  关闭软件锁相环,系统在缓存中存放240sample开始播放。而每次当程序播放约45 s时,由于缓存消耗殆尽,语音会自动中断,无法播放。

  开启软件锁相环,程序可以无时间限制运行,达到设计目的。

(2)缓存需求测试

  在播放至少10 min稳定以后,利用变量rangel和range2跟踪缓存内数据数量波动范围,记录最大值和最小值,分12次测试,如图所示

图片2.png

可见,在启动软件锁相环以后,缓存中数据量最大浮动范围在192~250 sample之间。因此,为保证数据不溢出,只需要约60字节空间作为缓存就能维持设备正常工作。

(3)估算时钟偏差测试

        在不同电脑上运行10 min以上,提取插入/丢弃数据间隔,取倒数可以得到稳定后设备和USB时钟偏差率。由下图可见,总体偏差在0.001~0.003以内,基本符合预期。

图片3.png

结 语

  基于插值算法的自适应软件锁相环,适用于针对USB_Audio_Class_Device的时钟同步需求它在达到设计要求的前提下,对嵌入式系统内存和MIPS占用极低,非常适合在利用USB总线作为音频数据传输或通信双方存在一定的不确定速率的误差且需要设备自主完成数据同步的设备中使用。


more汽车电子市场动态
more技术专栏
more专家答疑
问:配置高通pmd9607的mpp管脚, 设置为模拟输入一直量不到电压,请教。
答:需要注意,MPP管脚并不是所有MPP管脚都可以配置的,请参考spec说明,你需要配置的pin有没有限制。通常模拟输入的话,还要配置ANA_IN_CTL等寄存器,需要外接模拟量,然后读取该pin的值的寄存器中HKADC值。
问:专家请指导: sensor厂家给的sensor相关资料(chromatix + lib)是支持前置摄像头的,“支持”主要是我这边验证过前置已经点亮。 后置摄像也用同sensor, 但用这套相关资料就点不亮了。 kernel层确认已经PROBE, 同时在/dev下有media0 media1,请协助该如何完成后置的点亮. p.s: 1. 该板后置如果使用其他sensor,可以点亮前后置摄像头; 2. 将后置摄像头拆卸, 可点亮前置, 不拆卸后置,同样可以点亮前置; 3. 如果前置后置一样, 前后置都点不亮, 但kernel层确认都probe, dev下有camera0,camera1,camera2; 4. 拆卸前置,仅后置, 依然无法点亮, kernel已经probe,dev下有camera0,camera1 针对前后置同sensor, 在sensor_init.c增加2sensor, 分别命名为: sensor, sensor_rear,同时在sensor_Libs目录下增加sensor,sensor_rear目录,主要是针对lib部分, 同时对lib中camera_id和position做对应修改(前:CAMERA_1,1,后: CAMERA_0,0) 写的太多, 一句话说明下问题: 前后置同sensor如何同时点亮前后置sensor, 是否需要修改lib中的参数,如何修改?还是其他问题?
答:从现象描述看,可以从以下几点排查。 1,sensor的配置,通常后置sensor 4lanes,而前置sensor 2lanes。换不同型号的sensor可以点亮,说明这些配置可能没有修改 导致一些问题。 2,重点看下,“拆卸前置,仅后置, 依然无法点亮,dev下有camera0,camera1,”,对比下前后置不同型号 枚举dev也是这样,看看HAL层dumpimage检查图像是否正常。 3,camera id枚举冲突,无法区分两颗相同的sensor,tuning参数调用是否正确。
问:请教专家,UE 链路层怎么样才能主动和NODE B断开。 设备和基站没有OTA log,也不太清楚是什么原因导致的连接断开。
答:可以通过AT命令CREG可以离线和在线网络。不知道是否是您需要的情况。 http://blog.chinaunix.net/uid-149881-id-2780145.html
问:有没有懂高通平台root 和解网络锁的高手?
答:eng和userdebug版本上通过adb root。你是否需要如下的方法么, https://zhidao.baidu.com/question/557640730.html
Copyright ©2000-2015 ELECTRONIC ENGINEERING & PRODUCT WORLD. All rights reserved.
京ICP备12027778号-2 北京市公安局备案:1101082052