aboutsummaryrefslogtreecommitdiffstats
path: root/utils/gmr_multi_rx/filter_helpers.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'utils/gmr_multi_rx/filter_helpers.hpp')
-rw-r--r--utils/gmr_multi_rx/filter_helpers.hpp138
1 files changed, 0 insertions, 138 deletions
diff --git a/utils/gmr_multi_rx/filter_helpers.hpp b/utils/gmr_multi_rx/filter_helpers.hpp
deleted file mode 100644
index e0d613c..0000000
--- a/utils/gmr_multi_rx/filter_helpers.hpp
+++ /dev/null
@@ -1,138 +0,0 @@
-/* Conversion of Python routines from Sylvain Munaut <tnt@246tNt.com>
- * (C) 2011 by Dimitri Stolnikov <horiz0n@gmx.net>
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero 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 Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef FILTER_HELPERS_HPP
-#define FILTER_HELPERS_HPP
-
-#include <boost/math/common_factor.hpp> // gcd
-#include <cmath> // ceil, floor
-
-int gcd( int n, int d )
-{
- return boost::math::gcd( n, d );
-}
-
-void reduce_fract( int & n_out, int & d_out, int n_in, int d_in )
-{
- int g = gcd( n_in, d_in );
-
- n_out = n_in / g;
- d_out = d_in / g;
-}
-
-bool find_decim( int & hw_decim, int & sw_decim, int & ai, int d, int max_decim )
-{
- int x = max_decim;
-
- while ( x >= 4 )
- {
- if ( d % x == 0 )
- {
- // If it's odd, the usrp can't do it. But maybe we can decimate twice
- // as much and then interpolate more in sw
- if ( x % 2 == 1 )
- {
- if ( x * 2 > max_decim )
- {
- x--;
- continue;
- }
-
- hw_decim = 2 * x;
- sw_decim = d / x;
- ai = 2;
- return true;
- }
- else
- {
- hw_decim = x;
- sw_decim = d / x;
- ai = 1;
- return true;
- }
- }
-
- x--;
- }
-
- hw_decim = 0;
- sw_decim = 0;
- ai = 1;
-
- return false;
-}
-
-void find_split( int & first_decim, int & second_decim, int decim, int inter)
-{
- int mx = decim / (inter * 2);
- first_decim = 1;
-
- for ( int x = 2; x < mx + 1; x++ )
- {
- if (decim % x == 0)
- first_decim = x;
- }
-
- second_decim = decim / first_decim;
-}
-
-void compute_filter_params( int & hw_decim,
- int & s1_decim,
- int & s2_decim,
- int & s2_inter,
- int req_bw,
- int fpga_freq,
- int symbol_rate,
- int osr )
-{
- // Required samplerate
- int req_symrate = int(std::ceil(req_bw / symbol_rate)) * symbol_rate;
- if ( req_symrate < osr * symbol_rate )
- req_symrate = osr * symbol_rate;
-
- // Find the total decim / inter ratio for 1 channel
- int tot_inter, tot_decim;
- reduce_fract( tot_inter, tot_decim, osr * symbol_rate, fpga_freq);
-
- // Need to split the decimation between USRP and SW
- // (but we need _at_ least req_symrate out of the USRP)
- int max_decim = int(std::floor(fpga_freq / req_symrate));
- if ( max_decim > 256 )
- max_decim = 256;
-
- int sw_decim, ai;
- find_decim( hw_decim, sw_decim, ai, tot_decim, max_decim );
-
- if ( hw_decim == 0 )
- {
- // No good solution found ... so settle for a bad one
- hw_decim = max_decim;
- reduce_fract( tot_inter, sw_decim, tot_inter * hw_decim, tot_decim );
- }
- else
- {
- tot_inter *= ai;
- }
-
- s2_inter = tot_inter;
-
- // Split the sw decim in 2 stage
- find_split( s1_decim, s2_decim, sw_decim, tot_inter );
-}
-
-#endif // FILTER_HELPERS_HPP