Forums

Setting sampling rate of Tektronix VSA? Resampling non-integer rates?

Started by Peter Mairhofer June 14, 2014
Hi,

Is anyone using equipment like a VSA for data capture? Any idea how I
can set the sampling rate in a Tektronix RSA? Whatever I set (e.g. using
SENSe:ACQuisition:BANDwidth or SENSe:IQVTime:FREQuency:SPAN), the
sampling rate is always 150 MHz! Frustrating...


With an Agilent MSG I am transmitting an LTE signal which is sampled at
30.72MHz and to be received by the Tektronix VSA. (But I can set an
arbitrary rate for the MXG). I would really like to have the
"transmitter" and "receiver" to share the same rate to simplify all the
my DSP in MATLAB.

If this is really not possible (how can that be for an expensive box
like this?) what is the fastest way to make my transmitted and received
signals compatible in MATLAB? "resample" only works for integer
multiples of sampling rates. I could also use "upsample" first and then
"downsample" but I immideately get an error that the filter is too large
(or out of memory).

Thanks
Peter

Hi Peter,

I've been using Agilent MXA and earlier Rohde&Schwarz for that purpose.
It may be a hardware limitation (don't know Tektronix) but it's easy to
work around in Matlab. 
I usually work with cyclic signals - the generator plays back a loop - so I
don't need to care about synchronization and the DUT is in thermal steady
state. 

Below some Matlab / Octave resampling code that converts between any
integer number of samples, using ideal lowpass if decimating. 
If you don't want to assume signals are cyclic, use zero padding (using
twice the original length works always). For cyclic signals and Nyquist
resampling, the result is exact to machine precision (~300 dB, give or take
some).

BTW, once the signals are back at the same rate, I use this subroutine for
timing alignment: 
http://www.dsprelated.com/showarticle/26.php

Cheers

Markus

function td = td2td_noncausalResampler(td, n)
    nOld = numel(td);
    realFlag = isreal(td);
    
    if n == nOld
        return;
    end
    
    fd = fft(td);    
    
    if n > nOld
        n1 = ceil(nOld / 2);
        n2 = nOld - n1;
        fd = [fd(1:n1), zeros(1, n-nOld), fd(end-n2+1:end)];
    else
        n1 = ceil(n/2);
        n2 = n - n1;
        fd = fd([1:n1, end-n2+1:end]);
    end
    td = ifft(fd * n / nOld);
    
    if realFlag
        td = real(td);
    end
end
	 

_____________________________		
Posted through www.DSPRelated.com
Hi Markus,

On 2014-06-14 5:40, mnentwig wrote:
> Hi Peter, > > I've been using Agilent MXA and earlier Rohde&Schwarz for that > purpose. It may be a hardware limitation (don't know Tektronix)
So does it mean you also never set the sampling rate explicitely but just used MATLAB postprocessing?
> but it's easy to work around in Matlab. I usually work with cyclic > signals - the generator plays back a loop - so I don't need to care > about synchronization and the DUT is in thermal steady state. > > Below some Matlab / Octave resampling code that converts between any > integer number of samples, using ideal lowpass if decimating. If you > don't want to assume signals are cyclic, use zero padding (using > twice the original length works always). For cyclic signals and > Nyquist resampling, the result is exact to machine precision (~300 > dB, give or take some).
Thanks, that's a great start! I am still not completely sure about it. So td2td_noncausalResampler is just supplied the integer number of samples you want, right? Doesn't this still require an integer multiple between the two sampling rates (same as for "resample")? In my case, fs1=30.72MHz, fs2=150MHz, fs2/fs1=4.8828 Just as an example, an LTE20 signal with 7 symbols, 1 slot gives me 15360 samples at 30.72MHz which I send to the MXG (vector "x"). With the Tektronix I receive 131072 samples at 150MHz (vector "y"). If I understand your code correctly I would use x = td2td_noncausalResampler(x, fs2/fs1) However, that's non-integer. Even if I use periodic repetition, this factor is still non-integer :(
> BTW, once the signals are back at the same rate, I use this > subroutine for timing alignment: > http://www.dsprelated.com/showarticle/26.php
thanks - exactly this I use already - for some time :) Great article! Peter