On 09/04/2018 10:56 AM, Jeremy Foran via USRP-users wrote:
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;
}


Your gain value is set to 2, which is a very low value for most daughterboards. What particular platform are you using (B2xx, N2xx, X3xx)??

Also, you've set the analog bandwidth to 20e6, but are only sampling at 1e6 -- was this your intention?


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

Reply via email to