打印

VC5502和AIC23调试问题

[复制链接]
1881|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
飞鹰嵌入式|  楼主 | 2013-4-24 15:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好!
做FFT实验时候遇到的问题
1、首先我是固定频率输入然后我从AIC23B中取得数据,然后把数据存储到DataBuffer中,然后再对DataBuffer数据做fft变换
这个是没有问题的,
2、我在上面基础上,然后我输入到AIC23b中不同的频率,
例如:
(1)输入条件:我输入20个正弦波的200HZ信号,然后跟着输入20个正弦波为400HZ信号
(2)下面是我的操作:首先我对输入20个正弦波的200HZ的信号把数据存储到DataBuffer中然后做fft变换,然后再一个循环把输入的400HZ的正弦波的数据存储到DataBuffer中,然后再做fft变换,我在每个fft转换后打断点观察结果是正常的,但是全速运行两个的时候结果就不正常了,
(3)限制条件,因为我是在一块板子上做的实验,我的200HZ和400HZ信号都是同一块板子产生的,也就是我在做fft变换的时候不会再有信号产生。
(4)现象:经常是连续两个fft结果是一样的
补充:我把每次fft的结果保存起来,结果是连续的2个200HZ或者连续两个400HZ,
3、因为我也刚做DSP,我初步判断:是不是因为DATA区数据还没来的及存储我就又做了第二次fft转换(因为DSP是三级流水线操作,数据区和程序区是分开的),
不知道我说清楚没有,如果没有请大家继续询问,以为我是刚开始做DSP

相关帖子

沙发
飞鹰嵌入式|  楼主 | 2013-4-24 15:33 | 只看该作者
while(1)
        {

        #if 1
        secret_val = 0;
        for(i=0;i<8;i++)
        {
                 k = rand()%(MAX_RAND-MIN_RAND+1)+MIN_RAND;//随机产生4字节数据
                 secret_val |= (k<<(4*i));
        }
        #endif
        //如果上面产生的数据是secret_val = 0x12345678
        tmp = secret_val;
        
                   #if 1
                   for(k=0;k<8;k++)
                   {
                        for(i=0;i<SampleLong;i++)
                           {
                                   DDDataBuffer = 0;
                           }
                        step_sin= (Uint32)(secret_val&0x0000000f);//每四位进行产生不同频率的正弦波
                        step_sin += 1;//为了消除0时产生不了正弦波
                        for(i=0;i<30;i++)
                        {
                                for(s=0;s<SampleLong;)        //每个数字位发送SampleLong个波形
                                {
                                        for(j=0;j<256;j+=step_sin)
                                        {
                                                while (!MCBSP_xrdy(hMcbsp)) {};

                                       /*发送数据*/
                                              MCBSP_write16(hMcbsp,(short)sine_tbl[j]);//产生正弦波,正弦波频率根据step_sin步进数变化
                                           while(!MCBSP_rrdy(hMcbsp)){};
                                                    DataTemp = (short)MCBSP_read16(hMcbsp);
                                           while(!MCBSP_rrdy(hMcbsp)){};
                                                    DataTemp = (short)MCBSP_read16(hMcbsp);
                                                   DataBuffer = DataTemp;//然后读取A/D转换结果存入BUFFER
                                                
                                                DataTemp=fir_filter(DataBuffer);
                                                
                                                DDDataBuffer = DataTemp;
                                        /*        if(DataBuffer>>8 == 0xfff7)
                                                {
                                                        s=1024;
                                                        j=256;
                                                }
                                        */        s++;
                                        }
                                }                        
                                #if 1
                                m=0;
                                for(j=0;j<1024;j++)//判断数据是否有效
                                {        
                                       
                                        if(DataBuffer[j]>>8 == 0xfff7)
                                        {        
                                                m++;                        
                                        }                                                                                
                                }
                                if(m < 10)//如果有效则跳出i循环
                                        break;
                                #endif
                        }
                        
                        secret_val >>= 4;                  
               
                 #endif
                #if 0        
                        while(!MCBSP_rrdy(hMcbsp)){};
                            DataTemp = MCBSP_read16(hMcbsp);
                        while(!MCBSP_rrdy(hMcbsp)){};
                            DataTemp = MCBSP_read16(hMcbsp);
                           DataBuffer = DataTemp;
                        DataTemp=fir_filter(DataBuffer);
                        
                        DDDataBuffer = DataTemp;
           
               
                #endif
                  
           //}        
#if 1
        /*FFT变换*/
        
        for(i=0;i<(SampleLong/2);i++)
        {
                DDataBuffer.real=DDDataBuffer[2*i];  //short int
            DDataBuffer.imag=DDDataBuffer[2*i+1];  //short int
        }  
        
        for(i=0;i<512;i++)
        {
                mod[0] = 0;
        }
        /*1024 point*/  
        fft1024(DDataBuffer,1024);
        m=0;
            for(i=0;i<512;i++)
            {  
                p=DDataBuffer.real;
                q=DDataBuffer.imag;     
                n=(long)p*(long)p+(long)q*(long)q;
                //n=(Uint32)(p*p+q*q);
                mod[m]=sqrt(n);
                m++;                           
            }         
        signal_f[k] = fum(mod,512);//获取频率值
               
        if(signal_f[k] > 13 && signal_f[k] < 19)
        {
                valid_flag = 1;               
        }
        else if(signal_f[k] > 21 && signal_f[k] < 27)
        {
                valid_flag = 2;               
        }
        else if(signal_f[k] > 30 && signal_f[k] < 34)
        {
                valid_flag = 3;               
        }        
        else if(signal_f[k] > 37 && signal_f[k] < 43)
        {
                valid_flag = 4;               
        }
        else if(signal_f[k] > 45 && signal_f[k] < 51)
        {
                valid_flag = 5;
        }
        else if(signal_f[k] >53 && signal_f[k] < 59)
        {
                valid_flag = 6;
        }
        else if(signal_f[k] >61 && signal_f[k] < 69)
        {
                valid_flag = 7;
        }
        else if(signal_f[k] >68 && signal_f[k] < 75)
        {
                valid_flag = 8;
        }
        else
        {
                valid_flag = 0;
        }
        //secret_val_re <<= 4;        
        secret_val_re |= (valid_flag<<(4*k));        //主要是把数据做移位处理,为了和发送的数据相同
        //此处打断点获得的数据是每次都是正确的
        //delay_ms(DLY_VAL);
        
        }
        if(tmp == secret_val_re)//如果接受和发送的相同
        {
                strcpy(match,"sucess");
        //        t++;
        }
        else
        {
                strcpy(match,"fail");
                //f++;
        }        
        secret_val_re = 0;
        //如果把上面断点去掉,然后在此处打断点获得的4个字节数据就错误了
        //secret_val = tmp;
        #endif        
        }

