diff options
author | Johnathan Corgan | 2012-06-22 15:08:04 -0700 |
---|---|---|
committer | Johnathan Corgan | 2012-06-22 15:08:04 -0700 |
commit | 6e0626fd93b99eab2234fba79fc0174261ea67f4 (patch) | |
tree | aedd86a26944292a4b08c43201b47db8eb0d6674 | |
parent | 2036030273d1c4842670ca3b2bd96e72aa408c9e (diff) | |
parent | 82f6a4ee66ce37b67a62af8924b1727e77c68816 (diff) | |
download | gnuradio-6e0626fd93b99eab2234fba79fc0174261ea67f4.tar.gz gnuradio-6e0626fd93b99eab2234fba79fc0174261ea67f4.tar.bz2 gnuradio-6e0626fd93b99eab2234fba79fc0174261ea67f4.zip |
Merge branch 'master' into wip/gr-blocks-master
43 files changed, 203 insertions, 281 deletions
diff --git a/gnuradio-core/src/lib/general/gr_annotator_raw.cc b/gnuradio-core/src/lib/general/gr_annotator_raw.cc index 074c09173..e1ae73efb 100644 --- a/gnuradio-core/src/lib/general/gr_annotator_raw.cc +++ b/gnuradio-core/src/lib/general/gr_annotator_raw.cc @@ -66,7 +66,7 @@ void gr_annotator_raw::add_tag(uint64_t offset, pmt_t key, pmt_t val) std::sort(d_queued_tags.begin(), d_queued_tags.end(), gr_tag_t::offset_compare); // make sure we are not adding an item in the past! - if(tag.offset >= nitems_read(0)) { + if(tag.offset > nitems_read(0)) { throw std::runtime_error("gr_annotator_raw::add_tag: item added too far in the past\n."); } } diff --git a/gnuradio-core/src/lib/gengen/gr_sig_source_X.cc.t b/gnuradio-core/src/lib/gengen/gr_sig_source_X.cc.t index bdd0e810a..6959eac82 100644 --- a/gnuradio-core/src/lib/gengen/gr_sig_source_X.cc.t +++ b/gnuradio-core/src/lib/gengen/gr_sig_source_X.cc.t @@ -29,6 +29,7 @@ #include <algorithm> #include <gr_io_signature.h> #include <stdexcept> +#include <algorithm> #include <gr_complex.h> @@ -64,8 +65,7 @@ int case GR_CONST_WAVE: t = (gr_complex) d_ampl + d_offset; - for (int i = 0; i < noutput_items; i++) // FIXME unroll - optr[i] = t; + std::fill_n(optr, noutput_items, t); break; case GR_SIN_WAVE: @@ -142,8 +142,7 @@ int case GR_CONST_WAVE: t = (@TYPE@) d_ampl + d_offset; - for (int i = 0; i < noutput_items; i++) // FIXME unroll - optr[i] = t; + std::fill_n(optr, noutput_items, t); break; case GR_SIN_WAVE: diff --git a/gnuradio-core/src/lib/io/gri_wavfile.cc b/gnuradio-core/src/lib/io/gri_wavfile.cc index e316a0825..780bd1b98 100644 --- a/gnuradio-core/src/lib/io/gri_wavfile.cc +++ b/gnuradio-core/src/lib/io/gri_wavfile.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2004,2008 Free Software Foundation, Inc. + * Copyright 2004,2008,2012 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -27,107 +27,30 @@ #include <gri_wavfile.h> #include <cstring> #include <stdint.h> +#include <boost/asio.hpp> # define VALID_COMPRESSION_TYPE 0x0001 // WAV files are always little-endian, so we need some byte switching macros -// FIXME: Use libgruel versions - +// Basically, this is the opposite of htonx() and ntohx() #ifdef WORDS_BIGENDIAN -#ifdef HAVE_BYTESWAP_H -#include <byteswap.h> -#else -#warning Using non-portable code (likely wrong other than ILP32). - -static inline short int -bswap_16 (unsigned short int x) -{ - return ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)); -} - -static inline unsigned int -bswap_32 (unsigned int x) -{ - return ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) \ - | (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)); -} -#endif // HAVE_BYTESWAP_H - -static inline uint32_t -host_to_wav(uint32_t x) -{ - return bswap_32(x); -} - -static inline uint16_t -host_to_wav(uint16_t x) -{ - return bswap_16(x); -} - -static inline int16_t -host_to_wav(int16_t x) -{ - return bswap_16(x); -} - -static inline uint32_t -wav_to_host(uint32_t x) -{ - return bswap_32(x); -} - -static inline uint16_t -wav_to_host(uint16_t x) -{ - return bswap_16(x); -} - -static inline int16_t -wav_to_host(int16_t x) -{ - return bswap_16(x); -} +static inline uint32_t host_to_wav(uint32_t x) { return htonl(x); } +static inline uint16_t host_to_wav(uint16_t x) { return htons(x); } +static inline int16_t host_to_wav(int16_t x) { return htons(x); } +static inline uint32_t wav_to_host(uint32_t x) { return ntohl(x); } +static inline uint16_t wav_to_host(uint16_t x) { return ntohs(x); } +static inline int16_t wav_to_host(int16_t x) { return ntohs(x); } #else -static inline uint32_t -host_to_wav(uint32_t x) -{ - return x; -} - -static inline uint16_t -host_to_wav(uint16_t x) -{ - return x; -} - -static inline int16_t -host_to_wav(int16_t x) -{ - return x; -} - -static inline uint32_t -wav_to_host(uint32_t x) -{ - return x; -} - -static inline uint16_t -wav_to_host(uint16_t x) -{ - return x; -} - -static inline int16_t -wav_to_host(int16_t x) -{ - return x; -} +static inline uint32_t host_to_wav(uint32_t x) { return x; } +static inline uint16_t host_to_wav(uint16_t x) { return x; } +static inline int16_t host_to_wav(int16_t x) { return x; } +static inline uint32_t wav_to_host(uint32_t x) { return x; } +static inline uint16_t wav_to_host(uint16_t x) { return x; } +static inline int16_t wav_to_host(int16_t x) { return x; } #endif // WORDS_BIGENDIAN @@ -225,12 +148,15 @@ gri_wavheader_parse(FILE *fp, short int gri_wav_read_sample(FILE *fp, int bytes_per_sample) { - int16_t buf = 0; - size_t fresult; - - fresult = fread(&buf, bytes_per_sample, 1, fp); + int16_t buf_16bit; - return (short) wav_to_host(buf); + if(!fread(&buf_16bit, bytes_per_sample, 1, fp)) { + return 0; + } + if(bytes_per_sample == 1) { + return (short) buf_16bit; + } + return (short)wav_to_host(buf_16bit); } diff --git a/gnuradio-core/src/lib/io/gri_wavfile.h b/gnuradio-core/src/lib/io/gri_wavfile.h index c757be26b..16280e34a 100644 --- a/gnuradio-core/src/lib/io/gri_wavfile.h +++ b/gnuradio-core/src/lib/io/gri_wavfile.h @@ -29,20 +29,15 @@ /*! * \brief Read signal information from a given WAV file. * - * \p fp File pointer to an opened, empty file. - * \p sample_rate Stores the sample rate [S/s] - * \p nchans Number of channels - * \p bytes_per_sample Bytes per sample, can either be 1 or 2 (corresponding to - * 8 or 16 bit samples, respectively) - * \p first_sample_pos Number of the first byte containing a sample. Use this - * with fseek() to jump from the end of the file to the first sample - * when in repeat mode. - * \p samples_per_chan Number of samples per channel - * \p normalize_fac The normalization factor with which you need to divide the - * integer values of the samples to get them within [-1;1] - * \p normalize_shift The value by which the sample values need to be shifted - * after normalization (reason being, 8-bit WAV files store samples as - * unsigned char and 16-bit as signed short int) + * \param[in] fp File pointer to an opened, empty file. + * \param[out] sample_rate Stores the sample rate [S/s] + * \param[out] nchans Number of channels + * \param[out] bytes_per_sample Bytes per sample, can either be 1 or 2 (corresponding o + * 8 or 16 bit samples, respectively) + * \param[out] first_sample_pos Number of the first byte containing a sample. Use this + * with fseek() to jump from the end of the file to the + * first sample when in repeat mode. + * \param[out] samples_per_chan Number of samples per channel * \return True on a successful read, false if the file could not be read or is * not a valid WAV file. */ @@ -94,8 +89,8 @@ gri_wav_write_sample(FILE *fp, short int sample, int bytes_per_sample); * shouldn't happen), you need to fseek() to the end of the file (or * whereever). * - * \p fp File pointer to an open WAV file with a blank header - * \p byte_count Length of all samples written to the file in bytes. + * \param[in] fp File pointer to an open WAV file with a blank header + * \param[in] byte_count Length of all samples written to the file in bytes. */ bool gri_wavheader_complete(FILE *fp, unsigned int byte_count); diff --git a/gr-filter/include/filter/adaptive_fir_ccc.h b/gr-filter/include/filter/adaptive_fir_ccc.h index 616a52f73..261259957 100644 --- a/gr-filter/include/filter/adaptive_fir_ccc.h +++ b/gr-filter/include/filter/adaptive_fir_ccc.h @@ -72,7 +72,7 @@ namespace gr { * \param decimation (interger) decimation rate of the filter * \param taps (complex) filter taps */ - static FILTER_API sptr make(const char *name, int decimation, + static sptr make(const char *name, int decimation, const std::vector<gr_complex> &taps); virtual void set_taps(const std::vector<gr_complex> &taps) = 0; diff --git a/gr-filter/include/filter/adaptive_fir_ccf.h b/gr-filter/include/filter/adaptive_fir_ccf.h index 0c19611d5..0fd8d5746 100644 --- a/gr-filter/include/filter/adaptive_fir_ccf.h +++ b/gr-filter/include/filter/adaptive_fir_ccf.h @@ -68,7 +68,7 @@ namespace gr { * \param decimation (interger) decimation rate of the filter * \param taps (real) filter taps */ - static FILTER_API sptr make(const char *name, int decimation, + static sptr make(const char *name, int decimation, const std::vector<float> &taps); virtual void set_taps(const std::vector<float> &taps) = 0; diff --git a/gr-filter/include/filter/channel_model.h b/gr-filter/include/filter/channel_model.h index 44d7f1a64..2e808de8e 100644 --- a/gr-filter/include/filter/channel_model.h +++ b/gr-filter/include/filter/channel_model.h @@ -64,7 +64,7 @@ namespace gr { * \param taps Taps of a FIR filter to emulate a multipath delay profile. * \param noise_seed A random number generator seed for the noise source. */ - static FILTER_API sptr make(double noise_voltage=0.0, + static sptr make(double noise_voltage=0.0, double frequency_offset=0.0, double epsilon=1.0, const std::vector<gr_complex> &taps=std::vector<gr_complex>(1,1), diff --git a/gr-filter/include/filter/dc_blocker_cc.h b/gr-filter/include/filter/dc_blocker_cc.h index b0a38ffcb..df4c815d6 100644 --- a/gr-filter/include/filter/dc_blocker_cc.h +++ b/gr-filter/include/filter/dc_blocker_cc.h @@ -65,7 +65,7 @@ namespace gr { * \param D (int) the length of the delay line * \param long_form (bool) whether to use long (true, default) or short form */ - static FILTER_API sptr make(int D, bool long_form); + static sptr make(int D, bool long_form); virtual int group_delay() = 0; }; diff --git a/gr-filter/include/filter/dc_blocker_ff.h b/gr-filter/include/filter/dc_blocker_ff.h index 18c729768..6ab4d5a3d 100644 --- a/gr-filter/include/filter/dc_blocker_ff.h +++ b/gr-filter/include/filter/dc_blocker_ff.h @@ -65,7 +65,7 @@ namespace gr { * \param D (int) the length of the delay line * \param long_form (bool) whether to use long (true, default) or short form */ - static FILTER_API sptr make(int D, bool long_form=true); + static sptr make(int D, bool long_form=true); virtual int group_delay() = 0; }; diff --git a/gr-filter/include/filter/fft_filter_ccc.h b/gr-filter/include/filter/fft_filter_ccc.h index c018629a9..acec93277 100644 --- a/gr-filter/include/filter/fft_filter_ccc.h +++ b/gr-filter/include/filter/fft_filter_ccc.h @@ -62,7 +62,7 @@ namespace gr { * \param taps complex filter taps * \param nthreads number of threads for the FFT to use */ - static FILTER_API sptr make(int decimation, + static sptr make(int decimation, const std::vector<gr_complex> &taps, int nthreads=1); diff --git a/gr-filter/include/filter/fft_filter_fff.h b/gr-filter/include/filter/fft_filter_fff.h index 78540666c..d8140325f 100644 --- a/gr-filter/include/filter/fft_filter_fff.h +++ b/gr-filter/include/filter/fft_filter_fff.h @@ -62,7 +62,7 @@ namespace gr { * \param taps float filter taps * \param nthreads number of threads for the FFT to use */ - static FILTER_API sptr make(int decimation, + static sptr make(int decimation, const std::vector<float> &taps, int nthreads=1); diff --git a/gr-filter/include/filter/filter_delay_fc.h b/gr-filter/include/filter/filter_delay_fc.h index 299a65519..8a84a6a0e 100644 --- a/gr-filter/include/filter/filter_delay_fc.h +++ b/gr-filter/include/filter/filter_delay_fc.h @@ -56,7 +56,7 @@ namespace gr { * taps needs to be calculated before initializing this block. * */ - static FILTER_API sptr make(const std::vector<float> &taps); + static sptr make(const std::vector<float> &taps); }; } /* namespace filter */ diff --git a/gr-filter/include/filter/fir_filter_XXX.h.t b/gr-filter/include/filter/fir_filter_XXX.h.t index fc768bcad..98e82f510 100644 --- a/gr-filter/include/filter/fir_filter_XXX.h.t +++ b/gr-filter/include/filter/fir_filter_XXX.h.t @@ -69,7 +69,7 @@ namespace gr { * \param decimation set the integer decimation rate * \param taps a vector/list of taps of type @TAP_TYPE@ */ - static FILTER_API sptr make(int decimation, + static sptr make(int decimation, const std::vector<@TAP_TYPE@> &taps); virtual void set_taps(const std::vector<@TAP_TYPE@> &taps) = 0; diff --git a/gr-filter/include/filter/fractional_interpolator_cc.h b/gr-filter/include/filter/fractional_interpolator_cc.h index 3f196c80f..bb0e18932 100644 --- a/gr-filter/include/filter/fractional_interpolator_cc.h +++ b/gr-filter/include/filter/fractional_interpolator_cc.h @@ -45,7 +45,7 @@ namespace gr { * \param phase_shift The phase shift of the output signal to the input * \param interp_ratio The interpolation ratio = input_rate / output_rate. */ - static FILTER_API sptr make(float phase_shift, + static sptr make(float phase_shift, float interp_ratio); virtual float mu() const = 0; diff --git a/gr-filter/include/filter/fractional_interpolator_ff.h b/gr-filter/include/filter/fractional_interpolator_ff.h index e05da847d..fc43c3457 100644 --- a/gr-filter/include/filter/fractional_interpolator_ff.h +++ b/gr-filter/include/filter/fractional_interpolator_ff.h @@ -45,7 +45,7 @@ namespace gr { * \param phase_shift The phase shift of the output signal to the input * \param interp_ratio The interpolation ratio = input_rate / output_rate. */ - static FILTER_API sptr make(float phase_shift, + static sptr make(float phase_shift, float interp_ratio); virtual float mu() const = 0; diff --git a/gr-filter/include/filter/freq_xlating_fir_filter_XXX.h.t b/gr-filter/include/filter/freq_xlating_fir_filter_XXX.h.t index 8764c4f0d..88e15f823 100644 --- a/gr-filter/include/filter/freq_xlating_fir_filter_XXX.h.t +++ b/gr-filter/include/filter/freq_xlating_fir_filter_XXX.h.t @@ -72,7 +72,7 @@ namespace gr { * \param center_freq Center frequency of signal to down convert from (Hz) * \param sampling_freq Sampling rate of signal (in Hz) */ - static FILTER_API sptr make(int decimation, + static sptr make(int decimation, const std::vector<@TAP_TYPE@> &taps, double center_freq, double sampling_freq); diff --git a/gr-filter/include/filter/hilbert_fc.h b/gr-filter/include/filter/hilbert_fc.h index d29f8a726..de7cd82b6 100644 --- a/gr-filter/include/filter/hilbert_fc.h +++ b/gr-filter/include/filter/hilbert_fc.h @@ -44,7 +44,7 @@ namespace gr { * imaginary output is hilbert filtered (90 degree phase shift) * version of input. */ - static FILTER_API sptr make(unsigned int ntaps); + static sptr make(unsigned int ntaps); }; } /* namespace filter */ diff --git a/gr-filter/include/filter/iir_filter_ffd.h b/gr-filter/include/filter/iir_filter_ffd.h index c23286ddc..04dd1e776 100644 --- a/gr-filter/include/filter/iir_filter_ffd.h +++ b/gr-filter/include/filter/iir_filter_ffd.h @@ -69,7 +69,7 @@ namespace gr { // gr::filter::iir_filter_ffd::sptr typedef boost::shared_ptr<iir_filter_ffd> sptr; - static FILTER_API sptr make(const std::vector<double> &fftaps, + static sptr make(const std::vector<double> &fftaps, const std::vector<double> &fbtaps); virtual void set_taps(const std::vector<double> &fftaps, diff --git a/gr-filter/include/filter/interp_fir_filter_XXX.h.t b/gr-filter/include/filter/interp_fir_filter_XXX.h.t index eaf215200..b66c9f643 100644 --- a/gr-filter/include/filter/interp_fir_filter_XXX.h.t +++ b/gr-filter/include/filter/interp_fir_filter_XXX.h.t @@ -68,7 +68,7 @@ namespace gr { * \param interpolation set the integer interpolation rate * \param taps a vector/list of taps of type @TAP_TYPE@ */ - static FILTER_API sptr make(unsigned interpolation, + static sptr make(unsigned interpolation, const std::vector<@TAP_TYPE@> &taps); virtual void set_taps(const std::vector<@TAP_TYPE@> &taps) = 0; diff --git a/gr-filter/include/filter/pfb_arb_resampler_ccf.h b/gr-filter/include/filter/pfb_arb_resampler_ccf.h index cf5fa4a3b..a154e055a 100644 --- a/gr-filter/include/filter/pfb_arb_resampler_ccf.h +++ b/gr-filter/include/filter/pfb_arb_resampler_ccf.h @@ -110,7 +110,7 @@ namespace gr { * related to quantization noise introduced during the resampling. * Defaults to 32 filters. */ - static FILTER_API sptr make(float rate, + static sptr make(float rate, const std::vector<float> &taps, unsigned int filter_size=32); /*! @@ -129,7 +129,20 @@ namespace gr { */ virtual void print_taps() = 0; + /*! + * Sets the resampling rate of the block. + */ virtual void set_rate (float rate) = 0; + + /*! + * Sets the current phase offset in radians (0 to 2pi). + */ + virtual void set_phase(float ph) = 0; + + /*! + * Gets the current phase of the resampler in radians (2 to 2pi). + */ + virtual float phase() const = 0; }; } /* namespace filter */ diff --git a/gr-filter/include/filter/pfb_arb_resampler_fff.h b/gr-filter/include/filter/pfb_arb_resampler_fff.h index 2504c92ec..38dcc7132 100644 --- a/gr-filter/include/filter/pfb_arb_resampler_fff.h +++ b/gr-filter/include/filter/pfb_arb_resampler_fff.h @@ -110,7 +110,7 @@ namespace gr { * related to quantization noise introduced during the resampling. * Defaults to 32 filters. */ - static FILTER_API sptr make(float rate, + static sptr make(float rate, const std::vector<float> &taps, unsigned int filter_size=32); @@ -130,7 +130,20 @@ namespace gr { */ virtual void print_taps() = 0; + /*! + * Sets the resampling rate of the block. + */ virtual void set_rate (float rate) = 0; + + /*! + * Sets the current phase offset in radians (0 to 2pi). + */ + virtual void set_phase(float ph) = 0; + + /*! + * Gets the current phase of the resampler in radians (2 to 2pi). + */ + virtual float phase() const = 0; }; } /* namespace filter */ diff --git a/gr-filter/include/filter/pfb_channelizer_ccf.h b/gr-filter/include/filter/pfb_channelizer_ccf.h index 7726809f2..2ff83b5e7 100644 --- a/gr-filter/include/filter/pfb_channelizer_ccf.h +++ b/gr-filter/include/filter/pfb_channelizer_ccf.h @@ -139,7 +139,7 @@ namespace gr { * oversample ratio is 6000 Hz, * or 6 times the normal 1000 Hz. */ - static FILTER_API sptr make(unsigned int numchans, + static sptr make(unsigned int numchans, const std::vector<float> &taps, float oversample_rate); diff --git a/gr-filter/include/filter/pfb_decimator_ccf.h b/gr-filter/include/filter/pfb_decimator_ccf.h index 9db11b88d..bf9d0d950 100644 --- a/gr-filter/include/filter/pfb_decimator_ccf.h +++ b/gr-filter/include/filter/pfb_decimator_ccf.h @@ -102,7 +102,7 @@ namespace gr { * \param taps (vector/list of floats) The prototype filter to populate the filterbank. * \param channel (unsigned integer) Selects the channel to return [default=0]. */ - static FILTER_API sptr make(unsigned int decim, + static sptr make(unsigned int decim, const std::vector<float> &taps, unsigned int channel); diff --git a/gr-filter/include/filter/pfb_interpolator_ccf.h b/gr-filter/include/filter/pfb_interpolator_ccf.h index a31ca7129..df28ab64d 100644 --- a/gr-filter/include/filter/pfb_interpolator_ccf.h +++ b/gr-filter/include/filter/pfb_interpolator_ccf.h @@ -91,7 +91,7 @@ namespace gr { * \param taps (vector/list of floats) The prototype filter to populate the filterbank. The taps * should be generated at the interpolated sampling rate. */ - static FILTER_API sptr make(unsigned int interp, + static sptr make(unsigned int interp, const std::vector<float> &taps); /*! diff --git a/gr-filter/include/filter/pfb_synthesizer_ccf.h b/gr-filter/include/filter/pfb_synthesizer_ccf.h index ec6fb49c2..faa16990c 100644 --- a/gr-filter/include/filter/pfb_synthesizer_ccf.h +++ b/gr-filter/include/filter/pfb_synthesizer_ccf.h @@ -54,7 +54,7 @@ namespace gr { * populate the filterbank. * \param twox (bool) use 2x oversampling or not (default is no) */ - static FILTER_API sptr make(unsigned int numchans, + static sptr make(unsigned int numchans, const std::vector<float> &taps, bool twox=false); diff --git a/gr-filter/include/filter/rational_resampler_base_XXX.h.t b/gr-filter/include/filter/rational_resampler_base_XXX.h.t index c37eb30a7..e47a16ec6 100644 --- a/gr-filter/include/filter/rational_resampler_base_XXX.h.t +++ b/gr-filter/include/filter/rational_resampler_base_XXX.h.t @@ -44,7 +44,7 @@ namespace gr { // gr::filter::@BASE_NAME@::sptr typedef boost::shared_ptr<@BASE_NAME@> sptr; - static FILTER_API sptr make(unsigned interpolation, + static sptr make(unsigned interpolation, unsigned decimation, const std::vector<@TAP_TYPE@> &taps); diff --git a/gr-filter/include/filter/single_pole_iir_filter_cc.h b/gr-filter/include/filter/single_pole_iir_filter_cc.h index 37db7c65f..82febe8ec 100644 --- a/gr-filter/include/filter/single_pole_iir_filter_cc.h +++ b/gr-filter/include/filter/single_pole_iir_filter_cc.h @@ -67,7 +67,7 @@ namespace gr { // gr::filter::single_pole_iir_filter_cc::sptr typedef boost::shared_ptr<single_pole_iir_filter_cc> sptr; - static FILTER_API sptr make(double alpha, unsigned int vlen=1); + static sptr make(double alpha, unsigned int vlen=1); virtual void set_taps(double alpha) = 0; }; diff --git a/gr-filter/include/filter/single_pole_iir_filter_ff.h b/gr-filter/include/filter/single_pole_iir_filter_ff.h index 8abce94c9..d85688db8 100644 --- a/gr-filter/include/filter/single_pole_iir_filter_ff.h +++ b/gr-filter/include/filter/single_pole_iir_filter_ff.h @@ -67,7 +67,7 @@ namespace gr { // gr::filter::single_pole_iir_filter_ff::sptr typedef boost::shared_ptr<single_pole_iir_filter_ff> sptr; - static FILTER_API sptr make(double alpha, unsigned int vlen=1); + static sptr make(double alpha, unsigned int vlen=1); virtual void set_taps (double alpha) = 0; }; diff --git a/gr-filter/lib/CMakeLists.txt b/gr-filter/lib/CMakeLists.txt index a54cd7b1d..73d7d7bae 100644 --- a/gr-filter/lib/CMakeLists.txt +++ b/gr-filter/lib/CMakeLists.txt @@ -98,6 +98,7 @@ include_directories( ${GR_FFT_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS} ${FFTW3F_INCLUDE_DIRS} + ${CPPUNIT_INCLUDE_DIRS} ) link_directories(${FFT_LIBRARY_DIRS}) @@ -142,9 +143,9 @@ list(APPEND filter_sources list(APPEND filter_libs gnuradio-core gnuradio-fft + volk ${Boost_LIBRARIES} ${FFTW3F_LIBRARIES} - ${VOLK_LIBRARIES} ) add_library(gnuradio-filter SHARED ${filter_sources}) diff --git a/gr-filter/lib/pfb_arb_resampler_ccf_impl.cc b/gr-filter/lib/pfb_arb_resampler_ccf_impl.cc index bb0906aa5..5480366de 100644 --- a/gr-filter/lib/pfb_arb_resampler_ccf_impl.cc +++ b/gr-filter/lib/pfb_arb_resampler_ccf_impl.cc @@ -78,10 +78,8 @@ namespace gr { } // Now, actually set the filters' taps - std::vector<float> dtaps; - create_diff_taps(taps, dtaps); - create_taps(taps, d_taps, d_filters); - create_taps(dtaps, d_dtaps, d_diff_filters); + set_taps(taps); + d_updated = false; } pfb_arb_resampler_ccf_impl::~pfb_arb_resampler_ccf_impl() @@ -122,11 +120,6 @@ namespace gr { // Build a filter for each channel and add it's taps to it ourfilter[i]->set_taps(ourtaps[d_int_rate-1-i]); } - - // Set the history to ensure enough input items for each filter - set_history (d_taps_per_filter + 1); - - d_updated = true; } void @@ -148,6 +141,13 @@ namespace gr { pfb_arb_resampler_ccf_impl::set_taps(const std::vector<float> &taps) { gruel::scoped_lock guard(d_mutex); + + std::vector<float> dtaps; + create_diff_taps(taps, dtaps); + create_taps(taps, d_taps, d_filters); + create_taps(dtaps, d_dtaps, d_diff_filters); + set_history(d_taps_per_filter + 1); + d_updated = true; } std::vector<std::vector<float> > @@ -172,17 +172,40 @@ namespace gr { void pfb_arb_resampler_ccf_impl::set_rate(float rate) { + gruel::scoped_lock guard(d_mutex); + d_dec_rate = (unsigned int)floor(d_int_rate/rate); d_flt_rate = (d_int_rate/rate) - d_dec_rate; set_relative_rate(rate); } + void + pfb_arb_resampler_ccf_impl::set_phase(float ph) + { + gruel::scoped_lock guard(d_mutex); + if((ph < 0) || (ph >= 2.0*M_PI)) { + throw std::runtime_error("pfb_arb_resampler_ccf: set_phase value out of bounds [0, 2pi).\n"); + } + + float ph_diff = 2.0*M_PI / (float)d_filters.size(); + d_last_filter = static_cast<int>(ph / ph_diff); + } + + float + pfb_arb_resampler_ccf_impl::phase() const + { + float ph_diff = 2.0*M_PI / static_cast<float>(d_filters.size()); + return d_last_filter * ph_diff; + } + int pfb_arb_resampler_ccf_impl::general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { + gruel::scoped_lock guard(d_mutex); + gr_complex *in = (gr_complex*)input_items[0]; gr_complex *out = (gr_complex*)output_items[0]; diff --git a/gr-filter/lib/pfb_arb_resampler_ccf_impl.h b/gr-filter/lib/pfb_arb_resampler_ccf_impl.h index 8e7e993cb..891e601e0 100644 --- a/gr-filter/lib/pfb_arb_resampler_ccf_impl.h +++ b/gr-filter/lib/pfb_arb_resampler_ccf_impl.h @@ -74,6 +74,9 @@ namespace gr { void print_taps(); void set_rate(float rate); + void set_phase(float ph); + float phase() const; + int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, diff --git a/gr-filter/lib/pfb_arb_resampler_fff_impl.cc b/gr-filter/lib/pfb_arb_resampler_fff_impl.cc index 79c19655a..6aff374fd 100644 --- a/gr-filter/lib/pfb_arb_resampler_fff_impl.cc +++ b/gr-filter/lib/pfb_arb_resampler_fff_impl.cc @@ -172,11 +172,32 @@ namespace gr { void pfb_arb_resampler_fff_impl::set_rate(float rate) { + gruel::scoped_lock guard(d_mutex); + d_dec_rate = (unsigned int)floor(d_int_rate/rate); d_flt_rate = (d_int_rate/rate) - d_dec_rate; set_relative_rate(rate); } + void + pfb_arb_resampler_fff_impl::set_phase(float ph) + { + gruel::scoped_lock guard(d_mutex); + if((ph < 0) || (ph >= 2.0*M_PI)) { + throw std::runtime_error("pfb_arb_resampler_ccf: set_phase value out of bounds [0, 2pi).\n"); + } + + float ph_diff = 2.0*M_PI / (float)d_filters.size(); + d_last_filter = static_cast<int>(ph / ph_diff); + } + + float + pfb_arb_resampler_fff_impl::phase() const + { + float ph_diff = 2.0*M_PI / static_cast<float>(d_filters.size()); + return d_last_filter * ph_diff; + } + int pfb_arb_resampler_fff_impl::general_work(int noutput_items, gr_vector_int &ninput_items, diff --git a/gr-filter/lib/pfb_arb_resampler_fff_impl.h b/gr-filter/lib/pfb_arb_resampler_fff_impl.h index 54e01375a..588962711 100644 --- a/gr-filter/lib/pfb_arb_resampler_fff_impl.h +++ b/gr-filter/lib/pfb_arb_resampler_fff_impl.h @@ -73,6 +73,9 @@ namespace gr { void print_taps(); void set_rate(float rate); + void set_phase(float ph); + float phase() const; + int general_work(int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, diff --git a/gr-filter/lib/qa_mmse_fir_interpolator_cc.cc b/gr-filter/lib/qa_mmse_fir_interpolator_cc.cc index 5850cb86c..02e0b32fe 100644 --- a/gr-filter/lib/qa_mmse_fir_interpolator_cc.cc +++ b/gr-filter/lib/qa_mmse_fir_interpolator_cc.cc @@ -30,6 +30,7 @@ #include <cstdio> #include <cmath> #include <stdexcept> +#include <stdint.h> namespace gr { namespace filter { diff --git a/gr-filter/python/qa_fft_filter.py b/gr-filter/python/qa_fft_filter.py index eaef3156d..cb5416373 100755 --- a/gr-filter/python/qa_fft_filter.py +++ b/gr-filter/python/qa_fft_filter.py @@ -28,14 +28,14 @@ import random def make_random_complex_tuple(L): result = [] for x in range(L): - result.append(complex(random.uniform(-1000,1000), - random.uniform(-1000,1000))) + result.append(complex(2*random.random()-1, + 2*random.random()-1)) return tuple(result) def make_random_float_tuple(L): result = [] for x in range(L): - result.append(float(int(random.uniform(-1000,1000)))) + result.append(float(int(2*random.random()-1))) return tuple(result) diff --git a/gr-filter/python/qa_pfb_channelizer.py b/gr-filter/python/qa_pfb_channelizer.py index 33d2b2188..3d35c46e4 100755 --- a/gr-filter/python/qa_pfb_channelizer.py +++ b/gr-filter/python/qa_pfb_channelizer.py @@ -94,11 +94,11 @@ class test_pfb_channelizer(gr_unittest.TestCase): dst3_data = snks[3].data() dst4_data = snks[4].data() - self.assertComplexTuplesAlmostEqual(expected0_data[-Ntest:], dst0_data[-Ntest:], 4) - self.assertComplexTuplesAlmostEqual(expected1_data[-Ntest:], dst1_data[-Ntest:], 4) - self.assertComplexTuplesAlmostEqual(expected2_data[-Ntest:], dst2_data[-Ntest:], 4) - self.assertComplexTuplesAlmostEqual(expected3_data[-Ntest:], dst3_data[-Ntest:], 4) - self.assertComplexTuplesAlmostEqual(expected4_data[-Ntest:], dst4_data[-Ntest:], 4) + self.assertComplexTuplesAlmostEqual(expected0_data[-Ntest:], dst0_data[-Ntest:], 3) + self.assertComplexTuplesAlmostEqual(expected1_data[-Ntest:], dst1_data[-Ntest:], 3) + self.assertComplexTuplesAlmostEqual(expected2_data[-Ntest:], dst2_data[-Ntest:], 3) + self.assertComplexTuplesAlmostEqual(expected3_data[-Ntest:], dst3_data[-Ntest:], 3) + self.assertComplexTuplesAlmostEqual(expected4_data[-Ntest:], dst4_data[-Ntest:], 3) if __name__ == '__main__': gr_unittest.run(test_pfb_channelizer, "test_pfb_channelizer.xml") diff --git a/gruel/src/include/gruel/CMakeLists.txt b/gruel/src/include/gruel/CMakeLists.txt index 9818f1c09..d4c36eddb 100644 --- a/gruel/src/include/gruel/CMakeLists.txt +++ b/gruel/src/include/gruel/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2010-2011 Free Software Foundation, Inc. +# Copyright 2010-2012 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -18,30 +18,12 @@ # Boston, MA 02110-1301, USA. ######################################################################## -# Generate inet.h header file -######################################################################## -include(TestBigEndian) -enable_language(C) -TEST_BIG_ENDIAN(GR_ARCH_BIGENDIAN) - -include(CheckIncludeFileCXX) -CHECK_INCLUDE_FILE_CXX(byteswap.h GR_HAVE_BYTESWAP) -CHECK_INCLUDE_FILE_CXX(arpa/inet.h GR_HAVE_ARPA_INET) -CHECK_INCLUDE_FILE_CXX(netinet/in.h GR_HAVE_NETINET_IN) - -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/inet.h.in - ${CMAKE_CURRENT_BINARY_DIR}/inet.h -@ONLY) - -######################################################################## # Install the headers ######################################################################## install(FILES api.h attributes.h high_res_timer.h - ${CMAKE_CURRENT_BINARY_DIR}/inet.h msg_accepter.h msg_accepter_msgq.h msg_queue.h diff --git a/gruel/src/include/gruel/inet.h.in b/gruel/src/include/gruel/inet.h.in deleted file mode 100644 index 74f14bd92..000000000 --- a/gruel/src/include/gruel/inet.h.in +++ /dev/null @@ -1,100 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2008, 2009 Free Software Foundation, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef INCLUDED_INET_H -#define INCLUDED_INET_H - -#include <gruel/api.h> -#include <stdint.h> - -#if 1 /* missing htonll or ntohll */ -#if @GR_ARCH_BIGENDIAN@ /* GR_ARCH_BIGENDIAN */ -// Nothing to do... -static inline uint64_t htonll(uint64_t x){ return x;} -static inline uint64_t ntohll(uint64_t x){ return x;} -#else -#if @GR_HAVE_BYTESWAP@ /* GR_HAVE_BYTESWAP */ -#include <byteswap.h> -#else - -static inline uint64_t -bswap_64(uint64_t x) -{ - return ((x & 0x00000000000000ffull) << 56) | ((x & 0x000000000000ff00ull) << 40) | - ((x & 0x0000000000ff0000ull) << 24) | ((x & 0x00000000ff000000ull) << 8) | - ((x & 0x000000ff00000000ull) >> 8) | ((x & 0x0000ff0000000000ull) >> 24) | - ((x & 0x00ff000000000000ull) >> 40) | ((x & 0xff00000000000000ull) >> 56); -} - -#endif /* GR_HAVE_BYTESWAP */ - -static inline uint64_t htonll(uint64_t x){ return bswap_64(x);} -static inline uint64_t ntohll(uint64_t x){ return bswap_64(x);} - -#endif /* GR_ARCH_BIGENDIAN */ -#endif /* missing htonll or ntohll */ - -#if @GR_HAVE_ARPA_INET@ /* GR_HAVE_ARPA_INET */ -#include <arpa/inet.h> -#elif @GR_HAVE_NETINET_IN@ /* GR_HAVE_NETINET_IN */ -#include <netinet/in.h> -#else -#include <stdint.h> - -#if @GR_ARCH_BIGENDIAN@ /* GR_ARCH_BIGENDIAN */ -// Nothing to do... -static inline uint32_t htonl(uint32_t x){ return x; } -static inline uint16_t htons(uint16_t x){ return x; } -static inline uint32_t ntohl(uint32_t x){ return x; } -static inline uint16_t ntohs(uint16_t x){ return x; } -#else -#if @GR_HAVE_BYTESWAP@ /* GR_HAVE_BYTESWAP */ -#include <byteswap.h> -#else -static inline uint16_t -bswap_16 (uint16_t x) -{ - return ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)); -} - -static inline uint32_t -bswap_32 (uint32_t x) -{ - return ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) \ - | (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)); -} -#endif /* GR_HAVE_BYTESWAP */ - -static inline uint32_t htonl(uint32_t x){ return bswap_32(x); } -static inline uint16_t htons(uint16_t x){ return bswap_16(x); } -static inline uint32_t ntohl(uint32_t x){ return bswap_32(x); } -static inline uint16_t ntohs(uint16_t x){ return bswap_16(x); } -#endif /* GR_ARCH_BIGENDIAN */ - -#endif /* !(GR_HAVE_NETINET_IN || GR_HAVE_ARPA_INET) */ - -static inline uint8_t ntohx(uint8_t x){ return x; } -static inline uint16_t ntohx(uint16_t x){ return ntohs(x); } -static inline uint32_t ntohx(uint32_t x){ return ntohl(x); } -static inline uint64_t ntohx(uint64_t x){ return ntohll(x);} -static inline uint8_t htonx(uint8_t x){ return x; } -static inline uint16_t htonx(uint16_t x){ return htons(x); } -static inline uint32_t htonx(uint32_t x){ return htonl(x); } -static inline uint64_t htonx(uint64_t x){ return htonll(x);} - -#endif /* INCLUDED_INET_H */ diff --git a/gruel/src/lib/pmt/pmt-serial-tags.scm b/gruel/src/lib/pmt/pmt-serial-tags.scm index a78d87681..4f06bf75f 100644 --- a/gruel/src/lib/pmt/pmt-serial-tags.scm +++ b/gruel/src/lib/pmt/pmt-serial-tags.scm @@ -34,6 +34,7 @@ (define pst-uniform-vector #x0a) (define pst-uint64 #x0b) +(define pst-tuple #x0c) ;; u8, s8, u16, s16, u32, s32, u64, s64, f32, f64, c32, c64 ;; diff --git a/gruel/src/lib/pmt/pmt_serialize.cc b/gruel/src/lib/pmt/pmt_serialize.cc index 05140bb42..a19809a66 100644 --- a/gruel/src/lib/pmt/pmt_serialize.cc +++ b/gruel/src/lib/pmt/pmt_serialize.cc @@ -213,6 +213,24 @@ deserialize_untagged_f64(double *ip, std::streambuf &sb) return t != std::streambuf::traits_type::eof(); } +static bool +deserialize_tuple(pmt_t *tuple, std::streambuf &sb) +{ + uint32_t nitems; + bool ok = deserialize_untagged_u32(&nitems, sb); + pmt_t list(PMT_NIL); + for(uint32_t i=0; i<nitems; i++){ + pmt_t item = pmt_deserialize( sb ); + if(pmt_eq(list, PMT_NIL)){ + list = pmt_list1(item); + } else { + list = pmt_list_add(list, item); + } + } + (*tuple) = pmt_to_tuple(list); + return ok; +} + /* * Write portable byte-serial representation of \p obj to \p sb @@ -300,6 +318,16 @@ pmt_serialize(pmt_t obj, std::streambuf &sb) if (pmt_is_dict(obj)) throw pmt_notimplemented("pmt_serialize (dict)", obj); + if (pmt_is_tuple(obj)){ + size_t tuple_len = pmt::pmt_length(obj); + ok = serialize_untagged_u8(PST_TUPLE, sb); + ok &= serialize_untagged_u32(tuple_len, sb); + for(size_t i=0; i<tuple_len; i++){ + ok &= pmt_serialize(pmt_tuple_ref(obj, i), sb); + } + return ok; + } + //throw pmt_notimplemented("pmt_serialize (tuple)", obj); throw pmt_notimplemented("pmt_serialize (?)", obj); } @@ -369,6 +397,15 @@ pmt_deserialize(std::streambuf &sb) goto error; return pmt_make_rectangular( r,i ); } + + case PST_TUPLE: + { + pmt_t tuple; + if(!deserialize_tuple(&tuple, sb)){ + goto error; + } + return tuple; + } case PST_VECTOR: case PST_DICT: diff --git a/gruel/src/swig/CMakeLists.txt b/gruel/src/swig/CMakeLists.txt index f9d1758ec..a0f84c832 100644 --- a/gruel/src/swig/CMakeLists.txt +++ b/gruel/src/swig/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2011 Free Software Foundation, Inc. +# Copyright 2011-2012 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -23,7 +23,7 @@ include(GrPython) include(GrSwig) -set(GR_SWIG_INCLUDE_DIRS ${GRUEL_INCLUDE_DIRS}) +set(GR_SWIG_INCLUDE_DIRS ${GRUEL_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR}) set(GR_SWIG_LIBRARIES gruel) set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/pmt_swig_doc.i) diff --git a/volk/include/volk/volk_32f_x2_dot_prod_32f_a.h b/volk/include/volk/volk_32f_x2_dot_prod_32f_a.h index c26fd5e7c..067c33ad8 100644 --- a/volk/include/volk/volk_32f_x2_dot_prod_32f_a.h +++ b/volk/include/volk/volk_32f_x2_dot_prod_32f_a.h @@ -226,6 +226,8 @@ static inline void volk_32f_x2_dot_prod_32f_a_sse4_1(float * result, const float #ifdef LV_HAVE_AVX +#include <immintrin.h> + static inline void volk_32f_x2_dot_prod_32f_a_avx( float* result, const float* input, const float* taps, unsigned int num_points) { unsigned int number = 0; diff --git a/volk/include/volk/volk_32f_x2_dot_prod_32f_u.h b/volk/include/volk/volk_32f_x2_dot_prod_32f_u.h index f9ae15094..ab33a2587 100644 --- a/volk/include/volk/volk_32f_x2_dot_prod_32f_u.h +++ b/volk/include/volk/volk_32f_x2_dot_prod_32f_u.h @@ -229,6 +229,8 @@ static inline void volk_32f_x2_dot_prod_32f_u_sse4_1(float * result, const float #ifdef LV_HAVE_AVX +#include <immintrin.h> + static inline void volk_32f_x2_dot_prod_32f_u_avx( float* result, const float* input, const float* taps, unsigned int num_points) { unsigned int number = 0; |