打印

DSP调试问题?

[复制链接]
1779|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyme411|  楼主 | 2013-5-29 17:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
blacksword| | 2013-5-29 17:36 | 只看该作者
在编译器的优化选项上选不优化再试一下,看一下是不是被优化掉了

使用特权

评论回复
板凳
zhangmangui| | 2013-5-29 18:11 | 只看该作者
这两个编译器是有区别的  数据类型bit数都是不一样的

使用特权

评论回复
地板
yyme411|  楼主 | 2013-5-29 18:26 | 只看该作者
zhangmangui 发表于 2013-5-29 18:11
这两个编译器是有区别的  数据类型bit数都是不一样的

那这种应该怎么弄?求分析 求解!

使用特权

评论回复
5
zhangmangui| | 2013-5-29 18:57 | 只看该作者
yyme411 发表于 2013-5-29 18:26
那这种应该怎么弄?求分析 求解!

https://bbs.21ic.com/icview-556058-1-1.html

使用特权

评论回复
6
kkzz| | 2013-5-29 21:54 | 只看该作者
贴个代码看看

使用特权

评论回复
7
yyme411|  楼主 | 2013-5-30 08:24 | 只看该作者
应楼上要求,现在贴出代码如下:
#include "mymath.h"

double Compute_capon(double theta1,double theta2,double SNR,int M,double G_capon[360])
{
        double theta;
        Complex **s1, **s2, **s1_tran, **s2_tran, **Ryy, **Ryy_inv, **w ,**w_tran;
        Complex **temp1_MM, **temp2_MM , **temp3_MM, **noise_MM,**temp_1M, **temp_M1, **temp_11;
        double temp_G ;
        int i,j,k;
        double pp;
       
        s1=CMatrix(1,M,1,1);  //信号s1, 一个 M 维列向量
        s2=CMatrix(1,M,1,1);  //信号s2, 一个 M 维列向量
        for(i=0;i<M;i++)    //产生复指数信号s1,s2;s1=exp(-j.*pi.*sin(theta1*pi/180).*ind).';
        {
                k=i+1;
                s1[k][1].real=cos(-PI*sin(theta1*PI/180)*i);
                s1[k][1].imag=sin(-PI*sin(theta1*PI/180)*i);
                s2[k][1].real=cos(-PI*sin(theta2*PI/180)*i);
                s2[k][1].imag=sin(-PI*sin(theta2*PI/180)*i);
        }



        //计算Ryy=s1*s1'+s2*s2'+10.^(-SNR/10)*eye()
        Ryy=CMatrix(1,M,1,M);       //阵元输出信号的协方差矩阵
        Ryy_inv=CMatrix(1,M,1,M);   //Ryy的逆矩阵     
        s1_tran=CMatrix(1,1,1,M);  //s1的共轭转置 一个M维的行向量
        s2_tran=CMatrix(1,1,1,M);  //s2的共轭转置 一个M维的行向量
        temp1_MM=CMatrix(1,M,1,M);
        temp2_MM=CMatrix(1,M,1,M);
        temp3_MM=CMatrix(1,M,1,M);
        noise_MM=CMatrix(1,M,1,M);
        CMatrix_transpose(s1,M,1,s1_tran);   //复矩阵复共轭转置
        CMatrix_transpose(s2,M,1,s2_tran);
        CMatrix_multiply(s1,M,1,s1_tran,1,M,temp1_MM);   //复矩阵乘法
        CMatrix_multiply(s2,M,1,s2_tran,1,M,temp2_MM);

        pp=pow(10,-SNR/10);
        for(i=1;i<=M;i++)
                for(j=1;j<=M;j++)
                {
                        if(j==i)
                        {
                                noise_MM[i][j].real=pp;
                                noise_MM[i][j].imag=0;
                        }
                        else
                        {
                                noise_MM[i][j].real=0;
                                noise_MM[i][j].imag=0;
                        }       
                }

        CMatrix_plus(temp1_MM,temp2_MM,M,M,temp3_MM);    //复矩阵加法
        CMatrix_plus(temp3_MM,noise_MM,M,M,Ryy);

//        CMatrix_print(s1,M,1);
//        CMatrix_print(Ryy,M,M);


        //计算w_MVDR=(inv(Ryy)*s1/(s1'*inv(Ryy)*s1))
        CMatrix_inv(Ryy,M,Ryy_inv);    //复矩阵求逆

//        CMatrix_print(Ryy_inv,M,M);
       
        temp_1M=CMatrix(1,1,1,M);   
        temp_M1=CMatrix(1,M,1,1);
        temp_11=CMatrix(1,1,1,1);
        CMatrix_multiply(s1_tran,1,M,Ryy_inv,M,M,temp_1M);
        CMatrix_multiply(temp_1M,1,M,s1,M,1,temp_11); //temp_11=s1'*inv(Ryy)*s1) 维数为 1x1
        CMatrix_multiply(Ryy_inv,M,M,s1,M,1,temp_M1);  //temp_M1=inv(Ryy)*s1     维数为  M x 1
        w=CMatrix(1,M,1,1);        //权向量 , M 维列向量
        for(i=1;i<=M;i++)
        {
                w[i][1]=Cdiv(temp_M1[i][1],temp_11[1][1]);
        }

//        CMatrix_print(w,M,1);



//////计算不同输入角度的capon幅度/////////////////////////////////
        w_tran=CMatrix(1,1,1,M);        //权向量的共轭转置 , M 维行向量
        CMatrix_transpose(w,M,1,w_tran);
        theta=-90;
        for(i=0;i<360;i++) //角度搜索 (-90:0.5:89)
        {
                for(j=0;j<M;j++)    //产生复指数信号s1=exp(-j.*pi.*sin(theta1*pi/180).*ind).';
                {
                        k=j+1;
                        s1[k][1].real=cos(-PI*sin(theta*PI/180)*j);
                        s1[k][1].imag=sin(-PI*sin(theta*PI/180)*j);
                }
                CMatrix_multiply(w_tran,1,M,s1,M,1,temp_11);
                temp_G=Cabs(temp_11[1][1])*Cabs(temp_11[1][1]);  //G_MVDR(k)=abs((w_MVDR*s).^2);
                G_capon[i]=10*(log(temp_G)/((10)));          // G=10.*log10(G);
                theta=theta+0.5;
        //        cout<<G_capon[i]<<"    " ;
        }


        free_CMatrix(s1,1,M,1,1);
        free_CMatrix(s2,1,M,1,1);
        free_CMatrix(s1_tran,1,1,1,M);
        free_CMatrix(s2_tran,1,1,1,M);
        free_CMatrix(Ryy,1,M,1,M);
        free_CMatrix(Ryy_inv,1,M,1,M);
        free_CMatrix(w,1,M,1,1);
        free_CMatrix(w_tran,1,1,1,M);
        free_CMatrix(temp1_MM,1,M,1,M);
        free_CMatrix(temp2_MM,1,M,1,M);
        free_CMatrix(temp3_MM,1,M,1,M);
        free_CMatrix(noise_MM,1,M,1,M);
        free_CMatrix(temp_1M,1,1,1,M);
        free_CMatrix(temp_M1,1,M,1,1);
        free_CMatrix(temp_11,1,1,1,1);
        return -1;
}

