这种情况应该保证那个中断的实时响应,或者应该怎么写程序!

[复制链接]
 楼主| x_tin 发表于 2007-7-31 14:22 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;&nbsp;是这样的:&nbsp;采样速率为48KHz(20.8uS)的数字音频信号通过I2S接口接到DSP的McBSP上,DSP需要对他进行立体声编码,立体声编<br />码中用到一个19KHz的导频信号!现在&nbsp;准备设&nbsp;DSP的定时器&nbsp;使他产生&nbsp;1/(19KHz*8=152KHz)&nbsp;=6.58uS&nbsp;的中断.在中断中直接给<br />正弦波的8个点的采样值,从而产生19KHz的信号!.&nbsp;&nbsp;因为要实现立体声的编码&nbsp;所以在每一次的定时中断里面不光要使输出正<br />弦波的采样值&nbsp;还要使采样值通过公式加上&nbsp;音频数据.&nbsp;&nbsp;那么这种情况&nbsp;是要保证定时器的中断实时响应喃&nbsp;&nbsp;还是保证音频数<br />据接收的实时响应.或者接收不用中断,在定时器中断里面&nbsp;查询有无新数据(定时器中断比音频数据采样率要快).&nbsp;还有就是&nbsp;<br />因为要能使&nbsp;音频数据能够&nbsp;延长一段时间后播出,而且延长时间最小要能达到1uS,所以现在在接收中断里要存储接收到的数<br />据&nbsp;然后还要调整写和读的指针&nbsp;然后还要&nbsp;乘上&nbsp;音量什么的&nbsp;所以占用了&nbsp;接近2uS的时间(感觉不能到主程序中去做这些事,要<br />不然&nbsp;声音不就失真了啊).&nbsp;&nbsp;定时器中断里&nbsp;因为要编码&nbsp;有个公式要计算&nbsp;所以也占用了&nbsp;接近2uS.那么现在该怎么办啊&nbsp;如果<br />接收优先级高&nbsp;,他要干2uS&nbsp;才能出来&nbsp;那定时的肯定就不准了(而且偏离的较大总共才&nbsp;6点几个uS&nbsp;误差了2uS),如果定时器中<br />断优先的话&nbsp;那么就有可能声音信号来了&nbsp;却没接收&nbsp;,这样对声音有没影响?.<br />&nbsp;&nbsp;&nbsp;&nbsp;语文不大好,不知道有没表述清楚.&nbsp;知道的大虾,希望能指点一下.先谢过!&nbsp;
xwj 发表于 2007-7-31 15:22 | 显示全部楼层

基本原则:软件分层处理,中断只作必要的操作

基本原则:软件分层处理,中断只作必要的操作,尽量让出时间片给别的程序或中断<br />比如:<br />接收进缓存,改标志<br />发送读缓存,改标志<br />定时器只改标志,和最简单的送数等<br /><br /><br />其他的耗时长的计算、编解码等放主程序里,使用标志、缓存和中断交换数据,<br />必要时用双缓存,就算处理被中断打断也没关系<br /><br /><br /><br />你自己仔细想想吧,想通了就简单了
 楼主| x_tin 发表于 2007-7-31 16:51 | 显示全部楼层

谢谢 xwj

谢谢&nbsp;xwj,&nbsp;你说的&nbsp;我基本能理解&nbsp;呵呵!&nbsp;我写单片机的时候&nbsp;都是这样干的!&nbsp;但是这个没敢这样用&nbsp;呵呵!&nbsp;我在想&nbsp;那个音频信号&nbsp;来的速度还是好快的&nbsp;还有那个定时中断,&nbsp;如果在中断里面简单的收数&nbsp;做标记,再出来到主程序里面处理.这样的话&nbsp;什么时候处理这个数的时间&nbsp;不就不一定了啊(虽然肯定很快&nbsp;呵呵)&nbsp;那假如差个1uS的话.本身音频信号&nbsp;就20uS&nbsp;差1个uS&nbsp;的话,会不会出现声音就不连续了啊&nbsp;呵呵!&nbsp;而且要求是能够延时&nbsp;达到1uS,那么误差都1uS了&nbsp;那个延时还有什么意义喃!&nbsp;又感觉说的有点乱,谢谢大虾的指点!&nbsp;&nbsp;
wowow 发表于 2007-7-31 19:37 | 显示全部楼层

