东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2029|回复: 0
打印 上一主题 下一主题

[C/C++] gr cpu指令加速库volk使用复数数组相乘

[复制链接]

1366

主题

1857

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14458
QQ
跳转到指定楼层
楼主
发表于 2021-7-14 09:22:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式




gr cpu指令加速库volk使用复数数组相乘




  1. #include <iostream>
  2. #include <volk/volk.h>
  3. #include <complex>
  4. #include <vector>

  5. using namespace std;

  6. typedef std::complex<float> gr_complex;   //这个float精度与fftwf一致

  7. void print_vector_complex(std::vector<gr_complex>& v){
  8.     for(std::vector<gr_complex>::iterator it=v.begin();it!=v.end();it++){
  9.         cout << "value of complex: real=" << (*it).real() << ",imag=" << (*it).imag() << endl;
  10.     }

  11. }

  12. void main_gr(){
  13.     int noutput_items = 10;
  14.     std::vector<gr_complex> d_hold_in;   //这是容器对象 vector动态数组
  15.     std::vector<gr_complex> d_filt_doppler;
  16.     gr_complex in[noutput_items];  // int a[10]; in是数组名

  17.     cout << "容器的大小=" << d_hold_in.size() << endl;
  18.     d_hold_in.resize(noutput_items);
  19.     d_filt_doppler.resize(noutput_items);
  20.     cout << "容器的大小=" << d_hold_in.size() << endl;


  21.     // 输入的数据  赋值
  22.     for(int i=0;i<noutput_items; i++){
  23.         //d_hold_in.push_back(gr_complex(i, 0));
  24.         //d_hold_in[i] = gr_complex(i,i+10);
  25.         d_filt_doppler[i] = gr_complex(i, i);
  26.         in[i] = gr_complex(i+5,i);
  27.     }

  28.     int array_len = sizeof(in) / sizeof(gr_complex);

  29.     //cout << "输入数据赋初值d_hold_in:" << endl;
  30.     //print_vector_complex(d_hold_in);
  31.    
  32.    
  33.     cout << "看看数组in的值:len=" << array_len << endl;
  34.     for(int i=0;i<array_len;i++){
  35.         cout << i << "个数组元素: real=" << in[i].real() << ",imag=" << in[i].imag() << endl;
  36.     }

  37.     cout << "输入数据赋初值d_filt_doppler:" << endl;
  38.     print_vector_complex(d_filt_doppler);

  39.     //target_link_libraries(main -lvolk)
  40.     //typedef std::complex<float>   lv_32fc_t;  只能是复数
  41.     //参数类型(lv_32fc_t *, const lv_32fc_t *, const lv_32fc_t *, unsigned int)
  42.     // 函数作用:复数数组与复数数组相乘 就是对应元素复数相乘的结果
  43.     volk_32fc_x2_multiply_32fc(
  44.                 &d_hold_in[0],  //容器对象首元素的地址   只有这个变了  *out
  45.                 in,  // 数组名 就是入口地址   没变    *in1
  46.                 &d_filt_doppler[0],   //  没变     *in2
  47.                 noutput_items);

  48.     cout << "经过volk_32fc_x2_multiply_32fc函数之后【in1*in2=out】:" << endl;

  49.     cout << "d_hold_in【只有这个变了】:" << endl;
  50.     print_vector_complex(d_hold_in);

  51.     // for(int i=0;i<array_len;i++){
  52.     //     cout << i << "个数组元素【不变】: real=" << in[i].real() << ",imag=" << in[i].imag() << endl;
  53.     // }

  54.     // cout << "d_filt_doppler【没有变】:" << endl;
  55.     // print_vector_complex(d_filt_doppler);


  56. }


  57. void main_jjj(){
  58.     int noutput_items = 10;
  59.     std::vector<gr_complex> out;   //这是容器对象 vector动态数组
  60.     std::vector<gr_complex> in_1;
  61.     std::vector<gr_complex> in_2;

  62.     out.resize(noutput_items);
  63.     in_1.resize(noutput_items);  // 这样就不能.push_back()了
  64.     in_2.resize(noutput_items);


  65.     // 输入的数据  赋值
  66.     for(int i=0;i<noutput_items; i++){
  67.         //d_hold_in.push_back(gr_complex(i, 0));
  68.         //d_hold_in[i] = gr_complex(i,i+10);
  69.         in_1[i] = gr_complex(i, i);
  70.         in_2[i] = gr_complex(i+5, i);
  71.     }


  72.     cout << "输入数据赋初值in_1:" << endl;
  73.     print_vector_complex(in_1);

  74.     cout << "输入数据赋初值in_2:" << endl;
  75.     print_vector_complex(in_2);


  76.     //target_link_libraries(main -lvolk)
  77.     //typedef std::complex<float>   lv_32fc_t;  只能是复数
  78.     //参数类型(lv_32fc_t *, const lv_32fc_t *, const lv_32fc_t *, unsigned int)
  79.     // 函数作用:复数数组与复数数组相乘 就是对应元素复数相乘的结果  这个可能优化了
  80.     volk_32fc_x2_multiply_32fc(
  81.                 &out[0],  //容器对象首元素的地址   只有这个变了  *out
  82.                 &in_1[0],  //     *in1
  83.                 &in_2[0],   //  没变     *in2
  84.                 noutput_items);

  85.     cout << "经过volk_32fc_x2_multiply_32fc函数之后【in1*in2=out】:" << endl;

  86.     cout << "输出结果out【只有这个变了】:" << endl;
  87.     print_vector_complex(out);


  88. }

  89. //gr cpu指令加速库volk使用复数数组相乘

  90. int main(){
  91.     // main_gr();    // 模仿gr的写法
  92.     main_jjj();    //自己改成 好理解
  93.     return 0;
  94. }


复制代码


8_volk.png (218.48 KB, 下载次数: 86)

8_volk.png
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-6-23 11:32 , Processed in 0.194680 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表