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: ...

自适应波束形成(二)——时域窄带LCMV波束形成器

1 算法原理         如果期望信号的到达角和带宽范围已知,那么可以先对阵列接收数据进行时延补偿,使阵列对期望信号的接收保持一致性,然后对阵列系数强加约束条件以自适应的使波束形成器输出能量E{y...

水平线阵的反卷积常规波束形成

在常规的波束形成中,是将阵列上的每个接收机的同时刻数据乘上一个预设的系数然后求和并最终得到一系列的具有特定指向性的波束。但是由此得到的波束它的主瓣宽度很宽而且旁瓣衰减有限,能量泄漏很严重。为了解决这些...

常规波束形成

  • 2014年11月11日 08:34
  • 1KB
  • 下载

浅谈窄带物联网(NB-IoT)

一、发展历程物联网通信技术繁多,从传输距离上可划分成两类:第一类是短距离通信技术,例如ZigBee、Wi-Fi、Bluetooth等,典型的应用场合如智能家居;第二类是低功耗广域网(Low Power...

常规波束形成

  • 2013年12月19日 15:45
  • 443B
  • 下载

矢量阵改进常规波束形成

  • 2015年04月26日 11:18
  • 165KB
  • 下载

波束形成(1)

常规波束形成: 对阵列获得的空间信号进行加权,使波束指向某一空间方向。DOA估计时,利用阵列流行搜索,与来波的相关矩阵匹配,峰值处即为来波方向。 MUSIC算法: 将来波的相关矩阵进行特征值分解...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CUDA之窄带常规波束形成
举报原因:
原因补充:

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