一个中断就搞定了呀

48KHz的中断采样,再加上DDS方法合成19kHz的正弦波就行了。DDS的概念自己去搜,这里介绍一下方法。<br />DDS可以用于合成频率为Fout,采样率为Fs的正弦波,你这里Fout=19k,Fs=48k.<br />思路是计算正弦波在每个采样点的相位(也就是角度),知道了角度,幅度一查正弦表不就出来了?由于是等间隔采样,两点之前的相位差就是固定的了。有以下计算公式:<br /><br />相位差M&nbsp;=&nbsp;(2^m)&nbsp;*&nbsp;Fout&nbsp;/Fs<br /><br />假设你要求的精度不高,就用256点的查找表,则m=8,<br />M=256×19/48=101.3333,<br />不是整数不要紧,再补8位小数位,算上小数位的公式为:<br />相位差M&nbsp;=&nbsp;(2^(m+k))&nbsp;*&nbsp;Fout&nbsp;/Fs<br />一般m+k要凑成16或32bit,这样相累加时超过一个周期正好自动溢出了。<br /><br />每次48kHz中断计算相位:P=P+M,然后P取整数部分查正弦表,就得到正弦波的当前幅度了。再乘个比例系数加上采集的信号就行了。<br /><br />如果要求的精度比较高,查找表就比较大了,可以由正弦波对称性半周期或四分之一周期查表。<br /><br /><br /><br /><br />
wowow 发表于 2007-7-31 19:44 | 显示全部楼层

输出也可以在同一个中断里

弄一个环形缓冲区,输入指针p1,输出指针p2,根据要求的延时设好p1/p2间隔,采样一个样计算好后存入p1,同时输出p2,再移动两个指针
 楼主| x_tin 发表于 2007-8-1 08:19 | 显示全部楼层

谢谢~

谢谢&nbsp;wowow:&nbsp;DDS的概念我是知道一点的呵呵!&nbsp;实际上这个立体声的音频信号&nbsp;最后&nbsp;在程序里面换算成频率字&nbsp;然后加上一个&nbsp;载频的频率字后&nbsp;送到&nbsp;后一级的DDS芯片后&nbsp;产生一个&nbsp;调频信号&nbsp;后发生出去!&nbsp;一直就在用DDS&nbsp;&nbsp;怎么就没想起来&nbsp;这个也用DDS喃&nbsp;呵呵!&nbsp;48KHz已经大于19KHz两倍了&nbsp;呵呵!而实际上48KHz里面还包含&nbsp;左右声道,所以实际中断就是96KHz了!&nbsp;就更行了.事实是还要产生一个38KHz&nbsp;的副载波的频率.这样看&nbsp;也能搞定了&nbsp;呵呵!&nbsp;谢谢&nbsp;指点!&nbsp;&nbsp;还有就是那个延时&nbsp;,因为精度要求是1uS(更小就更好了),而音频信号的两个采样点的最小间隔是1/48K=20.8uS.如果按照您说道&nbsp;方法来欲存数的话!是不是&nbsp;分辨率就只能达到&nbsp;20.8了啊!&nbsp;有没有方法使他能达到要求的1喃&nbsp;呵呵!软件延时&nbsp;肯定是不能用的.这样的话&nbsp;我想是否可以用插值的方法,就是在没两个采样间隔点之间人为的插上20个点&nbsp;这样的话&nbsp;再移动指针,分辨率是不是&nbsp;就变成大概1uS了喃!&nbsp;我想象中应该是的!不知道是不是,但是这样的话,如果想延长时间比较长就难办了,因为存储器是有限制的!要求能达到400mS,我的天这样算一下要上M级别的存储了.呵呵!因为延长的时间&nbsp;太短&nbsp;所以现在根本都不知道延长的是不是1uS了!哎!搞死的了!&nbsp;非要1uS那么短&nbsp;问怎么检测&nbsp;也说不出来!&nbsp;人耳能听出来才怪!<br />再次&nbsp;感谢&nbsp;呵呵!&nbsp;这样的话&nbsp;那个定时器的中断就可以不要了&nbsp;呵呵!&nbsp;我怎么就没想到喃!&nbsp;真是高人啊!&nbsp;谢谢!马上用这个方法试一下下&nbsp;呵呵!
yxwsz 发表于 2007-8-1 10:44 | 显示全部楼层

