|
雷达信号生成器radar_signal_generator_cw_c的源码分析
头文件:gr-radar/include/radar/signal_generator_cw_c.h
- #ifndef INCLUDED_RADAR_SIGNAL_GENERATOR_CW_C_H
- #define INCLUDED_RADAR_SIGNAL_GENERATOR_CW_C_H
- #include <gnuradio/sync_block.h>
- #include <radar/api.h>
- namespace gr {
- namespace radar {
- /*!
- * \brief This block generates a signal for CW radar in baseband. The waveform consists of
- * one (or sometimes multiple) constant frequency.
- *
- * \param packet_len packet_len is the length of a single tagged stream package which will
- * be processed in subsequent tagged stream blocks. \param samp_rate Signal sample rate
- * \param frequency This parameter holds a vector of all constant frequencies in baseband.
- * \param amplitude Signal amplitude
- * \param len_key Packet length key for tagged stream
- *
- * \ingroup radar
- *
- */
- class RADAR_API signal_generator_cw_c : virtual public gr::sync_block
- {
- public:
- typedef boost::shared_ptr<signal_generator_cw_c> sptr;
- /*!
- * \brief Return a shared_ptr to a new instance of radar::signal_generator_cw_c.
- *
- * To avoid accidental use of raw pointers, radar::signal_generator_cw_c's
- * constructor is in a private implementation
- * class. radar::signal_generator_cw_c::make is the public interface for
- * creating new instances.
- */
- static sptr make(int packet_len,
- int samp_rate,
- std::vector<float> frequency,
- float amplitude,
- const std::string& len_key = "packet_len");
- };
- } // namespace radar
- } // namespace gr
- #endif /* INCLUDED_RADAR_SIGNAL_GENERATOR_CW_C_H */
复制代码
具体实现的头文件:gr-radar/lib/signal_generator_cw_c_impl.h
- #ifndef INCLUDED_RADAR_SIGNAL_GENERATOR_CW_C_IMPL_H
- #define INCLUDED_RADAR_SIGNAL_GENERATOR_CW_C_IMPL_H
- #include <radar/signal_generator_cw_c.h>
- namespace gr {
- namespace radar {
- class signal_generator_cw_c_impl : public signal_generator_cw_c
- {
- private:
- // Nothing to declare in this block.
- public:
- signal_generator_cw_c_impl(int packet_len,
- int samp_rate,
- std::vector<float> frequency,
- float amplitude,
- const std::string& len_key);
- ~signal_generator_cw_c_impl();
- int d_packet_len, d_samp_rate;
- float d_amplitude;
- std::vector<float> d_frequency;
- int d_num_freq;
- pmt::pmt_t d_key, d_value, d_srcid;
- std::vector<gr_complex> d_phase;
- // 所有的动作都发生在这里
- int work(int noutput_items,
- gr_vector_const_void_star& input_items,
- gr_vector_void_star& output_items);
- };
- } // namespace radar
- } // namespace gr
- #endif /* INCLUDED_RADAR_SIGNAL_GENERATOR_CW_C_IMPL_H */
复制代码
具体实现的cc文件:gr-radar/lib/signal_generator_cw_c_impl.cc
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- #include "signal_generator_cw_c_impl.h"
- #include <gnuradio/io_signature.h>
- #include <gnuradio/math.h>
- namespace gr {
- namespace radar {
- signal_generator_cw_c::sptr signal_generator_cw_c::make(int packet_len,
- int samp_rate,
- std::vector<float> frequency,
- float amplitude,
- const std::string& len_key)
- {
- return gnuradio::get_initial_sptr(new signal_generator_cw_c_impl(
- packet_len, samp_rate, frequency, amplitude, len_key));
- }
- /*
- * The private constructor
- */
- signal_generator_cw_c_impl::signal_generator_cw_c_impl(int packet_len,
- int samp_rate,
- std::vector<float> frequency,
- float amplitude,
- const std::string& len_key)
- : gr::sync_block("signal_generator_cw_c",
- gr::io_signature::make(0, 0, 0),
- gr::io_signature::make(1, 1, sizeof(gr_complex)))
- {
- d_packet_len = packet_len; // packet length of 1 cw packet
- d_samp_rate = samp_rate; // samp rate of the signal
- d_frequency = frequency; // frequency of the cw signal in baseband
- d_amplitude = amplitude; // amplitude of the cw signal
- d_key = pmt::string_to_symbol(len_key); // set tag identifier for tagged stream
- d_value = pmt::from_long(packet_len); // set length of 1 cw packet as tagged stream
- d_srcid = pmt::string_to_symbol("sig_gen_cw"); // set block identifier
- d_num_freq = d_frequency.size();
- d_phase.resize(d_num_freq); // set start phase to 0
- }
- /*
- * Our virtual destructor.
- */
- signal_generator_cw_c_impl::~signal_generator_cw_c_impl() {}
- int signal_generator_cw_c_impl::work(int noutput_items,
- gr_vector_const_void_star& input_items,
- gr_vector_void_star& output_items)
- {
- gr_complex* out = (gr_complex*)output_items[0];
- // Set output to zero
- std::memset(out, 0, noutput_items * sizeof(gr_complex));
- // Integrate phase for iq signal
- for (int i = 0; i < noutput_items; i++) {
- // Set tag on every packet_len-th item
- if ((nitems_written(0) + i) % d_packet_len == 0)
- add_item_tag(0, nitems_written(0) + i, d_key, d_value, d_srcid);
- // Write sample
- for (int k = 0; k < d_num_freq; k++) { // Go through frequencies
- out[i] += d_amplitude / (float)d_num_freq *
- exp(d_phase[k]); // output amplitude is normed on d_amplitude
- d_phase[k] = gr_complex(0, std::fmod(imag(d_phase[k]) + 2 * GR_M_PI * d_frequency[k] /
- (float)d_samp_rate,
- 2 * GR_M_PI));
- }
- }
- // Tell runtime system how many output items we produced.
- return noutput_items;
- }
- } /* namespace radar */
- } /* namespace gr */
复制代码
|
|