<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.16.1" xml:lang="en-US">
  <compounddef id="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank" kind="class" language="C++" prot="public">
    <compoundname>gr::filter::kernel::polyphase_filterbank</compoundname>
    <includes refid="polyphase__filterbank_8h" local="no">gnuradio/filter/polyphase_filterbank.h</includes>
    <sectiondef kind="protected-attrib">
      <memberdef kind="variable" id="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1a7d74ff39379214e92ffb373ced1d8caf" prot="protected" static="no" mutable="no">
        <type>unsigned int</type>
        <definition>unsigned int gr::filter::kernel::polyphase_filterbank::d_nfilts</definition>
        <argsstring></argsstring>
        <name>d_nfilts</name>
        <qualifiedname>gr::filter::kernel::polyphase_filterbank::d_nfilts</qualifiedname>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" line="92" column="18" bodyfile="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" bodystart="92" bodyend="-1"/>
      </memberdef>
      <memberdef kind="variable" id="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1a73b35d72585909f5664f8902e83fdf76" prot="protected" static="no" mutable="no">
        <type>std::vector&lt; <ref refid="namespacegr_1_1filter_1_1kernel_1a1262ff76f6ac8db1310e3eff81cb51c1" kindref="member">kernel::fir_filter_ccf</ref> &gt;</type>
        <definition>std::vector&lt;kernel::fir_filter_ccf&gt; gr::filter::kernel::polyphase_filterbank::d_fir_filters</definition>
        <argsstring></argsstring>
        <name>d_fir_filters</name>
        <qualifiedname>gr::filter::kernel::polyphase_filterbank::d_fir_filters</qualifiedname>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" line="93" column="17" bodyfile="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" bodystart="93" bodyend="-1"/>
      </memberdef>
      <memberdef kind="variable" id="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1afe77f5c643b3453d0f9a694e18588d6e" prot="protected" static="no" mutable="no">
        <type>std::vector&lt; <ref refid="classgr_1_1filter_1_1kernel_1_1fft__filter__ccf" kindref="compound">kernel::fft_filter_ccf</ref> &gt;</type>
        <definition>std::vector&lt;kernel::fft_filter_ccf&gt; gr::filter::kernel::polyphase_filterbank::d_fft_filters</definition>
        <argsstring></argsstring>
        <name>d_fft_filters</name>
        <qualifiedname>gr::filter::kernel::polyphase_filterbank::d_fft_filters</qualifiedname>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" line="94" column="17" bodyfile="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" bodystart="94" bodyend="-1"/>
      </memberdef>
      <memberdef kind="variable" id="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1ae6fd788b84e04219deb880c8b427e9ad" prot="protected" static="no" mutable="no">
        <type>std::vector&lt; std::vector&lt; float &gt; &gt;</type>
        <definition>std::vector&lt;std::vector&lt;float&gt; &gt; gr::filter::kernel::polyphase_filterbank::d_taps</definition>
        <argsstring></argsstring>
        <name>d_taps</name>
        <qualifiedname>gr::filter::kernel::polyphase_filterbank::d_taps</qualifiedname>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" line="95" column="17" bodyfile="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" bodystart="95" bodyend="-1"/>
      </memberdef>
      <memberdef kind="variable" id="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1afd7549b40f5a8174320c418c2413279f" prot="protected" static="no" mutable="no">
        <type>unsigned int</type>
        <definition>unsigned int gr::filter::kernel::polyphase_filterbank::d_taps_per_filter</definition>
        <argsstring></argsstring>
        <name>d_taps_per_filter</name>
        <qualifiedname>gr::filter::kernel::polyphase_filterbank::d_taps_per_filter</qualifiedname>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" line="96" column="18" bodyfile="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" bodystart="96" bodyend="-1"/>
      </memberdef>
      <memberdef kind="variable" id="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1a4c32a093601dc405d7066f993b5aa7bd" prot="protected" static="no" mutable="no">
        <type><ref refid="namespacegr_1_1fft_1a7e779fa5016644765e5f7c0ab1b2136b" kindref="member">fft::fft_complex_rev</ref></type>
        <definition>fft::fft_complex_rev gr::filter::kernel::polyphase_filterbank::d_fft</definition>
        <argsstring></argsstring>
        <name>d_fft</name>
        <qualifiedname>gr::filter::kernel::polyphase_filterbank::d_fft</qualifiedname>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" line="99" column="26" bodyfile="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" bodystart="99" bodyend="-1"/>
      </memberdef>
    </sectiondef>
    <sectiondef kind="public-func">
      <memberdef kind="function" id="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1ad8798afe12cfbc3d3f88ad97d5fd0f7f" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
        <type></type>
        <definition>gr::filter::kernel::polyphase_filterbank::polyphase_filterbank</definition>
        <argsstring>(unsigned int nfilts, const std::vector&lt; float &gt; &amp;taps)</argsstring>
        <name>polyphase_filterbank</name>
        <qualifiedname>gr::filter::kernel::polyphase_filterbank::polyphase_filterbank</qualifiedname>
        <param>
          <type>unsigned int</type>
          <declname>nfilts</declname>
        </param>
        <param>
          <type>const std::vector&lt; float &gt; &amp;</type>
          <declname>taps</declname>
        </param>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