DMA

MCBSP可以触发DMA,在CPU不介入的情况下传送数据;<br />你去好好看看介绍DMA的文档
soso 发表于 2007-8-1 19:08 | 显示全部楼层

我觉得 MCBSP中断不做音频数据处理,处理全部放到外面.

&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;还有就是哪个延长时间1us,&nbsp;似乎没的意义.
xwj 发表于 2007-8-1 19:15 | 显示全部楼层

唉,服了你了,这都扯不清

  
wowow 发表于 2007-8-1 21:10 | 显示全部楼层

关于延时

先仿真一下能否用线性相位的FIR滤波器产生特定的信号延时。如果可行的话,生成20组或更多的FIR滤波器系数,分别能产生1us-20.8us的延时,这样的话需要的延时可以计算为N*20.8+k,输出信号时先延时N个采样点,再用第k组FIR滤波器产生1us-20.8us的延时。<br /><br />以上仅供参考,如何生成需要的滤波器参数我也不清楚。如果你能搞定的话说不定可以写篇**发发。网上有篇用N个采样点延时的方法的**到处转的有,你弄出来水平就高多了:)。
 楼主| x_tin 发表于 2007-8-2 23:41 | 显示全部楼层

再次 感谢大家

谢谢大家!&nbsp;立体声终于跑出来了&nbsp;呵呵!&nbsp;原来广播也能收到咚咚的立体声。不过现在不知道从那里跑来一个噪音在里面。我试啊试&nbsp;试半天&nbsp;他还在!&nbsp;晕倒!现在发现处理器速度确实是比较重要,乘以一个立即数行,换成乘以变量就没声音了。<br />wowow,谢谢你提出的方法。呵呵!你要不讲&nbsp;我估计我很久很久很久以后才能知道!&nbsp;呵呵!仔细想了一下,这种方法跟软件延时有点象,但是因为我还要把这个频率字送给DDS芯片。要送32位的频率字。还是通过SPI口。然后这个过程我测了一下。居然干掉接近2uS&nbsp;.DDS有两个脚我用DSP的GPIO口控制的。然后给那个GPIO置0或者1&nbsp;居然也要300多nS,不知道是不是&nbsp;因为不能位寻址造成的。<br />现在是接收到一个数据后要移动两个指针。还要判断他们有没到边界。然后还要乘以一个音量个加上导频和副载波。然后把得到的频率字还要送到DDS。整个大概需要&nbsp;接近5uS。可能是方法问题,把时间搞的这么长。如果是这样的话,那么用N*20.8+k&nbsp;&nbsp;这个k是不是&nbsp;不能大于20.8-5=15.8喃,因为要大于15.8的话就会出现这个点还没搞玩喃&nbsp;另一个点就来了,这肯定就乱了&nbsp;漏点了可能。我现在打算&nbsp;如果那个底噪声要是搞没了。就先用插点的方法&nbsp;先插10个点做到2uS&nbsp;&nbsp;总时间做到40mS&nbsp;再说!<br />再次感谢!<br />
wowow 发表于 2007-8-3 09:31 | 显示全部楼层

移动两个指针可以不用判边界

你用的什么DSP?应该有circular&nbsp;addressing方式吧?<br />spi输出到DDS要不了2us吧?难道没用McBsp用的GPIO?<br /><br />延时1us的确毫意义,输入到输出之间的延时就不止20us了。<br /><br />你用的是什么DDS和DA?
 楼主| x_tin 发表于 2007-8-3 13:41 | 显示全部楼层

