mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 13:11:20 -05:00 
			
		
		
		
	WDSP: separate SNBA and BPSNBA
This commit is contained in:
		
							parent
							
								
									fadffc1afc
								
							
						
					
					
						commit
						a229c583ee
					
				@ -32,7 +32,7 @@
 | 
				
			|||||||
#include "wcpAGC.hpp"
 | 
					#include "wcpAGC.hpp"
 | 
				
			||||||
#include "anr.hpp"
 | 
					#include "anr.hpp"
 | 
				
			||||||
#include "emnr.hpp"
 | 
					#include "emnr.hpp"
 | 
				
			||||||
#include "snb.hpp"
 | 
					#include "snba.hpp"
 | 
				
			||||||
#include "anf.hpp"
 | 
					#include "anf.hpp"
 | 
				
			||||||
#include "anb.hpp"
 | 
					#include "anb.hpp"
 | 
				
			||||||
#include "nob.hpp"
 | 
					#include "nob.hpp"
 | 
				
			||||||
@ -547,10 +547,10 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
 | 
				
			|||||||
        WDSP::ANF::SetANFRun(*m_rxa, settings.m_anf ? 1 : 0);
 | 
					        WDSP::ANF::SetANFRun(*m_rxa, settings.m_anf ? 1 : 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Causes corruption
 | 
					    // Caution: Causes corruption
 | 
				
			||||||
    // if ((m_settings.m_snb != settings.m_snb) || force) {
 | 
					    if ((m_settings.m_snb != settings.m_snb) || force) {
 | 
				
			||||||
    //     WDSP::SNBA::SetSNBARun(*m_rxa, settings.m_snb ? 1 : 0);
 | 
					        WDSP::SNBA::SetSNBARun(*m_rxa, settings.m_snb ? 1 : 0);
 | 
				
			||||||
    // }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // CW Peaking
 | 
					    // CW Peaking
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -636,12 +636,6 @@ void WDSPRxSink::applySettings(const WDSPRxSettings& settings, bool force)
 | 
				
			|||||||
        WDSP::PANEL::SetPanelGain1(*m_rxa, settings.m_volume);
 | 
					        WDSP::PANEL::SetPanelGain1(*m_rxa, settings.m_volume);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // if ((m_settings.m_volume != settings.m_volume) || force)
 | 
					 | 
				
			||||||
    // {
 | 
					 | 
				
			||||||
    //     m_volume = settings.m_volume;
 | 
					 | 
				
			||||||
    //     m_volume /= 4.0; // for 3276.8
 | 
					 | 
				
			||||||
    // }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if ((m_settings.m_audioBinaural != settings.m_audioBinaural) || force) {
 | 
					    if ((m_settings.m_audioBinaural != settings.m_audioBinaural) || force) {
 | 
				
			||||||
        WDSP::PANEL::SetPanelBinaural(*m_rxa, settings.m_audioBinaural ? 1 : 0);
 | 
					        WDSP::PANEL::SetPanelBinaural(*m_rxa, settings.m_audioBinaural ? 1 : 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,7 @@ set(wdsp_SOURCES
 | 
				
			|||||||
    bandpass.cpp
 | 
					    bandpass.cpp
 | 
				
			||||||
    bldr.cpp
 | 
					    bldr.cpp
 | 
				
			||||||
    bps.cpp
 | 
					    bps.cpp
 | 
				
			||||||
 | 
					    bpsnba.cpp
 | 
				
			||||||
    calculus.cpp
 | 
					    calculus.cpp
 | 
				
			||||||
    cblock.cpp
 | 
					    cblock.cpp
 | 
				
			||||||
    cfcomp.cpp
 | 
					    cfcomp.cpp
 | 
				
			||||||
@ -45,7 +46,7 @@ set(wdsp_SOURCES
 | 
				
			|||||||
    shift.cpp
 | 
					    shift.cpp
 | 
				
			||||||
    siphon.cpp
 | 
					    siphon.cpp
 | 
				
			||||||
    slew.cpp
 | 
					    slew.cpp
 | 
				
			||||||
    snb.cpp
 | 
					    snba.cpp
 | 
				
			||||||
    ssql.cpp
 | 
					    ssql.cpp
 | 
				
			||||||
    TXA.cpp
 | 
					    TXA.cpp
 | 
				
			||||||
    varsamp.cpp
 | 
					    varsamp.cpp
 | 
				
			||||||
@ -62,6 +63,7 @@ set(wdsp_HEADERS
 | 
				
			|||||||
    bandpass.hpp
 | 
					    bandpass.hpp
 | 
				
			||||||
    bldr.hpp
 | 
					    bldr.hpp
 | 
				
			||||||
    bps.hpp
 | 
					    bps.hpp
 | 
				
			||||||
 | 
					    bpsnba.hpp
 | 
				
			||||||
    bufferprobe.hpp
 | 
					    bufferprobe.hpp
 | 
				
			||||||
    calculus.hpp
 | 
					    calculus.hpp
 | 
				
			||||||
    cblock.hpp
 | 
					    cblock.hpp
 | 
				
			||||||
@ -98,7 +100,7 @@ set(wdsp_HEADERS
 | 
				
			|||||||
    shift.hpp
 | 
					    shift.hpp
 | 
				
			||||||
    siphon.hpp
 | 
					    siphon.hpp
 | 
				
			||||||
    slew.hpp
 | 
					    slew.hpp
 | 
				
			||||||
    snb.hpp
 | 
					    snba.hpp
 | 
				
			||||||
    ssql.hpp
 | 
					    ssql.hpp
 | 
				
			||||||
    TXA.hpp
 | 
					    TXA.hpp
 | 
				
			||||||
    varsamp.hpp
 | 
					    varsamp.hpp
 | 
				
			||||||
 | 
				
			|||||||
@ -36,7 +36,8 @@ warren@wpratt.com
 | 
				
			|||||||
#include "bandpass.hpp"
 | 
					#include "bandpass.hpp"
 | 
				
			||||||
#include "bps.hpp"
 | 
					#include "bps.hpp"
 | 
				
			||||||
#include "nbp.hpp"
 | 
					#include "nbp.hpp"
 | 
				
			||||||
#include "snb.hpp"
 | 
					#include "snba.hpp"
 | 
				
			||||||
 | 
					#include "bpsnba.hpp"
 | 
				
			||||||
#include "sender.hpp"
 | 
					#include "sender.hpp"
 | 
				
			||||||
#include "amsq.hpp"
 | 
					#include "amsq.hpp"
 | 
				
			||||||
#include "fmd.hpp"
 | 
					#include "fmd.hpp"
 | 
				
			||||||
 | 
				
			|||||||
@ -32,7 +32,7 @@ warren@wpratt.com
 | 
				
			|||||||
#include "anf.hpp"
 | 
					#include "anf.hpp"
 | 
				
			||||||
#include "emnr.hpp"
 | 
					#include "emnr.hpp"
 | 
				
			||||||
#include "anr.hpp"
 | 
					#include "anr.hpp"
 | 
				
			||||||
#include "snb.hpp"
 | 
					#include "snba.hpp"
 | 
				
			||||||
#include "RXA.hpp"
 | 
					#include "RXA.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace WDSP {
 | 
					namespace WDSP {
 | 
				
			||||||
 | 
				
			|||||||
@ -27,7 +27,7 @@ warren@wpratt.com
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "comm.hpp"
 | 
					#include "comm.hpp"
 | 
				
			||||||
#include "amd.hpp"
 | 
					#include "amd.hpp"
 | 
				
			||||||
#include "snb.hpp"
 | 
					#include "snba.hpp"
 | 
				
			||||||
#include "emnr.hpp"
 | 
					#include "emnr.hpp"
 | 
				
			||||||
#include "anr.hpp"
 | 
					#include "anr.hpp"
 | 
				
			||||||
#include "anf.hpp"
 | 
					#include "anf.hpp"
 | 
				
			||||||
 | 
				
			|||||||
@ -30,7 +30,7 @@ warren@wpratt.com
 | 
				
			|||||||
#include "comm.hpp"
 | 
					#include "comm.hpp"
 | 
				
			||||||
#include "anr.hpp"
 | 
					#include "anr.hpp"
 | 
				
			||||||
#include "amd.hpp"
 | 
					#include "amd.hpp"
 | 
				
			||||||
#include "snb.hpp"
 | 
					#include "snba.hpp"
 | 
				
			||||||
#include "emnr.hpp"
 | 
					#include "emnr.hpp"
 | 
				
			||||||
#include "anf.hpp"
 | 
					#include "anf.hpp"
 | 
				
			||||||
#include "bandpass.hpp"
 | 
					#include "bandpass.hpp"
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										221
									
								
								wdsp/bpsnba.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								wdsp/bpsnba.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,221 @@
 | 
				
			|||||||
 | 
					/*  snb.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This file is part of a program that implements a Software-Defined Radio.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (C) 2015, 2016 Warren Pratt, NR0V
 | 
				
			||||||
 | 
					Copyright (C) 2024 Edouard Griffiths, F4EXB Adapted to SDRangel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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 2
 | 
				
			||||||
 | 
					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, write to the Free Software
 | 
				
			||||||
 | 
					Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The author can be reached by email at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					warren@wpratt.com
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "comm.hpp"
 | 
				
			||||||
 | 
					#include "resample.hpp"
 | 
				
			||||||
 | 
					#include "lmath.hpp"
 | 
				
			||||||
 | 
					#include "firmin.hpp"
 | 
				
			||||||
 | 
					#include "nbp.hpp"
 | 
				
			||||||
 | 
					#include "amd.hpp"
 | 
				
			||||||
 | 
					#include "anf.hpp"
 | 
				
			||||||
 | 
					#include "anr.hpp"
 | 
				
			||||||
 | 
					#include "emnr.hpp"
 | 
				
			||||||
 | 
					#include "bpsnba.hpp"
 | 
				
			||||||
 | 
					#include "RXA.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAXIMP          256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace WDSP {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************************************
 | 
				
			||||||
 | 
					*                                                                                                       *
 | 
				
			||||||
 | 
					*                                       BPSNBA Bandpass Filter                                          *
 | 
				
			||||||
 | 
					*                                                                                                       *
 | 
				
			||||||
 | 
					********************************************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This is a thin wrapper for a notched-bandpass filter (nbp).  The basic difference is that it provides
 | 
				
			||||||
 | 
					// for its input and output to happen at different points in the processing pipeline.  This means it must
 | 
				
			||||||
 | 
					// include a buffer, 'buff'.  Its input and output are done via functions xbpshbain() and xbpshbaout().
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BPSNBA::calc_bpsnba (BPSNBA *a)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    a->buff = new float[a->size * 2]; // (double *) malloc0 (a->size * sizeof (complex));
 | 
				
			||||||
 | 
					    a->bpsnba = NBP::create_nbp (
 | 
				
			||||||
 | 
					        1,                          // run, always runs (use bpsnba 'run')
 | 
				
			||||||
 | 
					        a->run_notches,             // run the notches
 | 
				
			||||||
 | 
					        0,                          // position variable for nbp (not for bpsnba), always 0
 | 
				
			||||||
 | 
					        a->size,                    // buffer size
 | 
				
			||||||
 | 
					        a->nc,                      // number of filter coefficients
 | 
				
			||||||
 | 
					        a->mp,                      // minimum phase flag
 | 
				
			||||||
 | 
					        a->buff,                    // pointer to input buffer
 | 
				
			||||||
 | 
					        a->out,                     // pointer to output buffer
 | 
				
			||||||
 | 
					        a->f_low,                   // lower filter frequency
 | 
				
			||||||
 | 
					        a->f_high,                  // upper filter frequency
 | 
				
			||||||
 | 
					        a->rate,                    // sample rate
 | 
				
			||||||
 | 
					        a->wintype,                 // wintype
 | 
				
			||||||
 | 
					        a->gain,                    // gain
 | 
				
			||||||
 | 
					        a->autoincr,                // auto-increase notch width if below min
 | 
				
			||||||
 | 
					        a->maxpb,                   // max number of passbands
 | 
				
			||||||
 | 
					        a->ptraddr);                // addr of database pointer
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BPSNBA* BPSNBA::create_bpsnba (
 | 
				
			||||||
 | 
					    int run,
 | 
				
			||||||
 | 
					    int run_notches,
 | 
				
			||||||
 | 
					    int position,
 | 
				
			||||||
 | 
					    int size,
 | 
				
			||||||
 | 
					    int nc,
 | 
				
			||||||
 | 
					    int mp,
 | 
				
			||||||
 | 
					    float* in,
 | 
				
			||||||
 | 
					    float* out,
 | 
				
			||||||
 | 
					    int rate,
 | 
				
			||||||
 | 
					    double abs_low_freq,
 | 
				
			||||||
 | 
					    double abs_high_freq,
 | 
				
			||||||
 | 
					    double f_low,
 | 
				
			||||||
 | 
					    double f_high,
 | 
				
			||||||
 | 
					    int wintype,
 | 
				
			||||||
 | 
					    double gain,
 | 
				
			||||||
 | 
					    int autoincr,
 | 
				
			||||||
 | 
					    int maxpb,
 | 
				
			||||||
 | 
					    NOTCHDB* ptraddr
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    BPSNBA *a = new BPSNBA;
 | 
				
			||||||
 | 
					    a->run = run;
 | 
				
			||||||
 | 
					    a->run_notches = run_notches;
 | 
				
			||||||
 | 
					    a->position = position;
 | 
				
			||||||
 | 
					    a->size = size;
 | 
				
			||||||
 | 
					    a->nc = nc;
 | 
				
			||||||
 | 
					    a->mp = mp;
 | 
				
			||||||
 | 
					    a->in = in;
 | 
				
			||||||
 | 
					    a->out = out;
 | 
				
			||||||
 | 
					    a->rate = rate;
 | 
				
			||||||
 | 
					    a->abs_low_freq = abs_low_freq;
 | 
				
			||||||
 | 
					    a->abs_high_freq = abs_high_freq;
 | 
				
			||||||
 | 
					    a->f_low = f_low;
 | 
				
			||||||
 | 
					    a->f_high = f_high;
 | 
				
			||||||
 | 
					    a->wintype = wintype;
 | 
				
			||||||
 | 
					    a->gain = gain;
 | 
				
			||||||
 | 
					    a->autoincr = autoincr;
 | 
				
			||||||
 | 
					    a->maxpb = maxpb;
 | 
				
			||||||
 | 
					    a->ptraddr = ptraddr;
 | 
				
			||||||
 | 
					    calc_bpsnba (a);
 | 
				
			||||||
 | 
					    return a;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BPSNBA::decalc_bpsnba (BPSNBA *a)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    NBP::destroy_nbp (a->bpsnba);
 | 
				
			||||||
 | 
					    delete[] (a->buff);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BPSNBA::destroy_bpsnba (BPSNBA *a)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    decalc_bpsnba (a);
 | 
				
			||||||
 | 
					    delete[] (a);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BPSNBA::flush_bpsnba (BPSNBA *a)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    memset (a->buff, 0, a->size * sizeof (wcomplex));
 | 
				
			||||||
 | 
					    NBP::flush_nbp (a->bpsnba);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BPSNBA::setBuffers_bpsnba (BPSNBA *a, float* in, float* out)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    decalc_bpsnba (a);
 | 
				
			||||||
 | 
					    a->in = in;
 | 
				
			||||||
 | 
					    a->out = out;
 | 
				
			||||||
 | 
					    calc_bpsnba (a);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BPSNBA::setSamplerate_bpsnba (BPSNBA *a, int rate)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    decalc_bpsnba (a);
 | 
				
			||||||
 | 
					    a->rate = rate;
 | 
				
			||||||
 | 
					    calc_bpsnba (a);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BPSNBA::setSize_bpsnba (BPSNBA *a, int size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    decalc_bpsnba (a);
 | 
				
			||||||
 | 
					    a->size = size;
 | 
				
			||||||
 | 
					    calc_bpsnba (a);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BPSNBA::xbpsnbain (BPSNBA *a, int position)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (a->run && a->position == position)
 | 
				
			||||||
 | 
					        memcpy (a->buff, a->in, a->size * sizeof (wcomplex));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BPSNBA::xbpsnbaout (BPSNBA *a, int position)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (a->run && a->position == position)
 | 
				
			||||||
 | 
					        NBP::xnbp (a->bpsnba, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BPSNBA::recalc_bpsnba_filter (BPSNBA *a, int update)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    // Call anytime one of the parameters listed below has been changed in
 | 
				
			||||||
 | 
					    // the BPSNBA struct.
 | 
				
			||||||
 | 
					    NBP *b = a->bpsnba;
 | 
				
			||||||
 | 
					    b->fnfrun = a->run_notches;
 | 
				
			||||||
 | 
					    b->flow = a->f_low;
 | 
				
			||||||
 | 
					    b->fhigh = a->f_high;
 | 
				
			||||||
 | 
					    b->wintype = a->wintype;
 | 
				
			||||||
 | 
					    b->gain = a->gain;
 | 
				
			||||||
 | 
					    b->autoincr = a->autoincr;
 | 
				
			||||||
 | 
					    NBP::calc_nbp_impulse (b);
 | 
				
			||||||
 | 
					    FIRCORE::setImpulse_fircore (b->p, b->impulse, update);
 | 
				
			||||||
 | 
					    delete[] (b->impulse);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/********************************************************************************************************
 | 
				
			||||||
 | 
					*                                                                                                       *
 | 
				
			||||||
 | 
					*                                           RXA Properties                                              *
 | 
				
			||||||
 | 
					*                                                                                                       *
 | 
				
			||||||
 | 
					********************************************************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BPSNBA::BPSNBASetNC (RXA& rxa, int nc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    BPSNBA *a = rxa.bpsnba.p;
 | 
				
			||||||
 | 
					    rxa.csDSP.lock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (a->nc != nc)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        a->nc = nc;
 | 
				
			||||||
 | 
					        a->bpsnba->nc = a->nc;
 | 
				
			||||||
 | 
					        NBP::setNc_nbp (a->bpsnba);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rxa.csDSP.unlock();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void BPSNBA::BPSNBASetMP (RXA& rxa, int mp)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    BPSNBA *a = rxa.bpsnba.p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (a->mp != mp)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        a->mp = mp;
 | 
				
			||||||
 | 
					        a->bpsnba->mp = a->mp;
 | 
				
			||||||
 | 
					        NBP::setMp_nbp (a->bpsnba);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace
 | 
				
			||||||
							
								
								
									
										105
									
								
								wdsp/bpsnba.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								wdsp/bpsnba.hpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,105 @@
 | 
				
			|||||||
 | 
					/*  snb.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This file is part of a program that implements a Software-Defined Radio.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (C) 2015, 2016 Warren Pratt, NR0V
 | 
				
			||||||
 | 
					Copyright (C) 2024 Edouard Griffiths, F4EXB Adapted to SDRangel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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 2
 | 
				
			||||||
 | 
					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, write to the Free Software
 | 
				
			||||||
 | 
					Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The author can be reached by email at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					warren@wpratt.com
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef wdsp_bpsnba_h
 | 
				
			||||||
 | 
					#define wdsp_bpsnba_h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace WDSP{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class RXA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NOTCHDB;
 | 
				
			||||||
 | 
					class NBP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class BPSNBA
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    int run;                        // run the filter
 | 
				
			||||||
 | 
					    int run_notches;                // use the notches, vs straight bandpass
 | 
				
			||||||
 | 
					    int position;                   // position in the processing pipeline
 | 
				
			||||||
 | 
					    int size;                       // buffer size
 | 
				
			||||||
 | 
					    int nc;                         // number of filter coefficients
 | 
				
			||||||
 | 
					    int mp;                         // minimum phase flag
 | 
				
			||||||
 | 
					    float* in;                     // input buffer
 | 
				
			||||||
 | 
					    float* out;                    // output buffer
 | 
				
			||||||
 | 
					    int rate;                       // sample rate
 | 
				
			||||||
 | 
					    float* buff;                   // internal buffer
 | 
				
			||||||
 | 
					    NBP *bpsnba;                     // pointer to the notched bandpass filter, nbp
 | 
				
			||||||
 | 
					    double f_low;                   // low cutoff frequency
 | 
				
			||||||
 | 
					    double f_high;                  // high cutoff frequency
 | 
				
			||||||
 | 
					    double abs_low_freq;            // lowest positive freq supported by SNB
 | 
				
			||||||
 | 
					    double abs_high_freq;           // highest positive freq supported by SNG
 | 
				
			||||||
 | 
					    int wintype;                    // filter window type
 | 
				
			||||||
 | 
					    double gain;                    // filter gain
 | 
				
			||||||
 | 
					    int autoincr;                   // use auto increment for notch width
 | 
				
			||||||
 | 
					    int maxpb;                      // maximum passband segments supported
 | 
				
			||||||
 | 
					    NOTCHDB* ptraddr;               // pointer to address of NOTCH DATABASE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static BPSNBA* create_bpsnba (
 | 
				
			||||||
 | 
					        int run,
 | 
				
			||||||
 | 
					        int run_notches,
 | 
				
			||||||
 | 
					        int position,
 | 
				
			||||||
 | 
					        int size,
 | 
				
			||||||
 | 
					        int nc,
 | 
				
			||||||
 | 
					        int mp,
 | 
				
			||||||
 | 
					        float* in,
 | 
				
			||||||
 | 
					        float* out,
 | 
				
			||||||
 | 
					        int rate,
 | 
				
			||||||
 | 
					        double abs_low_freq,
 | 
				
			||||||
 | 
					        double abs_high_freq,
 | 
				
			||||||
 | 
					        double f_low,
 | 
				
			||||||
 | 
					        double f_high,
 | 
				
			||||||
 | 
					        int wintype,
 | 
				
			||||||
 | 
					        double gain,
 | 
				
			||||||
 | 
					        int autoincr,
 | 
				
			||||||
 | 
					        int maxpb,
 | 
				
			||||||
 | 
					        NOTCHDB* ptraddr
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    static void destroy_bpsnba (BPSNBA *a);
 | 
				
			||||||
 | 
					    static void flush_bpsnba (BPSNBA *a);
 | 
				
			||||||
 | 
					    static void setBuffers_bpsnba (BPSNBA *a, float* in, float* out);
 | 
				
			||||||
 | 
					    static void setSamplerate_bpsnba (BPSNBA *a, int rate);
 | 
				
			||||||
 | 
					    static void setSize_bpsnba (BPSNBA *a, int size);
 | 
				
			||||||
 | 
					    static void xbpsnbain (BPSNBA *a, int position);
 | 
				
			||||||
 | 
					    static void xbpsnbaout (BPSNBA *a, int position);
 | 
				
			||||||
 | 
					    static void recalc_bpsnba_filter (BPSNBA *a, int update);
 | 
				
			||||||
 | 
					    // RXA Propertoes
 | 
				
			||||||
 | 
					    static void BPSNBASetNC (RXA& rxa, int nc);
 | 
				
			||||||
 | 
					    static void BPSNBASetMP (RXA& rxa, int mp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    static void calc_bpsnba (BPSNBA *a);
 | 
				
			||||||
 | 
					    static void decalc_bpsnba (BPSNBA *a);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace
 | 
				
			||||||
@ -30,7 +30,7 @@ warren@wpratt.com
 | 
				
			|||||||
#include "amd.hpp"
 | 
					#include "amd.hpp"
 | 
				
			||||||
#include "anr.hpp"
 | 
					#include "anr.hpp"
 | 
				
			||||||
#include "anf.hpp"
 | 
					#include "anf.hpp"
 | 
				
			||||||
#include "snb.hpp"
 | 
					#include "snba.hpp"
 | 
				
			||||||
#include "bandpass.hpp"
 | 
					#include "bandpass.hpp"
 | 
				
			||||||
#include "RXA.hpp"
 | 
					#include "RXA.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -908,8 +908,14 @@ void EMNR::SetEMNRRun (RXA& rxa, int run)
 | 
				
			|||||||
    EMNR *a = rxa.emnr.p;
 | 
					    EMNR *a = rxa.emnr.p;
 | 
				
			||||||
    if (a->run != run)
 | 
					    if (a->run != run)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        RXA::bp1Check (rxa, rxa.amd.p->run, rxa.snba.p->run,
 | 
					        RXA::bp1Check (
 | 
				
			||||||
            run, rxa.anf.p->run, rxa.anr.p->run);
 | 
					            rxa,
 | 
				
			||||||
 | 
					            rxa.amd.p->run,
 | 
				
			||||||
 | 
					            rxa.snba.p->run,
 | 
				
			||||||
 | 
					            run,
 | 
				
			||||||
 | 
					            rxa.anf.p->run,
 | 
				
			||||||
 | 
					            rxa.anr.p->run
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        rxa.csDSP.lock();
 | 
					        rxa.csDSP.lock();
 | 
				
			||||||
        a->run = run;
 | 
					        a->run = run;
 | 
				
			||||||
        RXA::bp1Set (rxa);
 | 
					        RXA::bp1Set (rxa);
 | 
				
			||||||
 | 
				
			|||||||
@ -28,7 +28,7 @@ warren@wpratt.com
 | 
				
			|||||||
#include "comm.hpp"
 | 
					#include "comm.hpp"
 | 
				
			||||||
#include "fir.hpp"
 | 
					#include "fir.hpp"
 | 
				
			||||||
#include "firmin.hpp"
 | 
					#include "firmin.hpp"
 | 
				
			||||||
#include "snb.hpp"
 | 
					#include "bpsnba.hpp"
 | 
				
			||||||
#include "nbp.hpp"
 | 
					#include "nbp.hpp"
 | 
				
			||||||
#include "RXA.hpp"
 | 
					#include "RXA.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -34,10 +34,9 @@ warren@wpratt.com
 | 
				
			|||||||
#include "anf.hpp"
 | 
					#include "anf.hpp"
 | 
				
			||||||
#include "anr.hpp"
 | 
					#include "anr.hpp"
 | 
				
			||||||
#include "emnr.hpp"
 | 
					#include "emnr.hpp"
 | 
				
			||||||
#include "snb.hpp"
 | 
					#include "snba.hpp"
 | 
				
			||||||
#include "RXA.hpp"
 | 
					#include "RXA.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define MAXIMP          256
 | 
					#define MAXIMP          256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace WDSP {
 | 
					namespace WDSP {
 | 
				
			||||||
@ -48,25 +47,31 @@ void SNBA::calc_snba (SNBA *d)
 | 
				
			|||||||
        d->isize = d->bsize / (d->inrate / d->internalrate);
 | 
					        d->isize = d->bsize / (d->inrate / d->internalrate);
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        d->isize = d->bsize * (d->internalrate / d->inrate);
 | 
					        d->isize = d->bsize * (d->internalrate / d->inrate);
 | 
				
			||||||
    d->inbuff  = new float[d->isize * 2]; // (float *) malloc0 (d->isize * sizeof (complex));
 | 
					
 | 
				
			||||||
    d->outbuff = new float[d->isize * 2]; // (float *) malloc0 (d->isize * sizeof (complex));
 | 
					    d->inbuff  = new float[d->isize * 2]; // (double *) malloc0 (d->isize * sizeof (complex));
 | 
				
			||||||
 | 
					    d->outbuff = new float[d->isize * 2]; // (double *) malloc0 (d->isize * sizeof (complex));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (d->inrate != d->internalrate)
 | 
					    if (d->inrate != d->internalrate)
 | 
				
			||||||
        d->resamprun = 1;
 | 
					        d->resamprun = 1;
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        d->resamprun = 0;
 | 
					        d->resamprun = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    d->inresamp  = RESAMPLE::create_resample (d->resamprun, d->bsize, d->in,      d->inbuff, d->inrate,       d->internalrate, 0.0, 0, 2.0);
 | 
					    d->inresamp  = RESAMPLE::create_resample (d->resamprun, d->bsize, d->in,      d->inbuff, d->inrate,       d->internalrate, 0.0, 0, 2.0);
 | 
				
			||||||
    RESAMPLE::setFCLow_resample (d->inresamp, 250.0);
 | 
					    RESAMPLE::setFCLow_resample (d->inresamp, 250.0);
 | 
				
			||||||
    d->outresamp = RESAMPLE::create_resample (d->resamprun, d->isize, d->outbuff, d->out,    d->internalrate, d->inrate,       0.0, 0, 2.0);
 | 
					    d->outresamp = RESAMPLE::create_resample (d->resamprun, d->isize, d->outbuff, d->out,    d->internalrate, d->inrate,       0.0, 0, 2.0);
 | 
				
			||||||
    RESAMPLE::setFCLow_resample (d->outresamp, 200.0);
 | 
					    RESAMPLE::setFCLow_resample (d->outresamp, 200.0);
 | 
				
			||||||
    d->incr = d->xsize / d->ovrlp;
 | 
					    d->incr = d->xsize / d->ovrlp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (d->incr > d->isize)
 | 
					    if (d->incr > d->isize)
 | 
				
			||||||
        d->iasize = d->incr;
 | 
					        d->iasize = d->incr;
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        d->iasize = d->isize;
 | 
					        d->iasize = d->isize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    d->iainidx = 0;
 | 
					    d->iainidx = 0;
 | 
				
			||||||
    d->iaoutidx = 0;
 | 
					    d->iaoutidx = 0;
 | 
				
			||||||
    d->inaccum = new float[d->isize]; // (float *) malloc0 (d->iasize * sizeof (float));
 | 
					    d->inaccum = new float[d->iasize * 2]; // (double *) malloc0 (d->iasize * sizeof (double));
 | 
				
			||||||
    d->nsamps = 0;
 | 
					    d->nsamps = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (d->incr > d->isize)
 | 
					    if (d->incr > d->isize)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        d->oasize = d->incr;
 | 
					        d->oasize = d->incr;
 | 
				
			||||||
@ -79,8 +84,9 @@ void SNBA::calc_snba (SNBA *d)
 | 
				
			|||||||
        d->oainidx = 0;
 | 
					        d->oainidx = 0;
 | 
				
			||||||
        d->oaoutidx = 0;
 | 
					        d->oaoutidx = 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    d->init_oaoutidx = d->oaoutidx;
 | 
					    d->init_oaoutidx = d->oaoutidx;
 | 
				
			||||||
    d->outaccum = new float[d->oasize]; // (float *) malloc0 (d->oasize * sizeof (float));
 | 
					    d->outaccum = new float[d->oasize * 2]; // (double *) malloc0 (d->oasize * sizeof (double));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SNBA* SNBA::create_snba (
 | 
					SNBA* SNBA::create_snba (
 | 
				
			||||||
@ -94,14 +100,14 @@ SNBA* SNBA::create_snba (
 | 
				
			|||||||
    int xsize,
 | 
					    int xsize,
 | 
				
			||||||
    int asize,
 | 
					    int asize,
 | 
				
			||||||
    int npasses,
 | 
					    int npasses,
 | 
				
			||||||
    float k1,
 | 
					    double k1,
 | 
				
			||||||
    float k2,
 | 
					    double k2,
 | 
				
			||||||
    int b,
 | 
					    int b,
 | 
				
			||||||
    int pre,
 | 
					    int pre,
 | 
				
			||||||
    int post,
 | 
					    int post,
 | 
				
			||||||
    float pmultmin,
 | 
					    double pmultmin,
 | 
				
			||||||
    float out_low_cut,
 | 
					    double out_low_cut,
 | 
				
			||||||
    float out_high_cut
 | 
					    double out_high_cut
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SNBA *d = new SNBA;
 | 
					    SNBA *d = new SNBA;
 | 
				
			||||||
@ -126,30 +132,30 @@ SNBA* SNBA::create_snba (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    calc_snba (d);
 | 
					    calc_snba (d);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    d->xbase    = new float[2 * d->xsize]; // (float *) malloc0 (2 * d->xsize * sizeof (float));
 | 
					    d->xbase        = new float[2 * d->xsize]; // (double *) malloc0 (2 * d->xsize * sizeof (double));
 | 
				
			||||||
    d->xaux         = d->xbase + d->xsize;
 | 
					    d->xaux         = d->xbase + d->xsize;
 | 
				
			||||||
    d->exec.a       = new float[d->xsize]; // (float *) malloc0 (d->xsize * sizeof (float));
 | 
					    d->exec.a       = new float[d->xsize]; //(double *) malloc0 (d->xsize * sizeof (double));
 | 
				
			||||||
    d->exec.v       = new float[d->xsize]; // (float *) malloc0 (d->xsize * sizeof (float));
 | 
					    d->exec.v       = new float[d->xsize]; //(double *) malloc0 (d->xsize * sizeof (double));
 | 
				
			||||||
    d->exec.detout  = new int[d->xsize]; // (int    *) malloc0 (d->xsize * sizeof (int));
 | 
					    d->exec.detout  = new int[d->xsize]; //(int    *) malloc0 (d->xsize * sizeof (int));
 | 
				
			||||||
    d->exec.savex   = new float[d->xsize]; // (float *) malloc0 (d->xsize * sizeof (float));
 | 
					    d->exec.savex   = new float[d->xsize]; //(double *) malloc0 (d->xsize * sizeof (double));
 | 
				
			||||||
    d->exec.xHout   = new float[d->xsize]; // (float *) malloc0 (d->xsize * sizeof (float));
 | 
					    d->exec.xHout   = new float[d->xsize]; //(double *) malloc0 (d->xsize * sizeof (double));
 | 
				
			||||||
    d->exec.unfixed = new int32_t[d->xsize]; // (int    *) malloc0 (d->xsize * sizeof (int));
 | 
					    d->exec.unfixed = new int[d->xsize]; //(int    *) malloc0 (d->xsize * sizeof (int));
 | 
				
			||||||
    d->sdet.vp      = new float[d->xsize]; // (float *) malloc0 (d->xsize * sizeof (float));
 | 
					    d->sdet.vp      = new float[d->xsize]; //(double *) malloc0 (d->xsize * sizeof (double));
 | 
				
			||||||
    d->sdet.vpwr    = new float[d->xsize]; // (float *) malloc0 (d->xsize * sizeof (float));
 | 
					    d->sdet.vpwr    = new float[d->xsize]; //(double *) malloc0 (d->xsize * sizeof (double));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    d->wrk.xHat_a1rows_max = d->xsize + d->exec.asize;
 | 
					    d->wrk.xHat_a1rows_max = d->xsize + d->exec.asize;
 | 
				
			||||||
    d->wrk.xHat_a2cols_max = d->xsize + 2 * d->exec.asize;
 | 
					    d->wrk.xHat_a2cols_max = d->xsize + 2 * d->exec.asize;
 | 
				
			||||||
    d->wrk.xHat_r          = new float[d->xsize]; // (float *) malloc0 (d->xsize * sizeof(float));
 | 
					    d->wrk.xHat_r          = new float[d->xsize]; // (double *) malloc0 (d->xsize * sizeof(double));
 | 
				
			||||||
    d->wrk.xHat_ATAI       = new float[d->xsize * d->xsize]; // (float *) malloc0 (d->xsize * d->xsize * sizeof(float));
 | 
					    d->wrk.xHat_ATAI       = new float[d->xsize * d->xsize]; // (double *) malloc0 (d->xsize * d->xsize * sizeof(double));
 | 
				
			||||||
    d->wrk.xHat_A1         = new float[d->wrk.xHat_a1rows_max * d->xsize]; // (float *) malloc0 (d->wrk.xHat_a1rows_max * d->xsize * sizeof(float));
 | 
					    d->wrk.xHat_A1         = new float[d->wrk.xHat_a1rows_max * d->xsize]; // (double *) malloc0 (d->wrk.xHat_a1rows_max * d->xsize * sizeof(double));
 | 
				
			||||||
    d->wrk.xHat_A2         = new float[d->wrk.xHat_a1rows_max * d->wrk.xHat_a2cols_max]; // (float *) malloc0 (d->wrk.xHat_a1rows_max * d->wrk.xHat_a2cols_max * sizeof(float));
 | 
					    d->wrk.xHat_A2         = new float[d->wrk.xHat_a1rows_max * d->wrk.xHat_a2cols_max]; // (double *) malloc0 (d->wrk.xHat_a1rows_max * d->wrk.xHat_a2cols_max * sizeof(double));
 | 
				
			||||||
    d->wrk.xHat_P1         = new float[d->xsize * d->wrk.xHat_a2cols_max]; // (float *) malloc0 (d->xsize * d->wrk.xHat_a2cols_max * sizeof(float));
 | 
					    d->wrk.xHat_P1         = new float[d->xsize * d->wrk.xHat_a2cols_max]; // (double *) malloc0 (d->xsize * d->wrk.xHat_a2cols_max * sizeof(double));
 | 
				
			||||||
    d->wrk.xHat_P2         = new float[d->xsize]; // (float *) malloc0 (d->xsize * sizeof(float));
 | 
					    d->wrk.xHat_P2         = new float[d->xsize]; // (double *) malloc0 (d->xsize * sizeof(double));
 | 
				
			||||||
    d->wrk.trI_y           = new float[d->xsize - 1]; // (float *) malloc0 ((d->xsize - 1) * sizeof(float));
 | 
					    d->wrk.trI_y           = new float[d->xsize - 1]; // (double *) malloc0 ((d->xsize - 1) * sizeof(double));
 | 
				
			||||||
    d->wrk.trI_v           = new float[d->xsize - 1]; // (float *) malloc0 ((d->xsize - 1) * sizeof(float));
 | 
					    d->wrk.trI_v           = new float[d->xsize - 1]; // (double *) malloc0 ((d->xsize - 1) * sizeof(double));
 | 
				
			||||||
    d->wrk.dR_z            = new float[d->xsize - 2]; // (float *) malloc0 ((d->xsize - 2) * sizeof(float));
 | 
					    d->wrk.dR_z            = new float[d->xsize - 2]; // (double *) malloc0 ((d->xsize - 2) * sizeof(double));
 | 
				
			||||||
    d->wrk.asolve_r        = new float[d->exec.asize + 1]; // (float *) malloc0 ((d->exec.asize + 1) * sizeof(float));
 | 
					    d->wrk.asolve_r        = new float[d->exec.asize + 1]; // (double *) malloc0 ((d->exec.asize + 1) * sizeof(double));
 | 
				
			||||||
    d->wrk.asolve_z        = new float[d->exec.asize + 1]; // (float *) malloc0 ((d->exec.asize + 1) * sizeof(float));
 | 
					    d->wrk.asolve_z        = new float[d->exec.asize + 1]; // (double *) malloc0 ((d->exec.asize + 1) * sizeof(double));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return d;
 | 
					    return d;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -191,7 +197,7 @@ void SNBA::destroy_snba (SNBA *d)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    decalc_snba (d);
 | 
					    decalc_snba (d);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    delete (d);
 | 
					    delete[] (d);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SNBA::flush_snba (SNBA *d)
 | 
					void SNBA::flush_snba (SNBA *d)
 | 
				
			||||||
@ -216,6 +222,7 @@ void SNBA::flush_snba (SNBA *d)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    memset (d->inbuff,       0, d->isize  * sizeof (wcomplex));
 | 
					    memset (d->inbuff,       0, d->isize  * sizeof (wcomplex));
 | 
				
			||||||
    memset (d->outbuff,      0, d->isize  * sizeof (wcomplex));
 | 
					    memset (d->outbuff,      0, d->isize  * sizeof (wcomplex));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    RESAMPLE::flush_resample (d->inresamp);
 | 
					    RESAMPLE::flush_resample (d->inresamp);
 | 
				
			||||||
    RESAMPLE::flush_resample (d->outresamp);
 | 
					    RESAMPLE::flush_resample (d->outresamp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -256,6 +263,7 @@ void SNBA::multA1TA2(float* a1, float* a2, int m, int n, int q, float* c)
 | 
				
			|||||||
    int i, j, k;
 | 
					    int i, j, k;
 | 
				
			||||||
    int p = q - m;
 | 
					    int p = q - m;
 | 
				
			||||||
    memset (c, 0, m * n * sizeof (float));
 | 
					    memset (c, 0, m * n * sizeof (float));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < m; i++)
 | 
					    for (i = 0; i < m; i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        for (j = 0; j < n; j++)
 | 
					        for (j = 0; j < n; j++)
 | 
				
			||||||
@ -278,6 +286,7 @@ void SNBA::multXKE(float* a, float* xk, int m, int q, int p, float* vout)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    int i, k;
 | 
					    int i, k;
 | 
				
			||||||
    memset (vout, 0, m * sizeof (float));
 | 
					    memset (vout, 0, m * sizeof (float));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < m; i++)
 | 
					    for (i = 0; i < m; i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        for (k = i; k < p; k++)
 | 
					        for (k = i; k < p; k++)
 | 
				
			||||||
@ -291,6 +300,7 @@ void SNBA::multAv(float* a, float* v, int m, int q, float* vout)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    int i, k;
 | 
					    int i, k;
 | 
				
			||||||
    memset (vout, 0, m * sizeof (float));
 | 
					    memset (vout, 0, m * sizeof (float));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < m; i++)
 | 
					    for (i = 0; i < m; i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        for (k = 0; k < q; k++)
 | 
					        for (k = 0; k < q; k++)
 | 
				
			||||||
@ -356,6 +366,7 @@ void SNBA::invf(int xsize, int asize, float* a, float* x, float* v)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    int i, j;
 | 
					    int i, j;
 | 
				
			||||||
    memset (v, 0, xsize * sizeof (float));
 | 
					    memset (v, 0, xsize * sizeof (float));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = asize; i < xsize - asize; i++)
 | 
					    for (i = asize; i < xsize - asize; i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        for (j = 0; j < asize; j++)
 | 
					        for (j = 0; j < asize; j++)
 | 
				
			||||||
@ -373,16 +384,20 @@ void SNBA::invf(int xsize, int asize, float* a, float* x, float* v)
 | 
				
			|||||||
void SNBA::det(SNBA *d, int asize, float* v, int* detout)
 | 
					void SNBA::det(SNBA *d, int asize, float* v, int* detout)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int i, j;
 | 
					    int i, j;
 | 
				
			||||||
    float medpwr, t1, t2;
 | 
					    float medpwr;
 | 
				
			||||||
 | 
					    double t1, t2;
 | 
				
			||||||
    int bstate, bcount, bsamp;
 | 
					    int bstate, bcount, bsamp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = asize, j = 0; i < d->xsize; i++, j++)
 | 
					    for (i = asize, j = 0; i < d->xsize; i++, j++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        d->sdet.vpwr[i] = v[i] * v[i];
 | 
					        d->sdet.vpwr[i] = v[i] * v[i];
 | 
				
			||||||
        d->sdet.vp[j] = d->sdet.vpwr[i];
 | 
					        d->sdet.vp[j] = d->sdet.vpwr[i];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    LMath::median(d->xsize - asize, d->sdet.vp, &medpwr);
 | 
					    LMath::median(d->xsize - asize, d->sdet.vp, &medpwr);
 | 
				
			||||||
    t1 = d->sdet.k1 * medpwr;
 | 
					    t1 = d->sdet.k1 * medpwr;
 | 
				
			||||||
    t2 = 0.0;
 | 
					    t2 = 0.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = asize; i < d->xsize; i++)
 | 
					    for (i = asize; i < d->xsize; i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (d->sdet.vpwr[i] <= t1)
 | 
					        if (d->sdet.vpwr[i] <= t1)
 | 
				
			||||||
@ -390,7 +405,8 @@ void SNBA::det(SNBA *d, int asize, float* v, int* detout)
 | 
				
			|||||||
        else if (d->sdet.vpwr[i] <= 2.0 * t1)
 | 
					        else if (d->sdet.vpwr[i] <= 2.0 * t1)
 | 
				
			||||||
            t2 += 2.0 * t1 - d->sdet.vpwr[i];
 | 
					            t2 += 2.0 * t1 - d->sdet.vpwr[i];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    t2 *= d->sdet.k2 / (float)(d->xsize - asize);
 | 
					    t2 *= d->sdet.k2 / (double)(d->xsize - asize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = asize; i < d->xsize; i++)
 | 
					    for (i = asize; i < d->xsize; i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (d->sdet.vpwr[i] > t2)
 | 
					        if (d->sdet.vpwr[i] > t2)
 | 
				
			||||||
@ -398,9 +414,11 @@ void SNBA::det(SNBA *d, int asize, float* v, int* detout)
 | 
				
			|||||||
        else
 | 
					        else
 | 
				
			||||||
            detout[i] = 0;
 | 
					            detout[i] = 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bstate = 0;
 | 
					    bstate = 0;
 | 
				
			||||||
    bcount = 0;
 | 
					    bcount = 0;
 | 
				
			||||||
    bsamp = 0;
 | 
					    bsamp = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = asize; i < d->xsize; i++)
 | 
					    for (i = asize; i < d->xsize; i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        switch (bstate)
 | 
					        switch (bstate)
 | 
				
			||||||
@ -453,7 +471,7 @@ void SNBA::det(SNBA *d, int asize, float* v, int* detout)
 | 
				
			|||||||
int SNBA::scanFrame(
 | 
					int SNBA::scanFrame(
 | 
				
			||||||
    int xsize,
 | 
					    int xsize,
 | 
				
			||||||
    int pval,
 | 
					    int pval,
 | 
				
			||||||
    float pmultmin,
 | 
					    double pmultmin,
 | 
				
			||||||
    int* det,
 | 
					    int* det,
 | 
				
			||||||
    int* bimp,
 | 
					    int* bimp,
 | 
				
			||||||
    int* limp,
 | 
					    int* limp,
 | 
				
			||||||
@ -466,9 +484,9 @@ int SNBA::scanFrame(
 | 
				
			|||||||
    int inflag = 0;
 | 
					    int inflag = 0;
 | 
				
			||||||
    int i = 0, j = 0, k = 0;
 | 
					    int i = 0, j = 0, k = 0;
 | 
				
			||||||
    int nimp = 0;
 | 
					    int nimp = 0;
 | 
				
			||||||
    float td;
 | 
					    double td;
 | 
				
			||||||
    int ti;
 | 
					    int ti;
 | 
				
			||||||
    float merit[MAXIMP] = { 0 };
 | 
					    double merit[MAXIMP] = { 0 };
 | 
				
			||||||
    int nextlist[MAXIMP];
 | 
					    int nextlist[MAXIMP];
 | 
				
			||||||
    memset (befimp, 0, MAXIMP * sizeof (int));
 | 
					    memset (befimp, 0, MAXIMP * sizeof (int));
 | 
				
			||||||
    memset (aftimp, 0, MAXIMP * sizeof (int));
 | 
					    memset (aftimp, 0, MAXIMP * sizeof (int));
 | 
				
			||||||
@ -508,7 +526,7 @@ int SNBA::scanFrame(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < nimp; i++)
 | 
					    for (i = 0; i < nimp; i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        merit[i] = (float)p_opt[i] / (float)limp[i];
 | 
					        merit[i] = (double)p_opt[i] / (double)limp[i];
 | 
				
			||||||
        nextlist[i] = i;
 | 
					        nextlist[i] = i;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    for (j = 0; j < nimp - 1; j++)
 | 
					    for (j = 0; j < nimp - 1; j++)
 | 
				
			||||||
@ -564,15 +582,19 @@ void SNBA::execFrame(SNBA *d, float* x)
 | 
				
			|||||||
    LMath::asolve(d->xsize, d->exec.asize, x, d->exec.a, d->wrk.asolve_r, d->wrk.asolve_z);
 | 
					    LMath::asolve(d->xsize, d->exec.asize, x, d->exec.a, d->wrk.asolve_r, d->wrk.asolve_z);
 | 
				
			||||||
    invf(d->xsize, d->exec.asize, d->exec.a, x, d->exec.v);
 | 
					    invf(d->xsize, d->exec.asize, d->exec.a, x, d->exec.v);
 | 
				
			||||||
    det(d, d->exec.asize, d->exec.v, d->exec.detout);
 | 
					    det(d, d->exec.asize, d->exec.v, d->exec.detout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < d->xsize; i++)
 | 
					    for (i = 0; i < d->xsize; i++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        if (d->exec.detout[i] != 0)
 | 
					        if (d->exec.detout[i] != 0)
 | 
				
			||||||
            x[i] = 0.0;
 | 
					            x[i] = 0.0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    nimp = scanFrame(d->xsize, d->exec.asize, d->scan.pmultmin, d->exec.detout, bimp, limp, befimp, aftimp, p_opt, &next);
 | 
					    nimp = scanFrame(d->xsize, d->exec.asize, d->scan.pmultmin, d->exec.detout, bimp, limp, befimp, aftimp, p_opt, &next);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (pass = 0; pass < d->exec.npasses; pass++)
 | 
					    for (pass = 0; pass < d->exec.npasses; pass++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        memcpy (d->exec.unfixed, d->exec.detout, d->xsize * sizeof (int));
 | 
					        memcpy (d->exec.unfixed, d->exec.detout, d->xsize * sizeof (int));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (k = 0; k < nimp; k++)
 | 
					        for (k = 0; k < nimp; k++)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (k > 0)
 | 
					            if (k > 0)
 | 
				
			||||||
@ -601,12 +623,15 @@ void SNBA::xsnba (SNBA *d)
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        int i;
 | 
					        int i;
 | 
				
			||||||
        RESAMPLE::xresample (d->inresamp);
 | 
					        RESAMPLE::xresample (d->inresamp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (i = 0; i < 2 * d->isize; i += 2)
 | 
					        for (i = 0; i < 2 * d->isize; i += 2)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            d->inaccum[d->iainidx] = d->inbuff[i];
 | 
					            d->inaccum[d->iainidx] = d->inbuff[i];
 | 
				
			||||||
            d->iainidx = (d->iainidx + 1) % d->iasize;
 | 
					            d->iainidx = (d->iainidx + 1) % d->iasize;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        d->nsamps += d->isize;
 | 
					        d->nsamps += d->isize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        while (d->nsamps >= d->incr)
 | 
					        while (d->nsamps >= d->incr)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            memcpy (&d->xaux[d->xsize - d->incr], &d->inaccum[d->iaoutidx], d->incr * sizeof (float));
 | 
					            memcpy (&d->xaux[d->xsize - d->incr], &d->inaccum[d->iaoutidx], d->incr * sizeof (float));
 | 
				
			||||||
@ -617,12 +642,14 @@ void SNBA::xsnba (SNBA *d)
 | 
				
			|||||||
            d->oainidx = (d->oainidx + d->incr) % d->oasize;
 | 
					            d->oainidx = (d->oainidx + d->incr) % d->oasize;
 | 
				
			||||||
            memmove (d->xbase, &d->xbase[d->incr], (2 * d->xsize - d->incr) * sizeof (float));
 | 
					            memmove (d->xbase, &d->xbase[d->incr], (2 * d->xsize - d->incr) * sizeof (float));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (i = 0; i < d->isize; i++)
 | 
					        for (i = 0; i < d->isize; i++)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            d->outbuff[2 * i + 0] = d->outaccum[d->oaoutidx];
 | 
					            d->outbuff[2 * i + 0] = d->outaccum[d->oaoutidx];
 | 
				
			||||||
            d->outbuff[2 * i + 1] = 0.0;
 | 
					            d->outbuff[2 * i + 1] = 0.0;
 | 
				
			||||||
            d->oaoutidx = (d->oaoutidx + 1) % d->oasize;
 | 
					            d->oaoutidx = (d->oaoutidx + 1) % d->oasize;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        RESAMPLE::xresample (d->outresamp);
 | 
					        RESAMPLE::xresample (d->outresamp);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else if (d->out != d->in)
 | 
					    else if (d->out != d->in)
 | 
				
			||||||
@ -641,8 +668,14 @@ void SNBA::SetSNBARun (RXA& rxa, int run)
 | 
				
			|||||||
    if (a->run != run)
 | 
					    if (a->run != run)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        RXA::bpsnbaCheck (rxa, rxa.mode, rxa.ndb.p->master_run);
 | 
					        RXA::bpsnbaCheck (rxa, rxa.mode, rxa.ndb.p->master_run);
 | 
				
			||||||
        RXA::bp1Check (rxa, rxa.amd.p->run, run, rxa.emnr.p->run,
 | 
					        RXA::bp1Check (
 | 
				
			||||||
            rxa.anf.p->run, rxa.anr.p->run);
 | 
					            rxa,
 | 
				
			||||||
 | 
					            rxa.amd.p->run,
 | 
				
			||||||
 | 
					            run,
 | 
				
			||||||
 | 
					            rxa.emnr.p->run,
 | 
				
			||||||
 | 
					            rxa.anf.p->run,
 | 
				
			||||||
 | 
					            rxa.anr.p->run
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
        rxa.csDSP.lock();
 | 
					        rxa.csDSP.lock();
 | 
				
			||||||
        a->run = run;
 | 
					        a->run = run;
 | 
				
			||||||
        RXA::bp1Set (rxa);
 | 
					        RXA::bp1Set (rxa);
 | 
				
			||||||
@ -660,7 +693,7 @@ void SNBA::SetSNBAovrlp (RXA& rxa, int ovrlp)
 | 
				
			|||||||
    rxa.csDSP.unlock();
 | 
					    rxa.csDSP.unlock();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SetSNBAasize (RXA& rxa, int size)
 | 
					void SNBA::SetSNBAasize (RXA& rxa, int size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    rxa.csDSP.lock();
 | 
					    rxa.csDSP.lock();
 | 
				
			||||||
    rxa.snba.p->exec.asize = size;
 | 
					    rxa.snba.p->exec.asize = size;
 | 
				
			||||||
@ -674,14 +707,14 @@ void SNBA::SetSNBAnpasses (RXA& rxa, int npasses)
 | 
				
			|||||||
    rxa.csDSP.unlock();
 | 
					    rxa.csDSP.unlock();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SNBA::SetSNBAk1 (RXA& rxa, float k1)
 | 
					void SNBA::SetSNBAk1 (RXA& rxa, double k1)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    rxa.csDSP.lock();
 | 
					    rxa.csDSP.lock();
 | 
				
			||||||
    rxa.snba.p->sdet.k1 = k1;
 | 
					    rxa.snba.p->sdet.k1 = k1;
 | 
				
			||||||
    rxa.csDSP.unlock();
 | 
					    rxa.csDSP.unlock();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SNBA::SetSNBAk2 (RXA& rxa, float k2)
 | 
					void SNBA::SetSNBAk2 (RXA& rxa, double k2)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    rxa.csDSP.lock();
 | 
					    rxa.csDSP.lock();
 | 
				
			||||||
    rxa.snba.p->sdet.k2 = k2;
 | 
					    rxa.snba.p->sdet.k2 = k2;
 | 
				
			||||||
@ -709,21 +742,19 @@ void SNBA::SetSNBApostsamps (RXA& rxa, int postsamps)
 | 
				
			|||||||
    rxa.csDSP.unlock();
 | 
					    rxa.csDSP.unlock();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SNBA::SetSNBApmultmin (RXA& rxa, float pmultmin)
 | 
					void SNBA::SetSNBApmultmin (RXA& rxa, double pmultmin)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    rxa.csDSP.lock();
 | 
					    rxa.csDSP.lock();
 | 
				
			||||||
    rxa.snba.p->scan.pmultmin = pmultmin;
 | 
					    rxa.snba.p->scan.pmultmin = pmultmin;
 | 
				
			||||||
    rxa.csDSP.unlock();
 | 
					    rxa.csDSP.unlock();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SNBA::SetSNBAOutputBandwidth (RXA& rxa, float flow, float fhigh)
 | 
					void SNBA::SetSNBAOutputBandwidth (RXA& rxa, double flow, double fhigh)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SNBA *a;
 | 
					    SNBA *a = rxa.snba.p;
 | 
				
			||||||
    RESAMPLE *d;
 | 
					    RESAMPLE *d = a->outresamp;
 | 
				
			||||||
    float f_low, f_high;
 | 
					    double f_low, f_high;
 | 
				
			||||||
    rxa.csDSP.lock();
 | 
					    rxa.csDSP.lock();
 | 
				
			||||||
    a = rxa.snba.p;
 | 
					 | 
				
			||||||
    d = a->outresamp;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (flow >= 0 && fhigh >= 0)
 | 
					    if (flow >= 0 && fhigh >= 0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -741,7 +772,7 @@ void SNBA::SetSNBAOutputBandwidth (RXA& rxa, float flow, float fhigh)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    else if (flow < 0 && fhigh > 0)
 | 
					    else if (flow < 0 && fhigh > 0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        float absmax = std::max (-flow, fhigh);
 | 
					        double absmax = std::max (-flow, fhigh);
 | 
				
			||||||
        if (absmax <  a->out_low_cut) absmax =  a->out_low_cut;
 | 
					        if (absmax <  a->out_low_cut) absmax =  a->out_low_cut;
 | 
				
			||||||
        f_low = a->out_low_cut;
 | 
					        f_low = a->out_low_cut;
 | 
				
			||||||
        f_high = std::min (a->out_high_cut, absmax);
 | 
					        f_high = std::min (a->out_high_cut, absmax);
 | 
				
			||||||
@ -751,183 +782,4 @@ void SNBA::SetSNBAOutputBandwidth (RXA& rxa, float flow, float fhigh)
 | 
				
			|||||||
    rxa.csDSP.unlock();
 | 
					    rxa.csDSP.unlock();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace
 | 
				
			||||||
/********************************************************************************************************
 | 
					 | 
				
			||||||
*                                                                                                       *
 | 
					 | 
				
			||||||
*                                       BPSNBA Bandpass Filter                                          *
 | 
					 | 
				
			||||||
*                                                                                                       *
 | 
					 | 
				
			||||||
********************************************************************************************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// This is a thin wrapper for a notched-bandpass filter (nbp).  The basic difference is that it provides
 | 
					 | 
				
			||||||
// for its input and output to happen at different points in the processing pipeline.  This means it must
 | 
					 | 
				
			||||||
// include a buffer, 'buff'.  Its input and output are done via functions xbpshbain() and xbpshbaout().
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BPSNBA::calc_bpsnba (BPSNBA *a)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    a->buff = new float[a->size * 2]; // (float *) malloc0 (a->size * sizeof (complex));
 | 
					 | 
				
			||||||
    a->bpsnba = NBP::create_nbp (
 | 
					 | 
				
			||||||
        1,                          // run, always runs (use bpsnba 'run')
 | 
					 | 
				
			||||||
        a->run_notches,             // run the notches
 | 
					 | 
				
			||||||
        0,                          // position variable for nbp (not for bpsnba), always 0
 | 
					 | 
				
			||||||
        a->size,                    // buffer size
 | 
					 | 
				
			||||||
        a->nc,                      // number of filter coefficients
 | 
					 | 
				
			||||||
        a->mp,                      // minimum phase flag
 | 
					 | 
				
			||||||
        a->buff,                    // pointer to input buffer
 | 
					 | 
				
			||||||
        a->out,                     // pointer to output buffer
 | 
					 | 
				
			||||||
        a->f_low,                   // lower filter frequency
 | 
					 | 
				
			||||||
        a->f_high,                  // upper filter frequency
 | 
					 | 
				
			||||||
        a->rate,                    // sample rate
 | 
					 | 
				
			||||||
        a->wintype,                 // wintype
 | 
					 | 
				
			||||||
        a->gain,                    // gain
 | 
					 | 
				
			||||||
        a->autoincr,                // auto-increase notch width if below min
 | 
					 | 
				
			||||||
        a->maxpb,                   // max number of passbands
 | 
					 | 
				
			||||||
        a->ptraddr);                // addr of database pointer
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
BPSNBA* BPSNBA::create_bpsnba (
 | 
					 | 
				
			||||||
    int run,
 | 
					 | 
				
			||||||
    int run_notches,
 | 
					 | 
				
			||||||
    int position,
 | 
					 | 
				
			||||||
    int size,
 | 
					 | 
				
			||||||
    int nc,
 | 
					 | 
				
			||||||
    int mp,
 | 
					 | 
				
			||||||
    float* in,
 | 
					 | 
				
			||||||
    float* out,
 | 
					 | 
				
			||||||
    int rate,
 | 
					 | 
				
			||||||
    float abs_low_freq,
 | 
					 | 
				
			||||||
    float abs_high_freq,
 | 
					 | 
				
			||||||
    float f_low,
 | 
					 | 
				
			||||||
    float f_high,
 | 
					 | 
				
			||||||
    int wintype,
 | 
					 | 
				
			||||||
    float gain,
 | 
					 | 
				
			||||||
    int autoincr,
 | 
					 | 
				
			||||||
    int maxpb,
 | 
					 | 
				
			||||||
    NOTCHDB* ptraddr
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    BPSNBA *a = new BPSNBA;
 | 
					 | 
				
			||||||
    a->run = run;
 | 
					 | 
				
			||||||
    a->run_notches = run_notches;
 | 
					 | 
				
			||||||
    a->position = position;
 | 
					 | 
				
			||||||
    a->size = size;
 | 
					 | 
				
			||||||
    a->nc = nc;
 | 
					 | 
				
			||||||
    a->mp = mp;
 | 
					 | 
				
			||||||
    a->in = in;
 | 
					 | 
				
			||||||
    a->out = out;
 | 
					 | 
				
			||||||
    a->rate = rate;
 | 
					 | 
				
			||||||
    a->abs_low_freq = abs_low_freq;
 | 
					 | 
				
			||||||
    a->abs_high_freq = abs_high_freq;
 | 
					 | 
				
			||||||
    a->f_low = f_low;
 | 
					 | 
				
			||||||
    a->f_high = f_high;
 | 
					 | 
				
			||||||
    a->wintype = wintype;
 | 
					 | 
				
			||||||
    a->gain = gain;
 | 
					 | 
				
			||||||
    a->autoincr = autoincr;
 | 
					 | 
				
			||||||
    a->maxpb = maxpb;
 | 
					 | 
				
			||||||
    a->ptraddr = ptraddr;
 | 
					 | 
				
			||||||
    calc_bpsnba (a);
 | 
					 | 
				
			||||||
    return a;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BPSNBA::decalc_bpsnba (BPSNBA *a)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    NBP::destroy_nbp (a->bpsnba);
 | 
					 | 
				
			||||||
    delete[] (a->buff);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BPSNBA::destroy_bpsnba (BPSNBA *a)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    decalc_bpsnba (a);
 | 
					 | 
				
			||||||
    delete[] (a);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BPSNBA::flush_bpsnba (BPSNBA *a)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    memset (a->buff, 0, a->size * sizeof (wcomplex));
 | 
					 | 
				
			||||||
    NBP::flush_nbp (a->bpsnba);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BPSNBA::setBuffers_bpsnba (BPSNBA *a, float* in, float* out)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    decalc_bpsnba (a);
 | 
					 | 
				
			||||||
    a->in = in;
 | 
					 | 
				
			||||||
    a->out = out;
 | 
					 | 
				
			||||||
    calc_bpsnba (a);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BPSNBA::setSamplerate_bpsnba (BPSNBA *a, int rate)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    decalc_bpsnba (a);
 | 
					 | 
				
			||||||
    a->rate = rate;
 | 
					 | 
				
			||||||
    calc_bpsnba (a);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BPSNBA::setSize_bpsnba (BPSNBA *a, int size)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    decalc_bpsnba (a);
 | 
					 | 
				
			||||||
    a->size = size;
 | 
					 | 
				
			||||||
    calc_bpsnba (a);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BPSNBA::xbpsnbain (BPSNBA *a, int position)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (a->run && a->position == position)
 | 
					 | 
				
			||||||
        memcpy (a->buff, a->in, a->size * sizeof (wcomplex));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BPSNBA::xbpsnbaout (BPSNBA *a, int position)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (a->run && a->position == position)
 | 
					 | 
				
			||||||
        NBP::xnbp (a->bpsnba, 0);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BPSNBA::recalc_bpsnba_filter (BPSNBA *a, int update)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // Call anytime one of the parameters listed below has been changed in
 | 
					 | 
				
			||||||
    // the BPSNBA struct.
 | 
					 | 
				
			||||||
    NBP *b = a->bpsnba;
 | 
					 | 
				
			||||||
    b->fnfrun = a->run_notches;
 | 
					 | 
				
			||||||
    b->flow = a->f_low;
 | 
					 | 
				
			||||||
    b->fhigh = a->f_high;
 | 
					 | 
				
			||||||
    b->wintype = a->wintype;
 | 
					 | 
				
			||||||
    b->gain = a->gain;
 | 
					 | 
				
			||||||
    b->autoincr = a->autoincr;
 | 
					 | 
				
			||||||
    NBP::calc_nbp_impulse (b);
 | 
					 | 
				
			||||||
    FIRCORE::setImpulse_fircore (b->p, b->impulse, update);
 | 
					 | 
				
			||||||
    delete[] (b->impulse);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/********************************************************************************************************
 | 
					 | 
				
			||||||
*                                                                                                       *
 | 
					 | 
				
			||||||
*                                           RXA Properties                                              *
 | 
					 | 
				
			||||||
*                                                                                                       *
 | 
					 | 
				
			||||||
********************************************************************************************************/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BPSNBA::BPSNBASetNC (RXA& rxa, int nc)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    BPSNBA *a;
 | 
					 | 
				
			||||||
    rxa.csDSP.lock();
 | 
					 | 
				
			||||||
    a = rxa.bpsnba.p;
 | 
					 | 
				
			||||||
    if (a->nc != nc)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        a->nc = nc;
 | 
					 | 
				
			||||||
        a->bpsnba->nc = a->nc;
 | 
					 | 
				
			||||||
        NBP::setNc_nbp (a->bpsnba);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    rxa.csDSP.unlock();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void BPSNBA::BPSNBASetMP (RXA& rxa, int mp)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    BPSNBA *a;
 | 
					 | 
				
			||||||
    a = rxa.bpsnba.p;
 | 
					 | 
				
			||||||
    if (a->mp != mp)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        a->mp = mp;
 | 
					 | 
				
			||||||
        a->bpsnba->mp = a->mp;
 | 
					 | 
				
			||||||
        NBP::setMp_nbp (a->bpsnba);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
} // namespace WDSP
 | 
					 | 
				
			||||||
@ -28,14 +28,12 @@ warren@wpratt.com
 | 
				
			|||||||
#ifndef wdsp_snba_h
 | 
					#ifndef wdsp_snba_h
 | 
				
			||||||
#define wdsp_snba_h
 | 
					#define wdsp_snba_h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "export.h"
 | 
					namespace WDSP{
 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace WDSP {
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RESAMPLE;
 | 
					class RESAMPLE;
 | 
				
			||||||
class RXA;
 | 
					class RXA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class WDSP_API SNBA
 | 
					class SNBA
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    int run;
 | 
					    int run;
 | 
				
			||||||
@ -79,8 +77,8 @@ public:
 | 
				
			|||||||
    } exec;
 | 
					    } exec;
 | 
				
			||||||
    struct _det
 | 
					    struct _det
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        float k1;
 | 
					        double k1;
 | 
				
			||||||
        float k2;
 | 
					        double k2;
 | 
				
			||||||
        int b;
 | 
					        int b;
 | 
				
			||||||
        int pre;
 | 
					        int pre;
 | 
				
			||||||
        int post;
 | 
					        int post;
 | 
				
			||||||
@ -89,7 +87,7 @@ public:
 | 
				
			|||||||
    } sdet;
 | 
					    } sdet;
 | 
				
			||||||
    struct _scan
 | 
					    struct _scan
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        float pmultmin;
 | 
					        double pmultmin;
 | 
				
			||||||
    } scan;
 | 
					    } scan;
 | 
				
			||||||
    struct _wrk
 | 
					    struct _wrk
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -107,8 +105,8 @@ public:
 | 
				
			|||||||
        float* asolve_r;
 | 
					        float* asolve_r;
 | 
				
			||||||
        float* asolve_z;
 | 
					        float* asolve_z;
 | 
				
			||||||
    } wrk;
 | 
					    } wrk;
 | 
				
			||||||
    float out_low_cut;
 | 
					    double out_low_cut;
 | 
				
			||||||
    float out_high_cut;
 | 
					    double out_high_cut;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static SNBA* create_snba (
 | 
					    static SNBA* create_snba (
 | 
				
			||||||
        int run,
 | 
					        int run,
 | 
				
			||||||
@ -121,33 +119,37 @@ public:
 | 
				
			|||||||
        int xsize,
 | 
					        int xsize,
 | 
				
			||||||
        int asize,
 | 
					        int asize,
 | 
				
			||||||
        int npasses,
 | 
					        int npasses,
 | 
				
			||||||
        float k1,
 | 
					        double k1,
 | 
				
			||||||
        float k2,
 | 
					        double k2,
 | 
				
			||||||
        int b,
 | 
					        int b,
 | 
				
			||||||
        int pre,
 | 
					        int pre,
 | 
				
			||||||
        int post,
 | 
					        int post,
 | 
				
			||||||
        float pmultmin,
 | 
					        double pmultmin,
 | 
				
			||||||
        float out_low_cut,
 | 
					        double out_low_cut,
 | 
				
			||||||
        float out_high_cut
 | 
					        double out_high_cut
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    static void destroy_snba (SNBA *d);
 | 
					    static void destroy_snba (SNBA *d);
 | 
				
			||||||
    static void flush_snba (SNBA *d);
 | 
					    static void flush_snba (SNBA *d);
 | 
				
			||||||
    static void xsnba (SNBA *d);
 | 
					    static void xsnba (SNBA *d);
 | 
				
			||||||
    static void setBuffers_snba (SNBA *a, float* in, float* out);
 | 
					    static void setBuffers_snba (SNBA *a, float* in, float* out);
 | 
				
			||||||
    static void setSamplerate_snba (SNBA *a, int rate);
 | 
					    static void setSamplerate_snba (SNBA *a, int rate);
 | 
				
			||||||
    static void setSize_snba (SNBA *a, int size);
 | 
					    static void setSize_snba (SNBA *a, int size);
 | 
				
			||||||
    // RXA
 | 
					    // RXA Properties
 | 
				
			||||||
    static void SetSNBAOutputBandwidth (RXA& rxa, float flow, float fhigh);
 | 
					 | 
				
			||||||
    static void SetSNBARun (RXA& rxa, int run);
 | 
					    static void SetSNBARun (RXA& rxa, int run);
 | 
				
			||||||
    static void SetSNBAovrlp (RXA& rxa, int ovrlp);
 | 
					    static void SetSNBAovrlp (RXA& rxa, int ovrlp);
 | 
				
			||||||
    static void SetSNBAasize (RXA& rxa, int size);
 | 
					    static void SetSNBAasize (RXA& rxa, int size);
 | 
				
			||||||
    static void SetSNBAnpasses (RXA& rxa, int npasses);
 | 
					    static void SetSNBAnpasses (RXA& rxa, int npasses);
 | 
				
			||||||
    static void SetSNBAk1 (RXA& rxa, float k1);
 | 
					    static void SetSNBAk1 (RXA& rxa, double k1);
 | 
				
			||||||
    static void SetSNBAk2 (RXA& rxa, float k2);
 | 
					    static void SetSNBAk2 (RXA& rxa, double k2);
 | 
				
			||||||
    static void SetSNBAbridge (RXA& rxa, int bridge);
 | 
					    static void SetSNBAbridge (RXA& rxa, int bridge);
 | 
				
			||||||
    static void SetSNBApresamps (RXA& rxa, int presamps);
 | 
					    static void SetSNBApresamps (RXA& rxa, int presamps);
 | 
				
			||||||
    static void SetSNBApostsamps (RXA& rxa, int postsamps);
 | 
					    static void SetSNBApostsamps (RXA& rxa, int postsamps);
 | 
				
			||||||
    static void SetSNBApmultmin (RXA& rxa, float pmultmin);
 | 
					    static void SetSNBApmultmin (RXA& rxa, double pmultmin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static void SetSNBAOutputBandwidth (RXA& rxa, double flow, double fhigh);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    static void calc_snba (SNBA *d);
 | 
					    static void calc_snba (SNBA *d);
 | 
				
			||||||
@ -177,7 +179,7 @@ private:
 | 
				
			|||||||
    static int scanFrame(
 | 
					    static int scanFrame(
 | 
				
			||||||
        int xsize,
 | 
					        int xsize,
 | 
				
			||||||
        int pval,
 | 
					        int pval,
 | 
				
			||||||
        float pmultmin,
 | 
					        double pmultmin,
 | 
				
			||||||
        int* det,
 | 
					        int* det,
 | 
				
			||||||
        int* bimp,
 | 
					        int* bimp,
 | 
				
			||||||
        int* limp,
 | 
					        int* limp,
 | 
				
			||||||
@ -189,73 +191,7 @@ private:
 | 
				
			|||||||
    static void execFrame(SNBA *d, float* x);
 | 
					    static void execFrame(SNBA *d, float* x);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace
 | 
				
			||||||
class NBP;
 | 
					 | 
				
			||||||
class NOTCHDB;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class WDSP_API BPSNBA
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
    int run;                        // run the filter
 | 
					 | 
				
			||||||
    int run_notches;                // use the notches, vs straight bandpass
 | 
					 | 
				
			||||||
    int position;                   // position in the processing pipeline
 | 
					 | 
				
			||||||
    int size;                       // buffer size
 | 
					 | 
				
			||||||
    int nc;                         // number of filter coefficients
 | 
					 | 
				
			||||||
    int mp;                         // minimum phase flag
 | 
					 | 
				
			||||||
    float* in;                     // input buffer
 | 
					 | 
				
			||||||
    float* out;                    // output buffer
 | 
					 | 
				
			||||||
    int rate;                       // sample rate
 | 
					 | 
				
			||||||
    float* buff;                   // internal buffer
 | 
					 | 
				
			||||||
    NBP *bpsnba;                    // pointer to the notched bandpass filter, nbp
 | 
					 | 
				
			||||||
    float f_low;                   // low cutoff frequency
 | 
					 | 
				
			||||||
    float f_high;                  // high cutoff frequency
 | 
					 | 
				
			||||||
    float abs_low_freq;            // lowest positive freq supported by SNB
 | 
					 | 
				
			||||||
    float abs_high_freq;           // highest positive freq supported by SNG
 | 
					 | 
				
			||||||
    int wintype;                    // filter window type
 | 
					 | 
				
			||||||
    float gain;                    // filter gain
 | 
					 | 
				
			||||||
    int autoincr;                   // use auto increment for notch width
 | 
					 | 
				
			||||||
    int maxpb;                      // maximum passband segments supported
 | 
					 | 
				
			||||||
    NOTCHDB* ptraddr;               // pointer to address of NOTCH DATABASE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    static BPSNBA* create_bpsnba (
 | 
					 | 
				
			||||||
        int run,
 | 
					 | 
				
			||||||
        int run_notches,
 | 
					 | 
				
			||||||
        int position,
 | 
					 | 
				
			||||||
        int size,
 | 
					 | 
				
			||||||
        int nc,
 | 
					 | 
				
			||||||
        int mp,
 | 
					 | 
				
			||||||
        float* in,
 | 
					 | 
				
			||||||
        float* out,
 | 
					 | 
				
			||||||
        int rate,
 | 
					 | 
				
			||||||
        float abs_low_freq,
 | 
					 | 
				
			||||||
        float abs_high_freq,
 | 
					 | 
				
			||||||
        float f_low,
 | 
					 | 
				
			||||||
        float f_high,
 | 
					 | 
				
			||||||
        int wintype,
 | 
					 | 
				
			||||||
        float gain,
 | 
					 | 
				
			||||||
        int autoincr,
 | 
					 | 
				
			||||||
        int maxpb,
 | 
					 | 
				
			||||||
        NOTCHDB* ptraddr
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
    static void destroy_bpsnba (BPSNBA *a);
 | 
					 | 
				
			||||||
    static void flush_bpsnba (BPSNBA *a);
 | 
					 | 
				
			||||||
    static void setBuffers_bpsnba (BPSNBA *a, float* in, float* out);
 | 
					 | 
				
			||||||
    static void setSamplerate_bpsnba (BPSNBA *a, int rate);
 | 
					 | 
				
			||||||
    static void setSize_bpsnba (BPSNBA *a, int size);
 | 
					 | 
				
			||||||
    static void xbpsnbain (BPSNBA *a, int position);
 | 
					 | 
				
			||||||
    static void xbpsnbaout (BPSNBA *a, int position);
 | 
					 | 
				
			||||||
    static void recalc_bpsnba_filter (BPSNBA *a, int update);
 | 
					 | 
				
			||||||
    // RXA
 | 
					 | 
				
			||||||
    static void BPSNBASetNC (RXA& rxa, int nc);
 | 
					 | 
				
			||||||
    static void BPSNBASetMP (RXA& rxa, int mp);
 | 
					 | 
				
			||||||
    static void bpsnbaCheck (RXA& rxa, int mode, int notch_run);
 | 
					 | 
				
			||||||
    static void bpsnbaSet (RXA& rxa);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
    static void calc_bpsnba (BPSNBA *a);
 | 
					 | 
				
			||||||
    static void decalc_bpsnba (BPSNBA *a);
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
} // namespace WDSP
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user