<para>Build the polyphase filterbank decimator. <parameterlist kind="param"><parameteritem>
<parameternamelist>
<parametername>nfilts</parametername>
</parameternamelist>
<parameterdescription>
<para>(unsigned integer) Specifies the number of channels <emphasis>M</emphasis> </para>
</parameterdescription>
</parameteritem>
<parameteritem>
<parameternamelist>
<parametername><ref refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1ae8125eeff0e31ddf0ada8e57e18f3eee" kindref="member">taps</ref></parametername>
</parameternamelist>
<parameterdescription>
<para>(vector/list of floats) The prototype filter to populate the filterbank. </para>
</parameterdescription>
</parameteritem>
</parameterlist>
</para>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" line="109" column="5"/>
        <references refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1ae8125eeff0e31ddf0ada8e57e18f3eee">taps</references>
      </memberdef>
      <memberdef kind="function" id="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1a119975fd25ca5995928b3c1d5c02f832" prot="public" static="no" const="no" explicit="no" inline="no" virt="virtual">
        <type></type>
        <definition>virtual gr::filter::kernel::polyphase_filterbank::~polyphase_filterbank</definition>
        <argsstring>()=default</argsstring>
        <name>~polyphase_filterbank</name>
        <qualifiedname>gr::filter::kernel::polyphase_filterbank::~polyphase_filterbank</qualifiedname>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" line="111" column="13"/>
      </memberdef>
      <memberdef kind="function" id="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1a3e4ffc4c8892b33bc6cd54c5d3490fd1" prot="public" static="no" const="no" explicit="no" inline="no" virt="virtual">
        <type>void</type>
        <definition>virtual void gr::filter::kernel::polyphase_filterbank::set_taps</definition>
        <argsstring>(const std::vector&lt; float &gt; &amp;taps)</argsstring>
        <name>set_taps</name>
        <qualifiedname>gr::filter::kernel::polyphase_filterbank::set_taps</qualifiedname>
        <param>
          <type>const std::vector&lt; float &gt; &amp;</type>
          <declname>taps</declname>
        </param>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
<para>Update the filterbank&apos;s filter taps from a prototype filter.</para>
<para><parameterlist kind="param"><parameteritem>
<parameternamelist>
<parametername><ref refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1ae8125eeff0e31ddf0ada8e57e18f3eee" kindref="member">taps</ref></parametername>
</parameternamelist>
<parameterdescription>
<para>(vector/list of floats) The prototype filter to populate the filterbank. </para>
</parameterdescription>
</parameteritem>
</parameterlist>
</para>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" line="120" column="18"/>
        <references refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1ae8125eeff0e31ddf0ada8e57e18f3eee">taps</references>
      </memberdef>
      <memberdef kind="function" id="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1abe0715ff530f696f131a4c6340d77f9b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
        <type>void</type>
        <definition>void gr::filter::kernel::polyphase_filterbank::print_taps</definition>
        <argsstring>()</argsstring>
        <name>print_taps</name>
        <qualifiedname>gr::filter::kernel::polyphase_filterbank::print_taps</qualifiedname>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
<para>Print all of the filterbank taps to screen. </para>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" line="125" column="10"/>
      </memberdef>
      <memberdef kind="function" id="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1ae8125eeff0e31ddf0ada8e57e18f3eee" prot="public" static="no" const="yes" explicit="no" inline="no" virt="non-virtual">
        <type>std::vector&lt; std::vector&lt; float &gt; &gt;</type>
        <definition>std::vector&lt; std::vector&lt; float &gt; &gt; gr::filter::kernel::polyphase_filterbank::taps</definition>
        <argsstring>() const</argsstring>
        <name>taps</name>
        <qualifiedname>gr::filter::kernel::polyphase_filterbank::taps</qualifiedname>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