谢谢 wowow

我的用的DDS是ADI的AD9954&nbsp;没用到DA.DSP是5509A.输出到DDS我用的是McBSP2.把他配置成了SPI.因为要送32位的数.每次还要先送频率字寄存器的地址字节.这样的话就是5个字节.然后就把SPI搞成8位的&nbsp;传5次.呵呵!&nbsp;要是把位数搞多一点应该快一些.但是他怎么正好就是5个字节.搞成16的吧&nbsp;多了一个字节.搞成32的也是多.要是那单独的一个字节&nbsp;临时再把配置改过来不知道行不行,呵呵还没试.这样的话不知道改配置的时间会不会也要占一定的时间,又不知道个有8位的快了.还有就是&nbsp;AD9954的&nbsp;IOUPDATA&nbsp;和&nbsp;IOSYSNCE&nbsp;两个信号&nbsp;还是要用gpio来控制.然后似乎给他们两&nbsp;改变电平也占了不少时间.用示波器看改变一次用了大概300多nS;<br />呵呵!我比较菜,然后这个没怎么搞过!&nbsp;大虾们表笑话我&nbsp;呵呵!<br />还有你说的那个circular&nbsp;addressing,呵呵我真的不知道!&nbsp;哎&nbsp;菜就一个字&nbsp;呵呵!&nbsp;赶紧搜了一下&nbsp;发现网上说的也比较少&nbsp;呵呵!&nbsp;我现在用的是C.不知道这个circular&nbsp;addressing怎么用喃.还有你说的那个滤波器延时的问题&nbsp;我上面说的估计好象理解也有问题!&nbsp;有时间&nbsp;赶紧学习学习&nbsp;呵呵!&nbsp;见笑了!<br />
nxy825715 发表于 2007-8-4 15:15 | 显示全部楼层

个人见解:

好贴,收藏了。<br />多谢wowow的解答了。
wowow 发表于 2007-8-4 18:18 | 显示全部楼层

办法还是有的

把要送到McBSP的的5个字节放到连续的地址,然后启动一个DMA送到McBSP就行了。不过应该没必要。还是跟老板商量一下,延时最小能否改为20.8us。如果这个项目的重点就是延时就花点力气做了。有点纳闷的是一般做延时会有多路输出,各路之间有延时,可以做混音啥的。做输入输出之间的延时有意义吗?<br /><br />DSP的GPIO听说是比较慢,这点不如MCU。<br /><br />SPRU374&nbsp;TMS320C55x&nbsp;DSP&nbsp;Mnemonic&nbsp;Instruction&nbsp;Set&nbsp;Reference&nbsp;Guide&nbsp;&nbsp;<br />3.5&nbsp;Circular&nbsp;Addressing<br />C55的Circular&nbsp;Addressing好像比C54的强一些,注意查一下对起始地址和长度有没有什么要求。C54要求起始地址对齐2^N边界<br />
 楼主| x_tin 发表于 2007-8-5 01:24 | 显示全部楼层

wowow,再次感谢你!