void main()
{
        // TODO: Add your control notification handler code here
        double G_capon[360];
    int G[360];
        double nMax=-100000.0, nMin=100000.0;
        int i;
        int M=8;               //阵元数
        double m_theta1,m_theta2,m_SNR;
        m_theta1=20.0;
        m_theta2=-20.0;
        m_SNR=10;

        //计算capon波束形成器的各角度幅值,计算结果有G_capon返回
        Compute_capon(m_theta1,m_theta2,m_SNR, M, G_capon);  

        for(i=0;i<360;i++)
        {
                if(G_capon[i]>nMax) nMax=G_capon[i];    //找到最大值
                if(G_capon[i]<nMin) nMin=G_capon[i];    //找到最小值
        }
        for(i=0;i<360;i++)
        {
                G_capon[i]+=abs(nMin);     //通过整体平移,把负值都变成正值       
        }
        nMax=nMax+abs(nMin);
        for(i=0;i<360;i++)    //量化成高为250,宽为360的数组
        {
                G[i]=(int)((double)G_capon[i]/nMax*250) ;
                if(G[i]<=0) G[i]=0;
        }
}

使用特权

评论回复
8
yyme411|  楼主 | 2013-5-30 08:28 | 只看该作者
zhangmangui 发表于 2013-5-29 18:57
https://bbs.21ic.com/icview-556058-1-1.html

