Hello All,

I'm new to the community and excited to be a part of it.

I am looking to capture the full FM spectrum for a couple of seconds, 88Mhz to 
108Mhz, using the examples supplied by Ettus.  I seem to be getting more zeros 
in the results then I would have expected.  About half of the complex numbers 
will have a zero in it.  Is that normal?  Am I doing something wrong?  Code 
below:

#include <uhd/types/tune_request.hpp>
#include <uhd/utils/thread.hpp>
#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
#include <uhd/transport/udp_simple.hpp>
#include <uhd/exception.hpp>
#include <boost/program_options.hpp>
#include <boost/format.hpp>
#include <iostream>
#include <complex>
#include <chrono>
#include <thread>

using namespace std::chrono;

static bool stop_signal_called = false;
void sig_int_handler(int){stop_signal_called = true;}

namespace po = boost::program_options;

using namespace std;

int UHD_SAFE_MAIN(int argc, char *argv[]){
    uhd::set_thread_priority_safe();

    //variables to be set by po
    std::string args, file, ant, subdev, ref;
    size_t total_num_samps;
    double rate, freq, gain, bw, duration;
    std::string addr, port;

    uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(args);

    //Lock mboard clocks
    usrp->set_clock_source("internal");

    freq    = 98e6;
    gain    = 2;

    rate    = 1e6;
    bw      = 20e6;
    duration= 8;

    //set the rx sample rate
    usrp->set_rx_rate(rate);

    uhd::tune_request_t tune_request(freq);
    usrp->set_rx_freq(tune_request);

    //set the rx rf gain
    usrp->set_rx_gain(gain);

    //set the analog frontend filter bandwidth
    usrp->set_rx_bandwidth(bw);


    //create a receive streamer
    uhd::stream_args_t stream_args("fc32");
    uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args);

    uhd::stream_cmd_t 
stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE);

    const size_t samps_per_buff = rx_stream->get_max_num_samps();

    total_num_samps         = rate * duration;
    stream_cmd.num_samps    = total_num_samps;
    stream_cmd.stream_now   = true;
//    int const buff_size     = rx_stream->get_max_num_samps();

    rx_stream->issue_stream_cmd(stream_cmd);
    uhd::rx_metadata_t md;

    std::vector<std::complex<float>> buff(total_num_samps);

    std::vector<std::complex<float>> sizeor(samps_per_buff);
    const size_t size_of_buff = sizeor.size();

    cout<<"Number of samples to capture: "<<total_num_samps<<endl;
    //allow for some setup time
    std::this_thread::sleep_for(std::chrono::seconds(2));

    ////////////////////////////////////////////////////////////////////////
    cout<<"Starting Capture....."<<endl<<"======================"<<endl;
    milliseconds start_time_ms = duration_cast< milliseconds 
>(system_clock::now().time_since_epoch());

    int index=0;
    while (!md.end_of_burst){
        rx_stream->recv( &buff[index * samps_per_buff], size_of_buff, md);
        index++;
    }

    milliseconds end_time_ms = duration_cast< milliseconds 
>(system_clock::now().time_since_epoch());
    cout<<"Ending Capture....."<<endl<<"======================"<<endl;
    ////////////////////////////////////////////////////////////////////////
//    int x=1;
    int zero        = 0;
    int zero_all    = 0;
    int real        = 0;
    int imag        = 0;

    for (std::complex<float> p: buff){
        if(p.real() == 0){real++;}
        if(p.imag() == 0){imag++;}
        if( (p.real()) == 0 && (p.imag() == 0) ){zero_all++;}
        if( (p.real()) == 0 || (p.imag() == 0) ){zero++;}
    }

    cout<<"Samps     : "<<buff.size()<<endl;
    cout<<"Start     : "<<start_time_ms.count()<<endl;
    cout<<"End       : "<<end_time_ms.count()<<endl;
    cout<<"Total time: "<<end_time_ms.count() - 
start_time_ms.count()<<endl<<endl;

    cout<<"real      :"<<real<<endl;
    cout<<"image     :"<<imag<<endl;
    cout<<"Zeros     :"<<zero<<endl;
    cout<<"Zeros_all :"<<zero_all<<endl<<endl;

    cout<<"Performance :"<<double (double(zero) / double(buff.size()))<<endl;

    std::cout << std::endl << "Done!" << std::endl << std::endl;

    return EXIT_SUCCESS;
}


_______________________________________________
USRP-users mailing list
[email protected]
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com

Reply via email to