×

USB音频设计的几个有趣故障案例资料下载

消耗积分:3 | 格式:pdf | 大小:126.17KB | 2021-04-09

分享资料个

, 采用USB接口来确保高品质音频传输到外部设备是一种常用方法。由于使用者只需要把设备插入到预装了驱动程序的通用接口即可,因此其对于音频应用极富吸引力。尽管有这些优势,使用USB音频类时仍然需要对系统设计进行明智的选择,以确保传送音频流时不会发生错误或更加糟糕的频率失配。这篇文章给出了几个有趣的故障案例。 USB音频系统是一个串行桥接系统,,它将来自USB总线的数据包转换成音频(I2S)总线数据包。这条总线通常连接一个编解码器或下游音频处理器(图1)。I2S 总线的棘手之处在于,其需要精准的时钟信号,才能实现高品质音频。 图一:基于USB的音频系统将来自USB总线的数据包转换到I2S总线,后者通常连接编解码器或下游音频处理器 举例来说,典型的音频采样率是48 k个样本/秒。大多数商用编解码器IC需要一个频率为音频采样率整数倍(通常是128或256倍)的纯净时钟。这迫使编解码器的时钟频率达到恐怖的12.288 MHz,而这个频率难以从标准的晶振震荡时钟源中获得。更为复杂的是,支持44.1 k个样本/秒等多个采样率需要为每一个采样率采用同样高品质的时钟。这意味着系统或者配置多个晶振振荡器,或采用非常灵活的时钟方案。 可以使用贴片(SMD)振荡器,但这些通常功耗较大的器件需要高达20 mA的功率,因此不适合电池供电型设备。也可以使用锁相环(PLL)实现灵活的时钟方案。例如,赛普拉斯的PSoC 4-L系列芯片内置PLL和高度可配置的通用数字模块(UDB),可让开发人员设计出灵活的时钟方案。 Clocking Woes—the I2S Bus 时钟悲剧—I2S总线 图二:编解码器和主芯片之间一条典型的I2S总线连接 I2S是用于在两个芯片之间传送音频的标准接口。该协议类似于一个串行外设接口(SPI),只是增加了几个额外的信号。但是,音频数据的性质使得为I2S总线计时比想象的要困难。图2显示了编解码器和主芯片之间典型的I2S总线连接。 I2S总线包括(图3): • Bit clock:用于从Data In和Data Out线路读取数据的时钟。 • Word select:也被称为Left-Right Clock。该信号用于区分左右信道。 • Data out: 主芯片输出的串行数据流。 • Data in:来自编解码器的串行数据流。 图三:I2S总线的主要构件包括bit clock、word select、data in和data out 此外,大多数编解码器还需要一个主时钟(MCLK),用于为编解码器的内部逻辑计时。 音频数据有两种典型的分辨率:16位和24位。如果我们考虑一个立体声数据流,一个采样周期中的总数据流为32或48位。这个周期通常是48/44.1/32 kHz。大多数编解码器在一个word-select周期中最多支持32位,但分辨率可能仍为24位,因为要用0填充到最后。 这将每个采样周期的总数据增至64位。如果我们考虑48-kHz的24位立体声,我们所需的位时钟将为48 × 64 × 2,即6.144 MHz。 编解码器对主时钟的要求取决于所用的编解码器的品牌和类型。现代编解码器支持多个时钟模式,但每个模式都是采样频率(fS).的整数倍。主时钟的值通常为fS的128/256/512倍。因此,48-kHz采样频率的时钟值为 6.144/12.288/24.576 MHz。 USB音频同步 同步来自于I2S 接口的流入/流出数据包是实现USB音频需要克服的一个基础性的问题。USB类别规范定义了几种不同的实现方法: • 同步模式:在同步模式中,从设备的音频时钟将与USB帧起始同步(每1 ms)。这简化了系统的缓冲器管理工作,更加便于维持一个一致的数据流。 • 异步模式:在异步模式中,音频电路的从设备运行一个完全独立于USB时钟的时钟。使用一个通过USB接口的反馈路径来保持数据速率之间的同步。 同步端点模式 在同步端点模式中,所生成的音频时钟与每1ms进入一次的USB帧起始(SOF)包同步(图4)。本质而言,我们从USB恢复时钟,并用它运行编解码器主时钟和I2S模块。同步模式极大简化了缓冲器管理,因为出入的数据包基于同一个时钟。 图四:在同步端点模式中,音频时钟与USB帧起始同步 生成用于支持标准采样率的部分时钟频率依然棘手,涉及一些数学问题。一种方法是使用前馈和反馈混合架构。所需的fS的整数倍由一个高品质的PLL生成。可以使用 1-3 MHz之间的一个参考时钟频率,然后乘以一个可配置的有理分数,以此生成纯净的输出时钟。 PLL的参考时钟由一个快速前馈一级生成。该级计算出本地晶振震荡源生成所需参考时钟所必需除以的分数因子,然后暗中运行这个除法运算。运算由一个双模前置分频器执行,其除法控制输入由一个△Σ调制器驱动,后者接受一个代表分数分频的输入。 一个噪声整形环路提供一个两级输出,后者代表一个数字的分数部分,我们需要将本地时钟频率除以该数字以获取所需参考频率。有关如何恢复USB时钟的详细解释,请参阅:USB音频系统中可编程时钟的生成和同步。 异步模式 图五:在异步模式中,一个独立的时钟源提供主时钟 在异步模式中,主时钟由一个独立的本地时钟源提供(图5)。该模式可实现研发时间和生产成本所能实现的时钟纯净度。系统拥有两个独立的时钟域。PSoC系列可在芯片内创建独立的时钟域,而且能够灵活地确保UDB与CPU和系统时钟完全异步。 我们还遇到了多个音频速率的支持问题。选择合适的晶振和内置PLL,我们有可能创建一个可实现常用音频频率的频率集。这个神奇的数字就是17.2032 MHz(见下表)。 使用PLL异步模式可提供一个没有锁定和同步问题的低抖动时钟,但该模式给系统的缓冲器管理增加了复杂性。这是因为本地晶振振荡器不一定被锁定到主机认为的48 kHz。微小的频率失配将最终导致上溢/下溢,从而导致音频污染。 为了解决这个问题,USB类别规范提供一个反馈端点,它可用于调节主机数据速率,以匹配输入数据包和I2S输出数据流之间的数据速率。系统计算I2S发出的数据包数量,将其与USB SOF进行对比,然后调节反馈端点的值,以匹配平均数据流。简而言之,主机缩小或扩大数据样本数量,以便让一段时间内的平均速率匹配音频采样率。中演示了异步模式USB音频。 (mbbeetchina)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'USB音频设计的几个有趣故障案例资料下载',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);