打印
[DSP编程]

DM642音频处理的问题

[复制链接]
1122|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
596121344|  楼主 | 2015-7-24 11:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位工程师,我在DM642的板子上使用AIC23B和MCASP做音频信号的回响测试和FIR滤波时出现很大的杂声,望大家帮忙看看是什么原因:

问题描述:

  1、将采集进来的数据不经任何处理直接发送出去,声音很清晰,且无杂声;

  2、当测试简单的回响时,将回响信号x和原始信号y进行一个简单的算法,比如a=(x+3*y)/4,再把a通过XBUF播放出去,这是出现了很大的杂声,但是当算法设定为a=x+3*y或者a=x+y时,有没有杂声出现,可以很清晰的听到回响的效果

  3、当测试FIR低通滤波时,将采集的音频信号和一个已知的低通滤波器系数相乘后发出时,就出现了很大的杂声

因为回响和FIR滤波在C6713上测试时是没杂声的,因为在C6713上的数据类型均是使用的float,一开始我以为是数据类型不对,所以将数据类型也修改为float,问题还是没有解决,后来有尝试了不同的数据类型,比如unsigned int等,问题同样没能解决。

各位工程师,你们有没有遇到过这问题,遇到后你们是怎么解决的。或者你们觉得问题出在哪?

相关帖子

沙发
aresc| | 2015-7-25 22:03 | 只看该作者
把程序贴出来看看, a = x+3*y都没有问题,那按理a=(x+3*y)/4也没啥问题。

使用特权

评论回复
板凳
596121344|  楼主 | 2015-7-26 08:14 | 只看该作者
aresc 发表于 2015-7-25 22:03
把程序贴出来看看, a = x+3*y都没有问题,那按理a=(x+3*y)/4也没啥问题。

我也是觉得很奇怪,只是将信号除以了一个4就出现杂声,我也试过乘以一个小数0.25或者0.5,也会出现杂声,FIR低通滤波我也尝试过,也是出现很大的杂声,当简单将滤波系数扩大为整数后杂声就变小了,但是还是有点大,这是程序,您帮忙看看是哪里的问题,万分感谢!因为以前用C6713(浮点DSP)做过类似的,没出过这些状况,改用DM642(定点DSP)就出现了,会是因为DSP是定点的原因吗?
#include <csl.h>
#include <std.h>
#include <math.h>
#include <csl_emifa.h>
#include <csl_i2c.h>
#include <csl_gpio.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include "iic.h"
#include "seeddm642_aic23.h"
#define MUXL (*(volatile unsigned int *)(0x019c0004))
#define MUXH (*(volatile unsigned int *)(0x019c0000))
#define MAX_BUFFER_SIZE 44000
#define VOL_DELAY MAX_BUFFER_SIZE-100

/*SEEDDM642的emifa的设置结构*/
EMIFA_Config Seeddm642ConfigA ={
           0x00052078,/*gblctl EMIFA(B)global control register value */
                                     /*将CLK6、4、1使能;将MRMODE置1;使能EK2EN,EK2RATE*/
           0xffffffd3,/*cectl0 CE0 space control register value*/
                                     /*将CE0空间设为SDRAM*/
           0x73a28e01,/*cectl1 CE1 space control register value*/
                                     /*Read hold: 1 clock;
                                       MTYPE : 0000,选择8位的异步接口
                                       Read strobe :001110;14个clock宽度
                                       TA:2 clock; Read setup 2 clock;
                                       Write hold :2 clock; Write strobe: 14 clock
                                       Write setup :7 clock
                                       --                                         ---------------
                                               \                 14c                /1c
                                               \----------------/ */
           0x22a28a22, /*cectl2 CE2 space control register value*/
       0x22a28a42, /*cectl3 CE3 space control register value*/
           0x57115000, /*sdctl SDRAM control register value*/
           0x0000081b, /*sdtim SDRAM timing register value*/
           0x001faf4d, /*sdext SDRAM extension register value*/
           0x00000002, /*cesec0 CE0 space secondary control register value*/
           0x00000002, /*cesec1 CE1 space secondary control register value*/
           0x00000002, /*cesec2 CE2 space secondary control register value*/
           0x00000073 /*cesec3 CE3 space secondary control register value*/       
};

/*SEEDDM642的IIC的设置结构*/
I2C_Config SEEDDM642IIC_Config = {
    0,  /* master mode,  i2coar;采用主模式   */
    0,  /* no interrupt, i2cimr;只写,不读,采用无中断方式*/
    (20-5), /* scl low time, i2cclkl;  */
    (20-5), /* scl high time,i2cclkh;  */
    1,  /* configure later, i2ccnt;*/
    0,  /* configure later, i2csar;*/
    0x4ea0, /* master tx mode,     */
            /* i2c runs free,      */
            /* 8-bit data + NACK   */
            /* no repeat mode      */
    (75-1), /* 4MHz clock, i2cpsc  */
};

