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

来源:互联网 发布:java中求质数 编辑:程序博客网 时间:2024/05/31 19:04

经过两天的熟悉以及小伙伴的指导,蹒跚着开始了程序的实(测)现(试)

有了一些常用的矩阵运算,基本上就可以实现一个煎蛋的波束形成代码了。


在VS上写矩阵比matlab痛苦很多,

matlab:


R = signal_d'*signal_d;
    for i = 1:length(theta)
        a_s = exp(-jay*2*pi*f0*[0:N-1]*d/c*sin(theta(i)*pi/180));
        beam(i,temp3) = a_s *(R) *a_s';
    end


VS:

for(i_theta=0;i_theta<n_theta;i_theta++)

{
a_sReal = cos(-2*PI*ula_id*f0*d/c*sin(theta*PI/180));
a_simag = sin(-2*PI*ula_id*f0*d/c*sin(theta*PI/180));
a_s     = af::complex(a_sReal,a_simag );
a_sT =transpose(a_s);
temp_p = matmul(a_s,R_data);
p_data = matmul(temp_p,a_sT);
p_data_abs = af::abs(p_data);
theta = theta + 0.5;
test_data.push_back(af::sum<double>(p_data_abs*p_data_abs));//类型转换

}


真的是很久没写过这些程序了,总结一点心得:

1.用来做循环的量很多时候重复利用了,但是没有在适当的适合置零。导致在之后的循环中,出错。

2.测试用的数据不宜太对称了。不然结果可能出乎意料。

3.用arrayfire or C写虚数好麻烦。要先写实部,再写虚部,再用af::complex(shibu,xubu)把实部虚部组合起来。刚开始没发现可以用这个的时候,简直是在一个值一个值往阵列里写。

4.C语言里各种数据类型纠结死了。arrayfire里面不支持的运算目前都是转出来变成数组或者栈再操作再变回去。

5.arrayfire的转置也分共轭转置和转置两种。通过设置参数conjugate为true或false来分别实现。


AFAPI af_err af_transpose(af_array * out,  af_array in,  const bool conjugate  )
[out]outThe transposed matrix[in]inInput matrix which will be transposed[in]conjugatePerform a congugate transposition
6.将矩阵B中的元素写入矩阵A的例子


  printf("--\nSub-refencing and Sub-assignment\n");
        af_print(A);
        af_print(A.col(0));
        af_print(A.row(0));
        A(0) = 11;
        A(1) = 100;
        af_print(A);
        af_print(B);
        A(1,span) = B(2,span);
        af_print(A);

AFAPI af_err af_transpose(af_array * out,  af_array in,  const bool conjugate  )
0 0
原创粉丝点击