CUDA之窄带常规波束形成

原创 2016年05月31日 22:31:27

思路

现在手上有了cuda的复数矩阵乘法和复数矩阵转置。理论上讲可以做一个简单的波束形成了。
按照matlab之并行计算 的思想把for循环都变成矩阵来做。

  • 复数矩阵定义
typedef struct {
    int width;
    int height;
    int stride;
    double * real;
    double * imag;
} Matrix;
  • 复数矩阵乘法
CvalueR += AsR[row][e] * BsR[e][col]-AsI[row][e]*BsI[e][col];
CvalueI += AsR[row][e] * BsI[e][col]+AsI[row][e]*BsR[e][col];
  • 复数共轭转置
B.real[j + i*B.stride] = A.real[i + j*A.stride];
B.imag[j + i*B.stride] = -A.imag[i + j*A.stride];
  • 阵列流形矢量a的表示
a = exp(-jay*2*pi*sin(theta'*pi/180)*[0:N-1]*f0*d/c);

由于没有C里面没有复数计算。将a表示为两部分:

a.real = cos(-2*PI*j*f0*d/c*sin(theta*PI/180)); 
a.imag = sin(-2*PI*j*f0*d/c*sin(theta*PI/180));

同时可以看作是两次矩阵乘法。

    Matrix tempN,temptheta,tempA;
    init(&tempN,1,M);
    init(&temptheta,N_THETA,1);
    init(&tempA,N_THETA,M);

    int  theta = -90; //起始扫描角

    for(i = 0; i<M; i++)
    {
        tempN.real[i] = -2*PI*i*f0*d/c;
    }
    for(i=0;i<N_THETA;i++)
    {
        temptheta.real[i] = sin(theta*PI/180);
        theta = theta + 1;
    }
    CMatMul(temptheta,tempN,tempA) ;
    for(i=0; i<A.height*A.width; i++)
    {
        A.real[i] = cos(tempA.real[i]);
        A.imag[i] = sin(tempA.real[i]);
    }
  • 求对角
    这个就完全是数字问题了,很简单。
    for(i=0;i<N_THETA;i++)
    {
        BeamDOA.real[i] = tempbeam.real[(N_THETA+1)*i];
        BeamDOA.imag[i] = tempbeam.imag[(N_THETA+1)*i];
    }

问题

  • hilbert只能输入SIZE为2的N次方的信号。不然就会有死循环啦
  • matlab中的data’是data的共轭转置矩阵。因此在我的矩阵转置中应设置虚部求负
  • 计算A时的矩阵乘法的两个因子的宽度 比第一次求R时的矩阵乘法的TILE_SIZE 小,所以求出来A值都为零。对于同一个矩阵乘法函数,由于计算不同乘法时的矩阵宽度不同,应设置不同大小的TILE_SIZE。

结果

DATASIZE BLOCKSIZE TIME
2^15 1 1.332s
2^15 2 0.968s
2^15 4 0.509s
2^15 8 0.366s

由于上不了图,只能口述了,DOA数据与matlab计算的数据对比一致。
成功啦~!蛮开心的~!

然后我就发现直接用CPU只需要0.19s又被吊打了…

版权声明:本文为博主原创文章,未经博主允许不得转载。

Arrayfire学习笔记(三)常规窄带波束形成

经过两天的熟悉以及小伙伴的指导,蹒跚着开始了程序的实(测)现(试) 有了一些常用的矩阵运算,基本上就可以实现一个煎蛋的波束形成代码了。 在VS上写矩阵比matlab痛苦很多, matlab: ...
  • Sumujingling
  • Sumujingling
  • 2016年03月17日 13:15
  • 1177

波束形成(1)

常规波束形成: 对阵列获得的空间信号进行加权,使波束指向某一空间方向。DOA估计时,利用阵列流行搜索,与来波的相关矩阵匹配,峰值处即为来波方向。 MUSIC算法: 将来波的相关矩阵进行特征值分解...
  • ZSZ_shsf
  • ZSZ_shsf
  • 2016年05月10日 22:42
  • 1296

常规波束形成matlab程序

  • 2013年06月27日 22:41
  • 29KB
  • 下载

常规波束形成的CPU和GPU的运行时间对比测试

如图所示, 做了一点小测试,确实和以前看到的资料一样,会出现临界数据量,但是我觉得我的GPU程序写的不够好吧,没有达到想要的效果,不知道大家有什么看法。 然后通过此次测试认...
  • ZIV555
  • ZIV555
  • 2016年04月22日 16:11
  • 710

CUDA之窄带常规波束形成

思路现在手上有了cuda的复数矩阵乘法和复数矩阵转置。理论上讲可以做一个简单的波束形成了。 按照matlab之并行计算 的思想把for循环都变成矩阵来做。 复数矩阵定义 typedef struct...
  • Sumujingling
  • Sumujingling
  • 2016年05月31日 22:31
  • 695

波束形成matlab代码及方程图

  • 2013年11月21日 21:28
  • 1.26MB
  • 下载

自适应波束形成(一)——窄带波束形成和宽带波束形成

在许多波束形成应用中,我们经常需要根据接收到的阵列数据来更新波束形成器系数,以获得不同情境下的最优解决方案。若环境是变化的,系数也要自适应变化,这就是自适应波束形成器。         运用波束形成技...
  • YJJat1989
  • YJJat1989
  • 2014年03月21日 14:27
  • 3700

波束形成算法

波束形成算法
  • jwb361
  • jwb361
  • 2017年07月08日 15:37
  • 327

MATLAB常规均匀圆阵波束形成

  • 2010年06月04日 19:27
  • 663B
  • 下载

LCMV Beamforming

    今天主要讲一下LCMV算法,原因是后面的很多算法包括MVDR和GSC等都是基于它的思想改进的,而后两者是使用很普及的算法,所以我感觉有必要先讲一下LCMV算法,从而对于后面两者有更好的了解。 ...
  • qq_23660243
  • qq_23660243
  • 2018年02月10日 10:21
  • 11
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CUDA之窄带常规波束形成
举报原因:
原因补充:

(最多只允许输入30个字)