打印

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

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

相关帖子

沙发
xwj| | 2007-7-31 15:22 | 只看该作者

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

基本原则:软件分层处理,中断只作必要的操作,尽量让出时间片给别的程序或中断
比如:
接收进缓存,改标志
发送读缓存,改标志
定时器只改标志,和最简单的送数等


其他的耗时长的计算、编解码等放主程序里,使用标志、缓存和中断交换数据,
必要时用双缓存,就算处理被中断打断也没关系



你自己仔细想想吧,想通了就简单了

使用特权

评论回复
板凳
x_tin|  楼主 | 2007-7-31 16:51 | 只看该作者

谢谢 xwj

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

使用特权

评论回复
地板
wowow| | 2007-7-31 19:37 | 只看该作者

一个中断就搞定了呀

48KHz的中断采样,再加上DDS方法合成19kHz的正弦波就行了。DDS的概念自己去搜,这里介绍一下方法。
DDS可以用于合成频率为Fout,采样率为Fs的正弦波,你这里Fout=19k,Fs=48k.
思路是计算正弦波在每个采样点的相位(也就是角度),知道了角度,幅度一查正弦表不就出来了?由于是等间隔采样,两点之前的相位差就是固定的了。有以下计算公式:

相位差M = (2^m) * Fout /Fs

假设你要求的精度不高,就用256点的查找表,则m=8,
M=256×19/48=101.3333,
不是整数不要紧,再补8位小数位,算上小数位的公式为:
相位差M = (2^(m+k)) * Fout /Fs
一般m+k要凑成16或32bit,这样相累加时超过一个周期正好自动溢出了。

每次48kHz中断计算相位:P=P+M,然后P取整数部分查正弦表,就得到正弦波的当前幅度了。再乘个比例系数加上采集的信号就行了。

如果要求的精度比较高,查找表就比较大了,可以由正弦波对称性半周期或四分之一周期查表。




使用特权

评论回复
5
wowow| | 2007-7-31 19:44 | 只看该作者

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

弄一个环形缓冲区,输入指针p1,输出指针p2,根据要求的延时设好p1/p2间隔,采样一个样计算好后存入p1,同时输出p2,再移动两个指针

使用特权

评论回复
6
x_tin|  楼主 | 2007-8-1 08:19 | 只看该作者

谢谢~

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

使用特权

评论回复
7
yxwsz| | 2007-8-1 10:44 | 只看该作者

DMA

MCBSP可以触发DMA,在CPU不介入的情况下传送数据;
你去好好看看介绍DMA的文档

使用特权

评论回复
8
soso| | 2007-8-1 19:08 | 只看该作者

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

 
    还有就是哪个延长时间1us, 似乎没的意义.

使用特权

评论回复
9
xwj| | 2007-8-1 19:15 | 只看该作者

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

使用特权

评论回复
10
wowow| | 2007-8-1 21:10 | 只看该作者

关于延时

先仿真一下能否用线性相位的FIR滤波器产生特定的信号延时。如果可行的话,生成20组或更多的FIR滤波器系数,分别能产生1us-20.8us的延时,这样的话需要的延时可以计算为N*20.8+k,输出信号时先延时N个采样点,再用第k组FIR滤波器产生1us-20.8us的延时。

以上仅供参考,如何生成需要的滤波器参数我也不清楚。如果你能搞定的话说不定可以写篇**发发。网上有篇用N个采样点延时的方法的**到处转的有,你弄出来水平就高多了:)。

使用特权

评论回复
11
x_tin|  楼主 | 2007-8-2 23:41 | 只看该作者

再次 感谢大家

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

使用特权

评论回复
12
wowow| | 2007-8-3 09:31 | 只看该作者

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

你用的什么DSP?应该有circular addressing方式吧?
spi输出到DDS要不了2us吧?难道没用McBsp用的GPIO?

延时1us的确毫意义,输入到输出之间的延时就不止20us了。

你用的是什么DDS和DA?

使用特权

评论回复
13
x_tin|  楼主 | 2007-8-3 13:41 | 只看该作者

谢谢 wowow

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

使用特权

评论回复
14
nxy825715| | 2007-8-4 15:15 | 只看该作者

个人见解:

好贴,收藏了。
多谢wowow的解答了。

使用特权

评论回复
15
wowow| | 2007-8-4 18:18 | 只看该作者

办法还是有的

把要送到McBSP的的5个字节放到连续的地址,然后启动一个DMA送到McBSP就行了。不过应该没必要。还是跟老板商量一下,延时最小能否改为20.8us。如果这个项目的重点就是延时就花点力气做了。有点纳闷的是一般做延时会有多路输出,各路之间有延时,可以做混音啥的。做输入输出之间的延时有意义吗?

DSP的GPIO听说是比较慢,这点不如MCU。

SPRU374 TMS320C55x DSP Mnemonic Instruction Set Reference Guide  
3.5 Circular Addressing
C55的Circular Addressing好像比C54的强一些,注意查一下对起始地址和长度有没有什么要求。C54要求起始地址对齐2^N边界

使用特权

评论回复
16
x_tin|  楼主 | 2007-8-5 01:24 | 只看该作者

wowow,再次感谢你!

wowow,再次感谢你不厌其烦的指点。nxy825715,我也要谢谢 wowow 喃!呵呵 他真是好心人。也谢谢你的帮定。你们都是好心人。呵呵!

wowow,关于那个SPI口送频率字的问题,我现在把其中的一个IO口省掉了,就是那个 IOSYNC 同步脚 我发现把他干掉 照样行 呵呵!估计是因为有 有CS脚 所以时序不会出错。现在的时间大概在1.4uS这个样子。打算先不管他了 呵呵! 真不行 就用你说的DMA,呵呵把这个时间省下来!

还有我发现我先前 理解的插点的方法来把延时分辨率提高的方法。可以不用把那么多点都存下来。只要在读的时候把当前值和前一个值相减,然后把得到的值分成N份,然后用(当前值-差值*n/N)作为当前处理的数据。这样就把整个波形延迟了((n*20.8)/N)uS了。超过20.8的再用指针移动来就行了 呵呵!这个好象也是想象中的 不知道可行。又不好测是否正确。

然后我把这个式子加到程序里面,居然就来不急了,晕了半天。好象也就一个乘一个除啊。怎么搞那么长时间。 然后发现 我用来计算的数据,好多都是32位的。频率字,音频信号(L+R信号),都是32位的。而5509 是16位的。所以我猜 编译器肯定把这个32位的操作用了好多条 16为的操作数字的指令来完成了。怪不得时间那么长,怎么说也是144MHz的速度的说。

发现论坛真是好地方,高人多,好人多,帮忙的人多。呵呵! 

睡觉了,明天起来把 SPRU374 看一下呵呵! 谢谢wowow提供。


使用特权

评论回复
17
wowow| | 2007-8-5 12:31 | 只看该作者

把除法变成乘法就行了

n/N是个小数,乘上65536换成整数做乘法,结果再去掉低16bit就行了

插值法一定会带来失真,但如果做个乘除时间就不够了的话,也不能指望弄个好点的数字滤波器了。

使用特权

评论回复
18
x_tin|  楼主 | 2007-8-7 09:09 | 只看该作者

谢谢 wowow 大虾!

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

153

帖子

0

粉丝