On 04/02/2019 01:34 AM, Koyel Das (Vehere) via USRP-users wrote:
Hi,
I am using the given code for data receiving from two channels. I need
to do LO sharing for phase coherent application, which is done as
shown in the code and externally as shown in the image attached but I
am not getting constant phase difference.
We have connected one antenna to input of a power splitter and then
connected two output ports of the splitter to two ports of USRP. We
are receiving signals (say noise) from these two ports of USRP. We are
dividing the whole chunk (5*10^6 samples) of data into 5000 chunks
each having 1000 continuous samples. Then we are doing FFT of each of
the chunk of 1000 samples and multiplying the results from the two
channels. Then averaging 1000 chunks of the multiplication
(cross-power) together so we are left with 5 averaged chunks each of
1000 samples of cross-power. The phase of the cross power is
omega(td1-td2), where omega is 2*pi*frequency and td1 is the time
delay of channel1, td2:time delay of channel2. so omega(td1-td2) is
the phase difference. Since we are doing averaging the noise effect
should reduce to 0 and we should get phase difference due to time
delays due to internal circuitry. Now since frequencies are in the
range of 2.4*10^9 to 2.401*10^9 for 1 MHz bandwidth and td1-td2 is
also expected to be very small so omega(td1-td2) for this frequency
range would be almost identical, which is not happening.
In short I am not getting constant phase difference. I have also made
connections as shown in the attached figure. What is missing in the
code below:
What USRP are you using? I'm *guessing* X310 with TwinRx cards?
If so, you just need the standard "criss cross" arrangement of LO jumper
cables between the two TwinRX--there's no need to bring the signals
external to the box.
Also, to align the timekeepers in the two radio blocks in the FPGA,
you'll have to insert a set_time_unknown_pps() in your setup code. This will
make sure the streams are aligned.
----------------------------------------------------------------------------------------------------------------------------------------
#include "vdds_device.h"
#include "vdds_util.h"
#include "vdds_device_interface.h"
#include <uhd/utils/safe_main.hpp>
#include <uhd/usrp/multi_usrp.hpp>
#include <iostream>
#include <fstream>
#include <complex>
#include <thread>
#include <chrono>
#include <QFile>
#include <vector>
#include <string>
VDDSDevice::VDDSDevice()
{
deviceIPAddress="addr0=192.168.10.2";
gain=70;
sampleRate=1e6;
bandwidth=1e6;
buffer=NULL;
frequncy=2422e6;
numberOfChannel=0;
wrapped=false;
}
void VDDSDevice::init()
{
usrp = uhd::usrp::multi_usrp::make(deviceIPAddress.toStdString());
uhd::usrp::subdev_spec_t subdevClass = std::string("A:0 A:1 B:0 B:1");
usrp->set_rx_subdev_spec(subdevClass);
numberOfChannel=usrp->get_rx_num_channels();
std::cout<<"NUmber Of Channels : "<<numberOfChannel<<std::endl;
usrp->set_rx_rate(sampleRate);
//Doing changes (sharing LOs)
usrp->set_rx_lo_freq(frequncy+(sampleRate/2),"LO1",2);
std::cout<<usrp->get_rx_lo_freq("LO1",2);
usrp->set_rx_lo_source("internal",usrp->ALL_LOS,2);
usrp->set_rx_lo_export_enabled(true,usrp->ALL_LOS,2);
usrp->set_rx_lo_freq(usrp->get_rx_lo_freq("LO1",2),"LO1",3);
usrp->set_rx_lo_source("companion",usrp->ALL_LOS,3);
usrp->set_rx_lo_freq(usrp->get_rx_lo_freq("LO1",2),"LO1",0);
usrp->set_rx_lo_source("external",usrp->ALL_LOS,0);
usrp->set_rx_lo_freq(usrp->get_rx_lo_freq("LO1",2),"LO1",1);
usrp->set_rx_lo_source("external",usrp->ALL_LOS,1);
// Changes done */
for(size_t count=0;count<usrp->get_rx_num_channels();count++){
usrp->set_rx_gain(gain,count);
usrp->set_rx_bandwidth(bandwidth,count);
//usrp->set_rx_freq(frequncy,count);
std::cout<<"Antenna : "<<usrp->get_rx_antenna(count)<<" is for
channel : "<<count<<std::endl;
}
uhd::stream_args_t streamArgs("fc32");
for (size_t i = 0; i < usrp->get_rx_num_channels(); i++){
streamArgs.channels.push_back(i);
}
rxStream = usrp->get_rx_stream(streamArgs);
MAX_SAMPLE_PER_PACKET=rxStream->get_max_num_samps();
if(buffer==NULL){
for(size_t count=0;count<MAX_CHANNEL_SUPPORTS;count++){
channelBuffers[count]=new
std::complex<float>[(MAX_SAMPLE_REQUIRED_FOR_DD/MAX_SAMPLE_PER_PACKET)*MAX_SAMPLE_PER_PACKET+MAX_SAMPLE_PER_PACKET];
}
buffer=new
std::vector<std::complex<float>*>[(MAX_SAMPLE_REQUIRED_FOR_DD/MAX_SAMPLE_PER_PACKET)+1];
for(size_t
count=0;count<(MAX_SAMPLE_REQUIRED_FOR_DD/MAX_SAMPLE_PER_PACKET)+1;count++){
for(size_t channel=0;channel<MAX_CHANNEL_SUPPORTS;channel++){
buffer[count].push_back(channelBuffers[channel]+(count*MAX_SAMPLE_PER_PACKET));
}
}
}
uhd::stream_cmd_t
stream_cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
stream_cmd.num_samps = MAX_SAMPLE_PER_PACKET;
stream_cmd.stream_now = true;
stream_cmd.time_spec = uhd::time_spec_t(0.0);
rxStream->issue_stream_cmd(stream_cmd);
}
void VDDSDevice::setFrequency(double frequncy){
for(size_t count=0;count<numberOfChannel;count++){
usrp->set_rx_freq(frequncy,count);
}
wrapped=false;
totalNumberOfSamplesRceived=0;
this->frequncy=frequncy;
}
void VDDSDevice::receiveBuffer(double frequncy,size_t
totalNumberOfSamplesRequired){
uhd::rx_metadata_t md;
totalNumberOfSamplesRceived=0;
double timeout = 0.1;
size_t sampleReceived = 0;
setFrequency(frequncy);
while(startFlag){
sampleReceived =
rxStream->recv(buffer[totalNumberOfSamplesRceived/MAX_SAMPLE_PER_PACKET],
MAX_SAMPLE_PER_PACKET, md, timeout,true);
if (md.error_code != uhd::rx_metadata_t::ERROR_CODE_NONE){
std::cout<<"ERROR : "<<md.to_pp_string()<<"ERROR CODE :
"<<md.error_code<<" FOR DEVICE : "<<deviceIPAddress.toStdString()<<".
Total Sample Received : "<<totalNumberOfSamplesRceived<<std::endl;
}
if(sampleReceived!=MAX_SAMPLE_PER_PACKET){
std::cout<<MAX_SAMPLE_PER_PACKET<<" != "<<sampleReceived<<","<<std::endl;
}
if(VDDSDeviceInterface::startScanFlag){
totalNumberOfSamplesRceived+=sampleReceived;
if(totalNumberOfSamplesRceived>=totalNumberOfSamplesRequired){
totalNumberOfSamplesRceived=0;
std::cout<<"Wrapping"<<std::endl;
wrapped=true;
}
}
}
}
void VDDSDevice::run(){
startFlag=true;
init();
receiveBuffer(frequncy,MAX_SAMPLE_REQUIRED_FOR_DD);
}
void VDDSDevice::stop(){
startFlag=false;
}
void VDDSDevice::flushToFiles(const char *directory){
char fileName[256]={0};
unsigned long long int ts=VDDSUtil::getTimeInMicro();
size_t totalSamples;
std::complex<float> *channelBuffer=NULL;
for(size_t count=0;count<numberOfChannel;count++){
getChannelDataSamples(count,&channelBuffer,totalSamples);
if(totalSamples && channelBuffer){
sprintf(fileName,"%s/%llu_%u.cfile",directory,ts,(unsigned int)count);
QFile file(fileName);
if(file.open(QFile::WriteOnly|QFile::Truncate)){
file.write((char*)channelBuffer,MAX_SAMPLE_REQUIRED_FOR_DD*sizeof(std::complex<float>));
file.close();
}
}
}
}
std::complex<float> * VDDSDevice::getChannelDataSamples(size_t channel){
if(channel >= MAX_CHANNEL_SUPPORTS){
return NULL;
}
std::cout<<channel<<","<<std::endl;
return channelBuffers[channel];
}
void VDDSDevice::getChannelDataSamples(size_t
channel,std::complex<float> **samples,size_t &totalSamples){
totalSamples=MAX_SAMPLE_REQUIRED_FOR_DD;
if(MAX_SAMPLE_REQUIRED_FOR_DD==0 || channel >= MAX_CHANNEL_SUPPORTS){
*samples=NULL;
totalSamples=0;
return;
}
*samples=channelBuffers[channel];
}
--------------------------------------------------------------------------------------------------------------------------------------------------------Regards,
Koyel Das
Senior – Product Engineer
Vehere | Proactive Communications Intelligence & Cyber Defence
M: +919051132173 | T: +91 33 40545454 | F: +91 33 40545455 | W:
www.vehere.com <http://www.vehere.com/>/
/
/unnamed
<https://www.linkedin.com/company/vehere-interactive-p-ltd>unnamed (1)
<https://twitter.com/VehereIndia>unnamed (2)
<https://www.facebook.com/VehereIndia/>
Vehere is the proud recipient of the Fastest Growing Technology
Company Awards in India & Asia since 2012!/
The content of this e-mail is confidential and intended solely for the
use of the addressee. The text of this email (including any
attachments) may contain information, which is proprietary and/or
confidential or privileged in nature belonging to Vehere Interactive
Pvt Ltd and/or its associates/ group companies/ subsidiaries. If you
are not the addressee, or the person responsible for delivering it to
the addressee, any disclosure, copying, distribution or any action
taken or omitted to be taken in reliance on it is prohibited and may
be unlawful. If you have received this e-mail in error, please notify
the sender and remove this communication entirely from your system.
The recipient acknowledges that no guarantee or any warranty is given
as to completeness and accuracy of the content of the email. The
recipient further acknowledges that the views contained in the email
message are those of the sender and may not necessarily reflect those
of Vehere Interactive Pvt Ltd. Before opening and accessing the
attachment please check and scan for virus. WARNING: Computer viruses
can be transmitted via email. The recipient should check this email
and any attachments for the presence of viruses. The company accepts
no liability for any damage caused by any virus transmitted by this email.
_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com
_______________________________________________
USRP-users mailing list
USRP-users@lists.ettus.com
http://lists.ettus.com/mailman/listinfo/usrp-users_lists.ettus.com