使用特权

评论回复
板凳
飞鹰嵌入式|  楼主 | 2013-4-24 15:35 | 只看该作者
while(1)
        {

        #if 1
        secret_val = 0;
        for(i=0;i<8;i++)
        {
                 k = rand()%(MAX_RAND-MIN_RAND+1)+MIN_RAND;//随机产生4字节数据
                 secret_val |= (k<<(4*i));
        }
        #endif
        //如果上面产生的数据是secret_val = 0x12345678
        tmp = secret_val;
       
                   #if 1
                   for(k=0;k<8;k++)
                   {
                        for(i=0;i<SampleLong;i++)
                           {
                                   DDDataBuffer = 0;
                           }
                        step_sin= (Uint32)(secret_val&0x0000000f);//每四位进行产生不同频率的正弦波
                        step_sin += 1;//为了消除0时产生不了正弦波
                        for(i=0;i<30;i++)
                        {
                                for(s=0;s<SampleLong;)        //每个数字位发送SampleLong个波形
                                {
                                        for(j=0;j<256;j+=step_sin)
                                        {
                                                while (!MCBSP_xrdy(hMcbsp)) {};

                                       /*发送数据*/
                                              MCBSP_write16(hMcbsp,(short)sine_tbl[j]);//产生正弦波,正弦波频率根据step_sin步进数变化
                                           while(!MCBSP_rrdy(hMcbsp)){};
                                                    DataTemp = (short)MCBSP_read16(hMcbsp);
                                           while(!MCBSP_rrdy(hMcbsp)){};
                                                    DataTemp = (short)MCBSP_read16(hMcbsp);
                                                   DataBuffer = DataTemp;//然后读取A/D转换结果存入BUFFER
                                               
                                                DataTemp=fir_filter(DataBuffer);
                                               
                                                DDDataBuffer = DataTemp;
                                        /*        if(DataBuffer>>8 == 0xfff7)
                                                {
                                                        s=1024;
                                                        j=256;
                                                }
                                        */        s++;
                                        }
                                }                       
                                #if 1
                                m=0;
                                for(j=0;j<1024;j++)//判断数据是否有效
                                {       
                                       
                                        if(DataBuffer[j]>>8 == 0xfff7)
                                        {       
                                                m++;                       
                                        }                                                                               
                                }
                                if(m < 10)//如果有效则跳出i循环
                                        break;
                                #endif
                        }
                       
                        secret_val >>= 4;                 
               
                 #endif
                #if 0       
                        while(!MCBSP_rrdy(hMcbsp)){};
                            DataTemp = MCBSP_read16(hMcbsp);
                        while(!MCBSP_rrdy(hMcbsp)){};
                            DataTemp = MCBSP_read16(hMcbsp);
                           DataBuffer = DataTemp;
                        DataTemp=fir_filter(DataBuffer);
                       
                        DDDataBuffer = DataTemp;
          
               
                #endif
                  
           //}       
#if 1
        /*FFT变换*/
       
        for(i=0;i<(SampleLong/2);i++)
        {
                DDataBuffer.real=DDDataBuffer[2*i];  //short int
            DDataBuffer.imag=DDDataBuffer[2*i+1];  //short int
        }  
       
        for(i=0;i<512;i++)
        {
                mod[0] = 0;
        }
        /*1024 point*/  
        fft1024(DDataBuffer,1024);
        m=0;
            for(i=0;i<512;i++)
            {  
                p=DDataBuffer.real;
                q=DDataBuffer.imag;     
                n=(long)p*(long)p+(long)q*(long)q;
                //n=(Uint32)(p*p+q*q);
                mod[m]=sqrt(n);
                m++;                           
            }         
        signal_f[k] = fum(mod,512);//获取频率值
               
        if(signal_f[k] > 13 && signal_f[k] < 19)
        {
                valid_flag = 1;               
        }
        else if(signal_f[k] > 21 && signal_f[k] < 27)
        {
                valid_flag = 2;               
        }
        else if(signal_f[k] > 30 && signal_f[k] < 34)
        {
                valid_flag = 3;               
        }       
        else if(signal_f[k] > 37 && signal_f[k] < 43)
        {
                valid_flag = 4;               
        }
        else if(signal_f[k] > 45 && signal_f[k] < 51)
        {
                valid_flag = 5;
        }
        else if(signal_f[k] >53 && signal_f[k] < 59)
        {
                valid_flag = 6;
        }
        else if(signal_f[k] >61 && signal_f[k] < 69)
        {
                valid_flag = 7;
        }
        else if(signal_f[k] >68 && signal_f[k] < 75)
        {
                valid_flag = 8;
        }
        else
        {
                valid_flag = 0;
        }
        //secret_val_re <<= 4;       
        secret_val_re |= (valid_flag<<(4*k));        //主要是把数据做移位处理,为了和发送的数据相同
        //此处打断点获得的数据是每次都是正确的
        //delay_ms(DLY_VAL);
       
        }
        if(tmp == secret_val_re)//如果接受和发送的相同
        {
                strcpy(match,"sucess");
        //        t++;
        }
        else
        {
                strcpy(match,"fail");
                //f++;
        }       
        secret_val_re = 0;
        //如果把上面断点去掉,然后在此处打断点获得的4个字节数据就错误了
        //secret_val = tmp;
        #endif       
        }