CHIP_Config SEEDDM642percfg = {
        CHIP_VP2+\
        CHIP_VP1+\
        CHIP_VP0+\
        CHIP_I2C+\
        CHIP_MCASP0
};

I2C_Handle hSeeddm642i2c;
/*设置需打开的音频的句柄*/
SEEDDM642_AIC23_Handle dm642aic23handle0,dm642aic23handle1;
SEEDDM642_AIC23_Handle dm642aic23handle2,dm642aic23handle3;
/* Internal codec state used to simulate read/write functionality */
SEEDDM642_AIC23_Config codecstate = SEEDDM642_AIC23_DEFAULTCONFIG;
MCASP_Handle SEEDdm642codec;
/********************************************************************/
int jj;
#define FIRNUMBER 16
float fHnL[FIRNUMBER]={
-0.0033,-0.0016,0.0127,0.0118,-0.0468,-0.0547,0.1526,0.4294,0.4294,0.1526,
-0.0547,-0.0468,0.0118,0.0127,-0.0016,-0.0033 };  //1K低通滤波参数
/*int fHnL[FIRNUMBER]={
-33,-16,127,118,-468,-547,1526,4294,4294,1526,
-547,-468,118,127,-16,-33 };  */
float fXn[FIRNUMBER]={ 0.0 };
int i,ii=0,bCode=1;

void InputWave(float);
float FIRL();
/********************************************************************/
extern far void vectors();

int jj,Count_interrupter=0;  //测试中断的响应
float codecdata0;

/*此程序可将四个采集口的数据经过Video Port0送出*/
void main()
{
    int i;
    jj=0;
        for(i=0;i<FIRNUMBER;i++)
        fXn=0.0;
/*-------------------------------------------------------*/
/* perform all initializations                           */
/*-------------------------------------------------------*/
        /*Initialise CSL,初始化CSL库*/
        CSL_init();
        CHIP_config(&SEEDDM642percfg);
/*----------------------------------------------------------*/
        /*EMIFA的初始化,将CE0设为SDRAM空间,CE1设为异步空间
         注,DM642支持的是EMIFA,而非EMIF*/
        EMIFA_config(&Seeddm642ConfigA);
/*----------------------------------------------------------*/
        /*中断向量表的初始化*/
        //Point to the IRQ vector table
    IRQ_setVecs(vectors);
    CSR=CSR&0xfffffffe;
           MUXL =0x18bd;
        MUXH =0; //使能MCASP0的接收中断为四号中断
           ICR=0xff;       
        CSR=CSR|1;
        IER=0x13;
    /*IRQ_nmiEnable();
    IRQ_globalEnable();
    IRQ_map(IRQ_EVT_VINT1, 11);
    IRQ_map(IRQ_EVT_VINT0, 12);
    IRQ_reset(IRQ_EVT_VINT1);
    IRQ_reset(IRQ_EVT_VINT1); */
           
/*----------------------------------------------------------*/
/*AIC23B的初始化*/
        hSeeddm642i2c = I2C_open(I2C_PORT0,I2C_OPEN_RESET);
        I2C_config(hSeeddm642i2c,&SEEDDM642IIC_Config);
        /*配置第一路到第四路音频输入*/
        /*第一通路AIC23工作在主模式*/
//        codecstate.regs[SEEDDM642_AIC23_DIGIF] = 0x13;
        dm642aic23handle0 = EVMDM642_AIC23_open(hSeeddm642i2c,0,&codecstate);
        /*其它三路工作在从模式*/
  /*codecstate.regs[SEEDDM642_AIC23_DIGIF] = 0x13;
        dm642aic23handle1 = EVMDM642_AIC23_open(hSeeddm642i2c,1,&codecstate);
        dm642aic23handle2 = EVMDM642_AIC23_open(hSeeddm642i2c,2,&codecstate);
        dm642aic23handle3 = EVMDM642_AIC23_open(hSeeddm642i2c,3,&codecstate);*/               
/*----------------------------------------------------------*/
        /*MCASP的初始化*/
        SEEDdm642codec = SEEDDM642_AIC23_openCodec();
/*----------------------------------------------------------*/
        /*音频的采集与回放*/
        for(;;)
        {
       
        }
}

void rxvoice(void)   
{        

      if(MCASP_FGETH(SEEDdm642codec,RSTAT,RDATA))
                {
                        codecdata0 = MCASP_RGETH(SEEDdm642codec,RBUF1);
                        InputWave(codecdata0);
            codecdata0=FIRL();
                        MCASP_RSETH(SEEDdm642codec,XBUF0,codecdata0);               
                }
                else
                {
                 asm(" nop");
                }

     Count_interrupter++;
}  

void InputWave(float a)
{
        for ( i=FIRNUMBER-1;i>0;i-- )
        fXn=fXn[i-1];
        fXn[0]=a;
}

float FIRL()
{
        float fSum;
        fSum=0;
        for ( i=0;i<FIRNUMBER;i++ )
        {
                fSum+=(float)(fXn*fHnL);
        }
        return(fSum);
}  
/*----------------------------------------------------------*/  
//ISR to service TIMERINT1.     
//  vecs_RINT.asm must be modified to include c_int04 entry.   
interrupt void c_int04(void)        
{   
    rxvoice();   
    return;
}

