东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[C/C++] 雷达信号生成器radar_signal_generator_cw_c的源码分析

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14450
QQ
跳转到指定楼层
楼主
发表于 2021-5-20 10:33:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



雷达信号生成器radar_signal_generator_cw_c的源码分析


头文件:gr-radar/include/radar/signal_generator_cw_c.h

  1. #ifndef INCLUDED_RADAR_SIGNAL_GENERATOR_CW_C_H
  2. #define INCLUDED_RADAR_SIGNAL_GENERATOR_CW_C_H

  3. #include <gnuradio/sync_block.h>
  4. #include <radar/api.h>

  5. namespace gr {
  6. namespace radar {

  7. /*!
  8. * \brief This block generates a signal for CW radar in baseband. The waveform consists of
  9. * one (or sometimes multiple) constant frequency.
  10. *
  11. * \param packet_len packet_len is the length of a single tagged stream package which will
  12. * be processed in subsequent tagged stream blocks. \param samp_rate Signal sample rate
  13. * \param frequency This parameter holds a vector of all constant frequencies in baseband.
  14. * \param amplitude Signal amplitude
  15. * \param len_key Packet length key for tagged stream
  16. *
  17. * \ingroup radar
  18. *
  19. */
  20. class RADAR_API signal_generator_cw_c : virtual public gr::sync_block
  21. {
  22. public:
  23.     typedef boost::shared_ptr<signal_generator_cw_c> sptr;

  24.     /*!
  25.      * \brief Return a shared_ptr to a new instance of radar::signal_generator_cw_c.
  26.      *
  27.      * To avoid accidental use of raw pointers, radar::signal_generator_cw_c's
  28.      * constructor is in a private implementation
  29.      * class. radar::signal_generator_cw_c::make is the public interface for
  30.      * creating new instances.
  31.      */
  32.     static sptr make(int packet_len,
  33.                      int samp_rate,
  34.                      std::vector<float> frequency,
  35.                      float amplitude,
  36.                      const std::string& len_key = "packet_len");
  37. };

  38. } // namespace radar
  39. } // namespace gr

  40. #endif /* INCLUDED_RADAR_SIGNAL_GENERATOR_CW_C_H */
复制代码



具体实现的头文件:gr-radar/lib/signal_generator_cw_c_impl.h

  1. #ifndef INCLUDED_RADAR_SIGNAL_GENERATOR_CW_C_IMPL_H
  2. #define INCLUDED_RADAR_SIGNAL_GENERATOR_CW_C_IMPL_H

  3. #include <radar/signal_generator_cw_c.h>

  4. namespace gr {
  5. namespace radar {

  6. class signal_generator_cw_c_impl : public signal_generator_cw_c
  7. {
  8. private:
  9.     // Nothing to declare in this block.

  10. public:
  11.     signal_generator_cw_c_impl(int packet_len,
  12.                                int samp_rate,
  13.                                std::vector<float> frequency,
  14.                                float amplitude,
  15.                                const std::string& len_key);
  16.     ~signal_generator_cw_c_impl();

  17.     int d_packet_len, d_samp_rate;
  18.     float d_amplitude;
  19.     std::vector<float> d_frequency;
  20.     int d_num_freq;

  21.     pmt::pmt_t d_key, d_value, d_srcid;
  22.     std::vector<gr_complex> d_phase;

  23.     // 所有的动作都发生在这里
  24.     int work(int noutput_items,
  25.              gr_vector_const_void_star& input_items,
  26.              gr_vector_void_star& output_items);
  27. };

  28. } // namespace radar
  29. } // namespace gr

  30. #endif /* INCLUDED_RADAR_SIGNAL_GENERATOR_CW_C_IMPL_H */
复制代码




具体实现的cc文件:gr-radar/lib/signal_generator_cw_c_impl.cc

  1. #ifdef HAVE_CONFIG_H
  2. #include "config.h"
  3. #endif

  4. #include "signal_generator_cw_c_impl.h"
  5. #include <gnuradio/io_signature.h>
  6. #include <gnuradio/math.h>

  7. namespace gr {
  8. namespace radar {

  9. signal_generator_cw_c::sptr signal_generator_cw_c::make(int packet_len,
  10.                                                         int samp_rate,
  11.                                                         std::vector<float> frequency,
  12.                                                         float amplitude,
  13.                                                         const std::string& len_key)
  14. {
  15.     return gnuradio::get_initial_sptr(new signal_generator_cw_c_impl(
  16.         packet_len, samp_rate, frequency, amplitude, len_key));
  17. }

  18. /*
  19. * The private constructor
  20. */
  21. signal_generator_cw_c_impl::signal_generator_cw_c_impl(int packet_len,
  22.                                                        int samp_rate,
  23.                                                        std::vector<float> frequency,
  24.                                                        float amplitude,
  25.                                                        const std::string& len_key)
  26.     : gr::sync_block("signal_generator_cw_c",
  27.                      gr::io_signature::make(0, 0, 0),
  28.                      gr::io_signature::make(1, 1, sizeof(gr_complex)))
  29. {
  30.     d_packet_len = packet_len; // packet length of 1 cw packet
  31.     d_samp_rate = samp_rate;   // samp rate of the signal
  32.     d_frequency = frequency;   // frequency of the cw signal in baseband
  33.     d_amplitude = amplitude;   // amplitude of the cw signal

  34.     d_key = pmt::string_to_symbol(len_key); // set tag identifier for tagged stream
  35.     d_value = pmt::from_long(packet_len);   // set length of 1 cw packet as tagged stream
  36.     d_srcid = pmt::string_to_symbol("sig_gen_cw"); // set block identifier
  37.     d_num_freq = d_frequency.size();
  38.     d_phase.resize(d_num_freq); // set start phase to 0
  39. }

  40. /*
  41. * Our virtual destructor.
  42. */
  43. signal_generator_cw_c_impl::~signal_generator_cw_c_impl() {}

  44. int signal_generator_cw_c_impl::work(int noutput_items,
  45.                                      gr_vector_const_void_star& input_items,
  46.                                      gr_vector_void_star& output_items)
  47. {
  48.     gr_complex* out = (gr_complex*)output_items[0];

  49.     // Set output to zero
  50.     std::memset(out, 0, noutput_items * sizeof(gr_complex));

  51.     // Integrate phase for iq signal
  52.     for (int i = 0; i < noutput_items; i++) {
  53.         // Set tag on every packet_len-th item
  54.         if ((nitems_written(0) + i) % d_packet_len == 0)
  55.             add_item_tag(0, nitems_written(0) + i, d_key, d_value, d_srcid);

  56.         // Write sample
  57.         for (int k = 0; k < d_num_freq; k++) { // Go through frequencies
  58.             out[i] += d_amplitude / (float)d_num_freq *
  59.                       exp(d_phase[k]); // output amplitude is normed on d_amplitude
  60.             d_phase[k] = gr_complex(0, std::fmod(imag(d_phase[k]) + 2 * GR_M_PI * d_frequency[k] /
  61.                                                                (float)d_samp_rate,
  62.                                         2 * GR_M_PI));
  63.         }
  64.     }

  65.     // Tell runtime system how many output items we produced.
  66.     return noutput_items;
  67. }

  68. } /* namespace radar */
  69. } /* namespace gr */
复制代码










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

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
沙发
发表于 2021-11-23 19:43:07 | 只看该作者
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-16 15:31 , Processed in 0.174676 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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