<para>Return a vector&lt;vector&lt;&gt;&gt; of the filterbank taps </para>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" line="130" column="17"/>
        <referencedby refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1ad8798afe12cfbc3d3f88ad97d5fd0f7f">polyphase_filterbank</referencedby>
        <referencedby refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1a3e4ffc4c8892b33bc6cd54c5d3490fd1">set_taps</referencedby>
      </memberdef>
    </sectiondef>
    <briefdescription>
<para>Polyphase filterbank parent class. </para>
    </briefdescription>
    <detaileddescription>
<para>This block takes in complex inputs and channelizes it to <emphasis>M</emphasis> channels of equal bandwidth. Each of the resulting channels is decimated to the new rate that is the input sampling rate <emphasis>fs</emphasis> divided by the number of channels, <emphasis>M</emphasis>.</para>
<para>The PFB channelizer code takes the taps generated above and builds a set of filters. The set contains <emphasis>M</emphasis> filters and each filter contains ceil(taps.size()/decim) taps. Each tap from the filter prototype is sequentially inserted into the next filter. When all of the input taps are used, the remaining filters in the filterbank are filled out with 0&apos;s to make sure each filter has the same number of taps.</para>
<para>Each filter operates using the gr::filter::fir_filter_XXX class of GNU Radio, which takes the input stream at <emphasis>i</emphasis> and performs the inner product calculation to <emphasis>i+(n-1)</emphasis> where <emphasis>n</emphasis> is the number of filter taps. To efficiently handle this in the GNU Radio structure, each filter input must come from its own input stream. So the channelizer must be provided with <emphasis>M</emphasis> streams where the input stream has been deinterleaved. This is most easily done using the <ref refid="classgr_1_1blocks_1_1stream__to__streams" kindref="compound">gr::blocks::stream_to_streams</ref> block.</para>
<para>The output is then produced as a vector, where index <emphasis>i</emphasis> in the vector is the next sample from the <emphasis>i</emphasis>th channel. This is most easily handled by sending the output to a <ref refid="classgr_1_1blocks_1_1vector__to__streams" kindref="compound">gr::blocks::vector_to_streams</ref> block to handle the conversion and passing <emphasis>M</emphasis> streams out.</para>
<para>The input and output formatting is done using a <ref refid="classgr_1_1hier__block2" kindref="compound">hier_block2</ref> called <ref refid="classgr_1_1filter_1_1pfb__channelizer__ccf" kindref="compound">pfb_channelizer_ccf</ref>. This can take in a single stream and outputs <emphasis>M</emphasis> streams based on the behavior described above.</para>
<para>The filter&apos;s taps should be based on the input sampling rate.</para>
<para>For example, using the GNU Radio&apos;s firdes utility to building filters, we build a low-pass filter with a sampling rate of <emphasis>fs</emphasis>, a 3-dB bandwidth of <emphasis>BW</emphasis> and a transition bandwidth of <emphasis>TB</emphasis>. We can also specify the out-of-band attenuation to use, <emphasis>ATT</emphasis>, and the filter window function (a Blackman-harris window in this case). The first input is the gain of the filter, which we specify here as unity.</para>
<para><bold><emphasis>self._taps = <ref refid="classgr_1_1filter_1_1firdes_1ac025e225bf4ed55262bb5252ae110796" kindref="member">filter.firdes.low_pass_2</ref>(1, fs, BW, TB, attenuation_dB=ATT, window=<ref refid="classgr_1_1fft_1_1window_1a599d7e9625d6cc77203a8b877c4911e2a232b339a4e4796ceb3a38725f9d2015f" kindref="member">fft.window.WIN_BLACKMAN_hARRIS</ref>)</emphasis></bold></para>
<para>More on the theory of polyphase filterbanks can be found in the following book:</para>
<para><bold><emphasis>f. harris, &quot;Multirate Signal Processing for
      Communication Systems,&quot; Upper Saddle River, NJ: Prentice Hall, Inc. 2004.</emphasis></bold> </para>
    </detaileddescription>
    <collaborationgraph>
      <node id="5">
        <label>gr::filter::kernel::fft_filter_ccf</label>
        <link refid="classgr_1_1filter_1_1kernel_1_1fft__filter__ccf"/>
      </node>
      <node id="3">
        <label>gr::filter::kernel::fir_filter&lt; gr_complex, gr_complex, float &gt;</label>
        <link refid="classgr_1_1filter_1_1kernel_1_1fir__filter"/>
      </node>
      <node id="1">
        <label>gr::filter::kernel::polyphase_filterbank</label>
        <link refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank"/>
        <childnode refid="2" relation="usage">
          <edgelabel>d_fir_filters</edgelabel>
        </childnode>
        <childnode refid="4" relation="usage">
          <edgelabel>d_fft_filters</edgelabel>
        </childnode>
        <childnode refid="6" relation="usage">
          <edgelabel>d_taps</edgelabel>
        </childnode>
      </node>
      <node id="7">
        <label>std::vector&lt; float &gt;</label>
      </node>
      <node id="4">
        <label>std::vector&lt; gr::filter::kernel::fft_filter_ccf &gt;</label>
        <childnode refid="5" relation="usage">
          <edgelabel>elements</edgelabel>
          <edgelabel>p</edgelabel>
        </childnode>
      </node>
      <node id="2">
        <label>std::vector&lt; gr::filter::kernel::fir_filter&lt; gr_complex, gr_complex, float &gt; &gt;</label>
        <childnode refid="3" relation="usage">
          <edgelabel>elements</edgelabel>
          <edgelabel>p</edgelabel>
        </childnode>
      </node>
      <node id="6">
        <label>std::vector&lt; std::vector&lt; float &gt; &gt;</label>
        <childnode refid="7" relation="usage">
          <edgelabel>elements</edgelabel>
          <edgelabel>p</edgelabel>
        </childnode>
      </node>
    </collaborationgraph>
    <location file="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" line="89" column="1" bodyfile="gr-filter/include/gnuradio/filter/polyphase_filterbank.h" bodystart="90" bodyend="131"/>
    <listofallmembers>
      <member refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1a4c32a093601dc405d7066f993b5aa7bd" prot="protected" virt="non-virtual"><scope>gr::filter::kernel::polyphase_filterbank</scope><name>d_fft</name></member>
      <member refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1afe77f5c643b3453d0f9a694e18588d6e" prot="protected" virt="non-virtual"><scope>gr::filter::kernel::polyphase_filterbank</scope><name>d_fft_filters</name></member>
      <member refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1a73b35d72585909f5664f8902e83fdf76" prot="protected" virt="non-virtual"><scope>gr::filter::kernel::polyphase_filterbank</scope><name>d_fir_filters</name></member>
      <member refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1a7d74ff39379214e92ffb373ced1d8caf" prot="protected" virt="non-virtual"><scope>gr::filter::kernel::polyphase_filterbank</scope><name>d_nfilts</name></member>
      <member refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1ae6fd788b84e04219deb880c8b427e9ad" prot="protected" virt="non-virtual"><scope>gr::filter::kernel::polyphase_filterbank</scope><name>d_taps</name></member>
      <member refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1afd7549b40f5a8174320c418c2413279f" prot="protected" virt="non-virtual"><scope>gr::filter::kernel::polyphase_filterbank</scope><name>d_taps_per_filter</name></member>
      <member refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1ad8798afe12cfbc3d3f88ad97d5fd0f7f" prot="public" virt="non-virtual"><scope>gr::filter::kernel::polyphase_filterbank</scope><name>polyphase_filterbank</name></member>
      <member refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1abe0715ff530f696f131a4c6340d77f9b" prot="public" virt="non-virtual"><scope>gr::filter::kernel::polyphase_filterbank</scope><name>print_taps</name></member>
      <member refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1a3e4ffc4c8892b33bc6cd54c5d3490fd1" prot="public" virt="virtual"><scope>gr::filter::kernel::polyphase_filterbank</scope><name>set_taps</name></member>
      <member refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1ae8125eeff0e31ddf0ada8e57e18f3eee" prot="public" virt="non-virtual"><scope>gr::filter::kernel::polyphase_filterbank</scope><name>taps</name></member>
      <member refid="classgr_1_1filter_1_1kernel_1_1polyphase__filterbank_1a119975fd25ca5995928b3c1d5c02f832" prot="public" virt="virtual"><scope>gr::filter::kernel::polyphase_filterbank</scope><name>~polyphase_filterbank</name></member>
    </listofallmembers>
  </compounddef>
</doxygen>
