static std::shared_ptr<FeatureChannels_> mulSpectrumsFeatures(const cv::Mat& Af,
                const std::shared_ptr<FeatureChannels_>& Bf,
                bool conjBf = false) {
            std::shared_ptr<FeatureChannels_> resf(new FeatureChannels_());

            for (int i = 0; i < NUMBER_OF_CHANNELS; ++i)
            { mulSpectrums(Af, Bf->channels[i], resf->channels[i], 0, conjBf); }

            return resf;
        }
int main(int argc, char *argv[])
{                        
	ofstream resf("res.dat");
	long num;
	long loops=12;
	long i;
	double snr=11.0;
	long paths=3;

	if (argc!=4) {
	  num = 100000;
	} else {
	  num = ((long)atof(argv[1]));       // Number of symbols simulated 
	  snr = atof(argv[2]);               // SNR dBs
	  paths = ((long)atof(argv[3]));     // Number of multipath paths
	}

	baud_eq_env Environment(paths);
	long rcv_symbols=0;
	long symbols=0;
	Environment.num = num;

	time_t current_time;
	time(&current_time);
	noise random_offset;
	random_offset.set_seed((double)(current_time*10));

	// MAIN LOOP
	for (i=0;i<loops;i++) {
	  snr -= 1;
	  Environment.snr = snr;
	  Environment.loop_init();
	  symbols = 0;

	  do {
		Environment.step();
		// Get data output from Chip
		Environment.BER_mon->synchronize(&symbols,Environment.data);
		// Correlate with reference PN
		if (Environment.BER_mon->found_sync())
		  Environment.BER_mon->ber_results(symbols++); 
		else symbols++;
		if (Environment.rcv_symbols > num && !Environment.BER_mon->found_sync()) break;
	  } while (symbols < num);

	  cout << " SNR = " << snr << " BER = " << Environment.BER_mon->ber(symbols) << '\n';
	  resf << snr << " " <<  Environment.BER_mon->ber(symbols) << '\n';
	  Environment.BER_mon->final_results(symbols);
	  Environment.loop_end();
	}
	resf.close();
	return(1);
}                                      
int main(int argc, char *argv[])
{                        
    void usage(void);
#ifdef _DEBUG
	ofstream sampf("samp.dat");
	ofstream resf("res.dat");
#endif
	long num;
	double snr=9.0;
	double timing_offset=0.0;

	if (argc<3) {
	  num = 600;
	} else if (argc!=3) {
	  usage();
	} else {
	  num = ((long)atof(argv[1]));       // Number of symbols simulated 
	  snr = atof(argv[2]);   // Unfiltered noise std dev	
	}

	double actual_over=4.00;
	sim_equalizer Environment(4,3);
	long rcv_symbols=0;
	long symbols=0;

	Environment.num = num;
	Environment.snr = snr;

	time_t current_time;
	time(&current_time);
	noise random_offset;
	random_offset.set_seed((double)(current_time*10));

	Environment.loop_init();
//	Environment.BER_mon->init_delay(68); // makes correlation occur earlier
	symbols = 0;

	// MAIN LOOP
	do {
	  Environment.step();
#ifdef _DEBUG
	  sampf.width(4);
	  sampf.setf(ios::fixed);
	  sampf << Environment.base.re << " ";
	  sampf << Environment.base.im << '\n';
#endif

//	  if (Environment.DUT->symclk()==1) {
		if (Environment.rcv_symbols > WAITSYMBOLS )  {                    
		  // Get data output from Chip
		  Environment.BER_mon->synchronize(&symbols,Environment.data);
		  // Correlate with reference PN
		  if (Environment.BER_mon->found_sync()) Environment.BER_mon->ber_results(symbols++); 
		  else symbols++;
		}
//	  }  				 
	  if (Environment.rcv_symbols > num && !Environment.BER_mon->found_sync()) break;
	} while (symbols < num);

	Environment.BER_mon->final_results(symbols);
	Environment.loop_end();

#ifdef _DEBUG
	sampf.close();
	resf.close();
#endif
	return(1);
}