楼主,这个帖子里面就是有这个“在ccs中编写代码时,比如我们使用了unsigned char型数据,但在仿真的时候发现它不是8bit的,如下图所示


这说明我们没有搞懂DSP中的数据类型和大小,下图将会帮助我们弄清楚这些问题”。但是没有图

使用特权

评论回复
9
zhangmangui| | 2013-5-30 08:57 | 只看该作者
yyme411 发表于 2013-5-30 08:28
楼主,这个帖子里面就是有这个“在ccs中编写代码时,比如我们使用了unsigned char型数据,但在仿真的时候 ...

不好意思   图没上来  请查看下面链接
https://bbs.21ic.com/icview-556056-1-1.html

使用特权

评论回复
10
yyme411|  楼主 | 2013-5-30 11:06 | 只看该作者
zhangmangui 发表于 2013-5-30 08:57
不好意思   图没上来  请查看下面链接
https://bbs.21ic.com/icview-556056-1-1.html

不好意思,版主。我把数据类型改了,都为32位的了,但是还是存在哪个问题。你觉得应该是哪里问题

使用特权

评论回复
11
zzy5598| | 2013-5-30 11:08 | 只看该作者
看到程序头都大

使用特权

评论回复
12
zhangmangui| | 2013-5-30 11:39 | 只看该作者
yyme411 发表于 2013-5-30 11:06
不好意思,版主。我把数据类型改了,都为32位的了,但是还是存在哪个问题。你觉得应该是哪里问题 ...

程序真的看不来   你是在DSP硬件上跑的 还是只在ccs上呢

使用特权

评论回复
13
blacksword| | 2013-5-30 12:13 | 只看该作者
能否描述一下,你调试发现到哪一步就开始错了

使用特权

评论回复
14
yyme411|  楼主 | 2013-5-31 09:36 | 只看该作者
zhangmangui 发表于 2013-5-30 11:39
程序真的看不来   你是在DSP硬件上跑的 还是只在ccs上呢

现在还是在CCS上面跑的

使用特权

评论回复
15
yyme411|  楼主 | 2013-5-31 09:40 | 只看该作者
blacksword 发表于 2013-5-30 12:13
能否描述一下,你调试发现到哪一步就开始错了

在主函数里面调用函数Compute_capon(m_theta1,m_theta2,m_SNR,SENSOR,G_capon);它的输出结果G_capon就有问题了哈。我现在在想编译的时候一步一步的对应起来看中间变量哪里出问题了。请问一下你觉得这样能行吗?

使用特权

评论回复
16
blacksword| | 2013-5-31 12:19 | 只看该作者
应该跟着你的函数看到哪一个具体语句时不对了

使用特权

评论回复
17
yyme411|  楼主 | 2013-6-3 08:59 | 只看该作者
blacksword 发表于 2013-5-31 12:19
应该跟着你的函数看到哪一个具体语句时不对了

恩,现在就是在这样调,发现了一些问题。正在想改的方法

使用特权

评论回复
18
五谷道场| | 2013-6-7 16:49 | 只看该作者
DSP的型号是哪一款?
有可能不兼容,TI的编译器不完全支持C++的所有功能. 看一下对应c/c++ compiler文档都支持哪些c/c++ feature.

使用特权

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

本版积分规则

6

主题

64

帖子

1

粉丝