关于使用AIC23采集音频后存储再播放的问题
我用C5509A和AIC23进行音频采集实验 初始化是DSP通过IIC总线将配置命令发送给AIC23 我采样率设置的是44.1K
具体音频采集存储和播放的代码如下 请高手工程师帮忙解答下吧 为什么输出来的没有声音全是噪声 是不是采样点数的问题 不太明白 万分感谢!
while(1)
{
for(i=0;i<8000;i++)
{
while (!ReadMask(pMCBSP0 -> spcr2, SPCR2_XRDY)); // 等待McBSP0准备好
input[i]=Read(pMCBSP0->ddr2); // 读取左右声道的数据
input[i]=Read(pMCBSP0->ddr1); // 因为耳机输入左右声道相同,所以读两次即可
// far_poke(lpWork++,nWork); // 保存到缓冲区
}
///
if(8000==i) i=0;
for(j=0;j<8000;j++)
{
output[j]=input[i];
Write(pMCBSP0->dxr2,output[j]); // 送数据到McBSP0
Write(pMCBSP0->dxr1,output[j]);
} // 声音输出由AIC23完成
Hi, 李阳,
可以做个简单的实验将DIN和DOUT短接,看DAC输出是否正常,来确认下AIC23 DAC部分的设置是否有问题。如果设置没有问题,那么原因应该是在DSP端了。
Best regards,
Barry Xiao
AD和DA应该没问题 因为我用例程跑 声音很清楚 也就是采集一个输出一个数据就没问题 但是我想储存一部分数据再输出 就有问题了
如果CODEC设置没有问题,而是数据存储的问题,建议向DSP论坛咨询下。
恩 我感觉是 那谢谢了
你好:
你看下你的保存的数据的格式与你采集的数据的格式是否一致。比如你采用的是CHAR型的,但是保存成Float或者Int那么就会出问题
您好,
我储存和输出的数据全是int的 实时采集的话声音没问题 而且保存的是int数据 不知道为啥我这个就不行 我感觉是点数太少的缘故 但是我循环了
你好:
你的保存的中断时间和你的采样率一致吗?还有就是你加大你保存的数据试下。
你可以用正弦波作试验,采集进去后用数字的方式看是不是正弦波的信号,确保采集的数据没错。。
谢谢您的回答!
我想问下保存的中断时间是指的储存8000个点的时间吗 我设置采样率是8K 然后循环采样8000储存在数组中 然后再循环从数组中输出 就严重失真了
你好:
你不是按照中断触发一次保存一次数据的吗?
不是的 直接在程序中循环保存了
while (!ReadMask(pMCBSP0 -> spcr2, SPCR2_XRDY)); // 等待McBSP0准备好
for(i=0;i<40000;i++)
{ input[i]=Read(pMCBSP0->ddr2); // 送数据到McBSP0// 读取左右声道的数据
input[i]=Read(pMCBSP0->ddr1); // 因为耳机输入左右声道相同,所以读两次即可
}
for(j=0;j<40000;j++)
{ output[j]=input[j];
Write(pMCBSP0->dxr2,output[j]); // 送数据到McBSP0
Write(pMCBSP0->dxr1,output[j]);
}
没有想到用中断 想当然的以为直接这样子就行呢? 这样不可以吗
你好:
现在的问题就是你保存数据是按照DSP的主频在保存,可能频率会有几十M,但是你的采样率只有8K,那么你想下你播放出来的东西会是什么呢?也就是你保存的8000个数据可能是一样的。所以建议你用CCS看一下保存的数据,CCS有个功能可以看的。
嗯 您说的太对了 的确是这样子 我用watch window看过 的确是好多数据都是一样的 变化 那我要是在应该怎么做呢? 在中断中存储吗 还是在中断中采集和存储啊? 谢谢了
你好:
你可以在中断触发的情况下采集加存储,由于主频比较快,这个操作时间很充足。
您好,
那我先试试啦 谢谢您的回复
你好:
你可以先试下,我之前用C6000做的没有问题。