使用特权

评论回复
地板
aresc| | 2015-7-27 20:36 | 只看该作者
        for(i=0;i<FIRNUMBER;i++)
        fXn [ i ]=0.0;


void InputWave(float a)
{
         for ( i=FIRNUMBER-1;i>0;i-- )
        fXn[ i ]=fXn[i-1];
         fXn[0]=a;
}

float FIRL()
{
         float fSum;
         fSum=0;
         for ( i=0;i<FIRNUMBER;i++ )
         {
                 fSum+=(float)(fXn [ i ]*fHnL[ i ]);
         }
         return(fSum);
}  

上面的错误估计是帖子粘贴的问题,否则估计编译不通吧。

使用特权

评论回复
5
aresc| | 2015-7-27 20:48 | 只看该作者
另外楼主没搞明白定点DSP中数的表示,以及定点DSP中的乘法运算。
简单一点比如系数1.0,-1.0, 0.5, -0.5, 0.25, -0.25, 0.75, -0.75用定点数如何表示。

把这个滤波器
float fHnL[FIRNUMBER]={
-0.0033,-0.0016,0.0127,0.0118,-0.0468,-0.0547,0.1526,0.4294,0.4294,0.1526,
-0.0547,-0.0468,0.0118,0.0127,-0.0016,-0.0033 };  //1K低通滤波参数
中的系数全部乘以2的32次方后取整。变成一个整形的数组然后再去做乘累加的运算。

其中乘累加中的乘法c=a*b之后,c的结果要左移一位,移出一个多余符号位。




使用特权

评论回复
6
aresc| | 2015-7-27 21:15 | 只看该作者
另外把float全部改成int,如果是当做定点DSP来用,那代码里应该不能出现float或者double的类型。

使用特权

评论回复
7
596121344|  楼主 | 2015-11-4 11:45 | 只看该作者
aresc 发表于 2015-7-27 21:15
另外把float全部改成int,如果是当做定点DSP来用,那代码里应该不能出现float或者double的类型。 ...

谢谢您的指导,不过我单独试过用定点的DM642进行小数计算,是可以的,证明他是可以直接进行浮点运算的,也可以出现float。
补充向您请教一个问题,我才用AIC23B采集音频信号时,为什么获得的数组会间隔出现0值呢,是因为采样率的问题吗,AIC23B的采样率44k,MCASP采用的是从模式,你觉得可能的原因是什么?

使用特权

评论回复
8
596121344|  楼主 | 2015-11-4 11:47 | 只看该作者
aresc 发表于 2015-7-27 20:36
for(i=0;i0;i-- )
         fXn[ i ]=fXn;
         fXn[0]=a;

确实是复制出了问题,谢谢您帮忙纠错

使用特权

评论回复
9
596121344|  楼主 | 2015-11-4 11:51 | 只看该作者
aresc 发表于 2015-7-27 20:48
另外楼主没搞明白定点DSP中数的表示,以及定点DSP中的乘法运算。
简单一点比如系数1.0,-1.0, 0.5, -0.5,  ...

乘以2的32次方数值会不会太大出现溢出呢,我尝试过乘以2的16次方,但是问题还是没能解决,当然我没能考虑您说的符号位,将结果直接右移了16位输出,仍然还是有杂声,很头疼啊,是不是因为MCASP的时钟和AIC23B的时钟沿没对齐?因为在TI论坛中有人因为MCBSP和AIC23B的时钟没对齐出现了杂声的

使用特权

评论回复
10
596121344|  楼主 | 2015-12-18 14:54 | 只看该作者
aresc 发表于 2015-7-27 20:48
另外楼主没搞明白定点DSP中数的表示,以及定点DSP中的乘法运算。
简单一点比如系数1.0,-1.0, 0.5, -0.5,  ...

之前的杂声问题解决了,只是修改了AIC23B和DSP的接口协议,原来是DSP Mode,改为IIS Mode就没杂声了

使用特权

评论回复
11
zhangmangui| | 2015-12-18 22:50 | 只看该作者
596121344 发表于 2015-12-18 14:54
之前的杂声问题解决了,只是修改了AIC23B和DSP的接口协议,原来是DSP Mode,改为IIS Mode就没杂声了 ...

有时间多多指点啊  

使用特权

评论回复
12
596121344|  楼主 | 2016-1-13 10:09 | 只看该作者

首先谢谢楼主的回复,这段时间急着写论文,没时间逛论坛,回复的有点晚了,很抱歉。虽然改为IIS Mode后可以用了,但是由于现在急着赶论文,没时间去深究原因。不过,这两天我问了一下瑞泰创新一位员工,他说是干扰,没具体解释理由。这让我很费解,运算过程中会产生很大的噪声?在发送时出现的杂声比原声音要大很多,不知道对此您有什么见解

使用特权

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

本版积分规则

4

主题

40

帖子

0

粉丝