Forum: GNU Radio Multi antenna transmit with RFX2400

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Jérémy Skelton (Guest)
on 2009-03-24 10:55
(Received via mailing list)
Hi,

I was wondering how I can transmit synchronously on two antenna using
two RFX2400 on the same USRP1 motherboard.
It should be possible as the daugtherboards are MIMO capable but does
anyone have some c++ working piece of code ?

My goal is to implement an Alamouti scheme diversity transmission.

Thanks,
Jérémy
Jérémy Skelton (Guest)
on 2009-03-26 13:37
(Received via mailing list)
Hi, again

I should have precise that I'm mainly interested in some piece of
advise.

In fact, I found the test_mimo_tx.cc in the trunk but it is designed
for usrp2 and I'm not sure about how I can reuse from it.

I also had from other people the following code allowing me to
transmit on both antennas but I don't know what is transmitted on each
antenna as I don't clearly understand where is the separation between
the sides A and B.
How can I say for example which symbol goes on side A and how are side
A and B synchronised when sending different symbol on each ?

int main(int argc,char **argv)
{
   unsigned int i1;
   unsigned int InterpRate;
   unsigned int nchannels, DdcFreq, LOFreq, gain;
   unsigned long RF_freq;
  usrp_standard_rx_sptr rx0, rx1;
  usrp_standard_tx_sptr tx0, tx1;

   db_flexrf_mimo db_aside0,db_bside0;
   db_flexrf_mimo db_aside1,db_bside1;
   struct sched_param sp;

   number_of_buffers_wanted=atoi(argv[1]);
   if (number_of_buffers_wanted>MAX_NUMBER_OF_BUFFERS)
     number_of_buffers_wanted=MAX_NUMBER_OF_BUFFERS;
   if (number_of_buffers_wanted<2)
     number_of_buffers_wanted=2;

   RF_freq=atof(argv[2]);
   gain=atoi(argv[3]);

   InterpRate=16;

   rx0 = usrp_standard_rx::make(0, InterpRate);
   tx0 = usrp_standard_tx::make(0,InterpRate*2,2,47768); //0xBA98   0b
1011 1010 1001 1000

   if (1) {

     unsigned int counter=0;
     bool underrun;

     if(gruel::enable_realtime_scheduling()!=gruel::RT_OK){
       printf("Problems enabeling realtime scheduling!!!\n");
     }

     db_aside0=db_flexrf_mimo(rx0,tx0,0);
     db_bside0=db_flexrf_mimo(rx0,tx0,1);

     db_aside0.configure_tx(0);
     db_aside0.tune_tx(RF_freq,0);
     db_bside0.configure_tx(0);
     db_bside0.tune_tx(RF_freq,0);

     db_aside0.set_tx_auto_tr(true);
     db_bside0.set_tx_auto_tr(true);

     tx0->set_nchannels(2);

     ifstream l("data_to_usrp.dat", ios::binary);
     int i1;
     for (i1=0;i1<number_of_buffers_wanted;i1++)
       l.read((char *) CollectedData[i1],NUMBYTES);

     l.close();

     short* p;

     p=(short *) &CollectedData[0][0];
     for (i1=0;i1<10;i1++) {
         cout << "Buffer=" << *p  << "\n";
         p++;
     };

     tx0->start();

     while (1) {
       tx0->write((void *) CollectedData[counter++%
number_of_buffers_wanted],
                                NUMBYTES,&underrun);
       if (underrun)
         cout << "Underrrun \n";
     };
   };

Le 24-mars-09 à 09:54, Jérémy Skelton a écrit :
Jérémy Skelton (Guest)
on 2009-03-26 13:38
(Received via mailing list)
Hi, again

I should have precise that I'm mainly interested in some piece of
advise.

In fact, I found the test_mimo_tx.cc in the trunk but it is designed
for usrp2 and I'm not sure about how I can reuse from it.

I also had from other people the following code allowing me to
transmit on both antennas but I don't know what is transmitted on each
antenna as I don't clearly understand where is the separation between
the sides A and B.
How can I say for example which symbol goes on side A and how are side
A and B synchronised when sending different symbol on each ?

int main(int argc,char **argv)
{
  unsigned int i1;
  unsigned int InterpRate;
  unsigned int nchannels, DdcFreq, LOFreq, gain;
  unsigned long RF_freq;
  usrp_standard_rx_sptr rx0, rx1;
  usrp_standard_tx_sptr tx0, tx1;

  db_flexrf_mimo db_aside0,db_bside0;
  db_flexrf_mimo db_aside1,db_bside1;
  struct sched_param sp;

  number_of_buffers_wanted=atoi(argv[1]);
  if (number_of_buffers_wanted>MAX_NUMBER_OF_BUFFERS)
    number_of_buffers_wanted=MAX_NUMBER_OF_BUFFERS;
  if (number_of_buffers_wanted<2)
    number_of_buffers_wanted=2;

  RF_freq=atof(argv[2]);
  gain=atoi(argv[3]);

  InterpRate=16;

  rx0 = usrp_standard_rx::make(0, InterpRate);
  tx0 = usrp_standard_tx::make(0,InterpRate*2,2,47768); //0xBA98   0b
1011 1010 1001 1000

  if (1) {

    unsigned int counter=0;
    bool underrun;

    if(gruel::enable_realtime_scheduling()!=gruel::RT_OK){
      printf("Problems enabeling realtime scheduling!!!\n");
    }

    db_aside0=db_flexrf_mimo(rx0,tx0,0);
    db_bside0=db_flexrf_mimo(rx0,tx0,1);

    db_aside0.configure_tx(0);
    db_aside0.tune_tx(RF_freq,0);
    db_bside0.configure_tx(0);
    db_bside0.tune_tx(RF_freq,0);

    db_aside0.set_tx_auto_tr(true);
    db_bside0.set_tx_auto_tr(true);

    tx0->set_nchannels(2);

    ifstream l("data_to_usrp.dat", ios::binary);
    int i1;
    for (i1=0;i1<number_of_buffers_wanted;i1++)
      l.read((char *) CollectedData[i1],NUMBYTES);

    l.close();

    short* p;

    p=(short *) &CollectedData[0][0];
    for (i1=0;i1<10;i1++) {
        cout << "Buffer=" << *p  << "\n";
        p++;
    };

    tx0->start();

    while (1) {
      tx0->write((void *) CollectedData[counter++%
number_of_buffers_wanted],
                               NUMBYTES,&underrun);
      if (underrun)
        cout << "Underrrun \n";
    };
  };

Le 24-mars-09 à 09:54, Jérémy Skelton a écrit :
This topic is locked and can not be replied to.