Hi,您好,
我用OMAPL137采用轮询方式接收输出音频信号,不加算法的话可以顺利接扬声器播放数据(自己写一个5s的信号循环播出的,采样率48000Hz),但是在程序中加入一些算法就不能拨出了?不知道是为什么啊?部分程序如下
//该部分用来产生左通道白噪声信号并得到麦克风信号
outdata = GaussRan[GaussPtr]; // 全局变量GaussPtr = 0;
floutdata = outdata * vref; // 将参考信号转换为浮点型
GaussPtr = (GaussPtr+1)% GaussLen; // 5s数据播放完成后循环
output_sample((outdata << 15)| 0x00000000); // 左通道扬声器输出高斯白噪声信号 LeftSample = input_sample(); // 左通道麦克风输入采集到的信号
dn = (Int16) (LeftSample >> 15); // 左通道得到麦克风信号
fldn = dn * vref; // 将麦克风信号转换为浮点型
// 右通道的输入输出信号不作处理
output_sample( 0x00000000); // 右通道扬声器输出为0
RightSample = input_sample(); // 右通道麦克风信号
for (i=59; i>0; i–) {
x[i] = x[i-1]; } x[0] = floutdata;
以上部分不加下边那个for循环还是可以运行的,但是加了for循环就不行了。之前也遇到一种情况,fldn = dn * vref,这个语句之前写成了fldn = dn * vref/Q,不加除法运算可以运行,加了也不能运行了,感觉很奇怪。
输入输出函数如下:
void output_sample(Int32 out_data) { AIC31_data.uint = out_data; while ( ! ( MCASP1_SRCTL5 & 0x10 ) ); MCASP1_XBUF5_32BIT = AIC31_data.uint; } Int32 input_sample(void) { while ( ! ( MCASP1_SRCTL0 & 0x20 ) ); AIC31_data.uint = MCASP1_RBUF0_32BIT; return (AIC31_data.uint); }
Tony Tang:
应该是实时性不够,卡住了。计算一下是不是一次处理的时间大于一个采样点的间隔了。
Yu Wang22:
回复 Tony Tang:
Tony Tang
应该是实际性不够,卡住了。计算一下是不是一次处理的时间大于一个采样点的间隔了。
Yu Wang22:
回复 Tony Tang:
非常感谢您的回复!我也觉得EDMA方式可能更好,不过OMAPL137给的例程里没有EDMA配置的,想问一下有没有这样的例程可以下载?多谢!
Tony Tang:
回复 Yu Wang22:
L138的starterware里有McASP EDMA的例程可以参考,不过对于如果不熟悉EDMA的,这个代码有点复杂。
我个人做了McBSP EDMA的例子,比较简单。
http://www.deyisupport.com/question_answer/dsp_arm/omap_l1x/f/54/t/87941.aspx
Yu Wang22:
回复 Tony Tang:
谢谢!
chunyu Lee:
回复 Tony Tang:
您好,我初学DSP,想问一下EDMA是不是可以在McASP接口来数据时直接把数据搬运到片外存储器,如DDR2或者在EMIF上的SDRAM?
只要先对EMDA寄存器进行初始配置,在McASP数据到来和搬运的整个过程中,都不需要cpu参与吗?
Tony Tang:
回复 chunyu Lee:
chunyu Lee只要先对EMDA寄存器进行初始配置,在McASP数据到来和搬运的整个过程中,都不需要cpu参与吗?
是的。
参考McBSP例程:http://www.deyisupport.com/question_answer/dsp_arm/omap_l1x/f/54/t/87941.aspx
L138. C6748的starterware里有McASP的EDMA例程,都差不多,可以互相借鉴。