wowow,再次感谢你不厌其烦的指点。nxy825715,我也要谢谢&nbsp;wowow&nbsp;喃!呵呵&nbsp;他真是好心人。也谢谢你的帮定。你们都是好心人。呵呵!<br /><br />wowow,关于那个SPI口送频率字的问题,我现在把其中的一个IO口省掉了,就是那个&nbsp;IOSYNC&nbsp;同步脚&nbsp;我发现把他干掉&nbsp;照样行&nbsp;呵呵!估计是因为有&nbsp;有CS脚&nbsp;所以时序不会出错。现在的时间大概在1.4uS这个样子。打算先不管他了&nbsp;呵呵!&nbsp;真不行&nbsp;就用你说的DMA,呵呵把这个时间省下来!<br /><br />还有我发现我先前&nbsp;理解的插点的方法来把延时分辨率提高的方法。可以不用把那么多点都存下来。只要在读的时候把当前值和前一个值相减,然后把得到的值分成N份,然后用(当前值-差值*n/N)作为当前处理的数据。这样就把整个波形延迟了((n*20.8)/N)uS了。超过20.8的再用指针移动来就行了&nbsp;呵呵!这个好象也是想象中的&nbsp;不知道可行。又不好测是否正确。<br /><br />然后我把这个式子加到程序里面,居然就来不急了,晕了半天。好象也就一个乘一个除啊。怎么搞那么长时间。&nbsp;然后发现&nbsp;我用来计算的数据,好多都是32位的。频率字,音频信号(L+R信号),都是32位的。而5509&nbsp;是16位的。所以我猜&nbsp;编译器肯定把这个32位的操作用了好多条&nbsp;16为的操作数字的指令来完成了。怪不得时间那么长,怎么说也是144MHz的速度的说。<br /><br />发现论坛真是好地方,高人多,好人多,帮忙的人多。呵呵!&nbsp;<br /><br />睡觉了,明天起来把&nbsp;SPRU374&nbsp;看一下呵呵!&nbsp;谢谢wowow提供。<br /><br /><br />
wowow 发表于 2007-8-5 12:31 | 显示全部楼层

把除法变成乘法就行了

n/N是个小数,乘上65536换成整数做乘法,结果再去掉低16bit就行了<br /><br />插值法一定会带来失真,但如果做个乘除时间就不够了的话,也不能指望弄个好点的数字滤波器了。
 楼主| x_tin 发表于 2007-8-7 09:09 | 显示全部楼层

谢谢 wowow 大虾!

我现在按你说的方法(真是好方法,呵呵,以后把所有的除法全部改成这样的)改了,然后还把其他的地方能用16位代替的用16位来算了,现在声音比以前好了&nbsp;呵呵!&nbsp;以前在高音的时候有个破音,在改程序的时候发现,中间有一步居然直接把16位的左声道数据直接加上16位的右声道数据,真是晕啊!&nbsp;怪不得声音一高&nbsp;就不着&nbsp;呵呵.我现在准备把中断里面干的这些事全搞到主程序里去试一下.想了一下,如果干的事情的时间不超过中断的间隔时间,那主程序肯定一直在判断标志位语句上运行,还是能实时响应的&nbsp;呵呵.而且还能响应UART和其他的中断.真好!&nbsp;&nbsp;呵呵!&nbsp;&nbsp;还有我在调试的时候发现每次load&nbsp;program&nbsp;后&nbsp;都是直接打开一个反汇编的文件&nbsp;,然后我就找到我那个接收音频信号的函数,发现干了好几十行&nbsp;然后后面还有好多子程序段&nbsp;L1&nbsp;L2&nbsp;L3&nbsp;...好多都是10几&nbsp;几十行的&nbsp;最可恶的是&nbsp;我那个函数还一会&nbsp;BCC&nbsp;L1&nbsp;一会又&nbsp;BCC&nbsp;L2&nbsp;.(又不懂汇编,就只能看懂&nbsp;MOV&nbsp;呵呵&nbsp;MOV后面的玩意就不知道是什么东东了,呵呵)这样的话&nbsp;几十行&nbsp;又来个几十行&nbsp;加加搞搞&nbsp;估计几百行了&nbsp;怪不得有好几uS了.<br />还有你先前说的DDS方法合成的19KHZ的方法,到现在我还没试喃,因为只能晚上搞这个东东,所以没来得急试,呵呵,&nbsp;真是惭愧!今天一会要去找一个正弦表&nbsp;呵呵!(这个我也不知道&nbsp;搞哪去了).然后搞一下!<br />还有我发现那个声音里面的呼呼声音,我调到其他的本地电台&nbsp;发现也有!&nbsp;但是不是全有.有两个台真的是好!一点都没有,专业啊.有几个台就有呵呵!只不过我的呼呼声要稍微大一点,还有就是用耳机能听出来呼呼声音,用自带的喇叭就听不到,不知道是为什么?&nbsp;&nbsp;呼呼声不知道是因为19khz不精确还是因为插点啊啥的造成的.还有不知道是不是&nbsp;因为机箱里面的线拉的乱七八糟有关系!<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

153

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部