使用特权

评论回复
地板
飞鹰嵌入式|  楼主 | 2013-4-24 15:37 | 只看该作者
上面是代码,但是不知道为什么后面给花掉了,附件中可以看到源码,希望大家多多支持啊!

code.rar

1.46 KB

使用特权

评论回复
5
zhangmangui| | 2013-4-24 17:00 | 只看该作者
很结实的帖子啊

使用特权

评论回复
6
飞鹰嵌入式|  楼主 | 2013-4-24 17:20 | 只看该作者
zhangmangui 发表于 2013-4-24 17:00
很结实的帖子啊

遇到过这样的问题吗?
:)

使用特权

评论回复
7
飞鹰嵌入式|  楼主 | 2013-4-24 17:20 | 只看该作者
zhangmangui 发表于 2013-4-24 17:00
很结实的帖子啊

这样的问题遇到过吗?

使用特权

评论回复
8
zhangmangui| | 2013-4-24 22:57 | 只看该作者
飞鹰嵌入式 发表于 2013-4-24 17:20
遇到过这样的问题吗?

不好意思  没用过这个AIC23啊

使用特权

评论回复
9
飞鹰嵌入式|  楼主 | 2013-4-25 09:05 | 只看该作者
zhangmangui 发表于 2013-4-24 22:57
不好意思  没用过这个AIC23啊

感觉跟这个芯片没关系,你看我程序运行是不是有什么问题,是不是因为程序和数据总线不是一个总线,出现不同步现象?我是刚开始学DSP,是个很菜的菜鸟,多多费心了

使用特权

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

本版积分规则

个人签名:

46

主题

452

帖子

4

粉丝