📜 ⬆️ ⬇️

Mathematical model of a radio telescope with a super-long base

Introduction


One of the first radio telescopes was built by the American Grotto Reber in 1937. The radio telescope was a tin mirror with a diameter of 9.5 m mounted on a wooden frame:



By 1944, Reber compiled the first map of the distribution of cosmic radio waves in the Milky Way region.
')
The development of radio astronomy entailed a number of discoveries: in 1946, radio emission from the constellation Cygnus was discovered, in 1951 - extragalactic radiation, in 1963 - quasars, in 1965 open-relic background radiation at 7.5 cm wave.

In 1963, a unique 300-meter radio telescope was built in Arecibo (Puerto Rico). This is a fixed bowl with a moving feed, built in the natural cleft of the area.



Single radio telescopes have a small angular resolution, which is determined by the formula:
 Theta= frac lambdad
Where  lambda- wavelength, d- diameter of the radio telescope.

Obviously, to improve the resolution, it is necessary to increase the diameter of the antenna, which is physically a difficult task to accomplish. It was possible to solve it with the advent of radio interferometers.



The front of an electromagnetic wave emitted by a distant star near the Earth can be considered flat. In the case of the simplest interferometer consisting of two antennas, the path difference of the rays that came to these two antennas will be equal to:
 Delta=D cdotsin( Theta),
Where:  Delta- the path difference of the rays; D- the distance between the antennas;  Theta- the angle between the direction of arrival of the rays and the normal to the line on which the antennas are located.

With  Theta=0the waves arriving at both antennas are summed in phase. In antiphase the waves will be the first time when:

 Delta= frac lambda2, Theta=arcsin frac lambda2D,
Where:  lambda- wavelength.

The next maximum will be at  Delta= lambda,at least  Delta= frac3 lambda2etc. A multi-petal radiation pattern (DN) is obtained, the width of the main lobe of which is  lambda<<Dequals  lambda/D. The width of the main lobe is determined by the maximum angular resolution of the radio interferometer, it is approximately equal to the width of the lobe.

Superlong-base radio interferometry (VLBI) is a type of interferometry used in radio astronomy, in which the receiving elements of the interferometer (telescopes) are located no closer than at continental distances from each other.

The VLBI method allows one to combine observations made by several telescopes, and thereby simulate a telescope whose dimensions are equal to the maximum distance between the original telescopes. The angular resolution of VLBI is tens of thousands of times greater than the resolving power of the best optical instruments.

Current state of VLBI - networks


Today, several VLBI networks listen to space:




In VLBI - the Quasar-KVO complex, hydrogen standards are used as a reference frequency source for all frequency transformations, which use a transition between the levels of the hyperfine structure of the ground state of a hydrogen atom with a frequency of 1420.405 MHz, the corresponding line in radio astronomy 21 cm.

Tasks solved by means of VLBI



Navigation in space by means of VLBI



Block diagram of a simplified VLBI - network


Based on a real VLBI network, using the Python software, we will model a simplified VLBB system as separate models for each block or process. This set of models will be enough to observe the basic processes. The block diagram of a simplified VLBI network is shown in the figure:



The system includes the following components:


The correlator circuit is shown in the following figure:



The given correlator circuit, which includes the following blocks:


Navigation Signal Model


The most convenient for VLBI measurements are the navigation signals of satellite-based satellite navigation systems, such as GPS and GLONASS. There are a number of requirements for navigation signals:


The signal with binary (two-position) phase modulation - BPSK (binary phase shift key), which in the Russian-language literature is designated FM-2, satisfies them to a sufficient extent. This modulation changes the phase of the carrier wave, by π, which can be represented as:

S(t)=A cdotG(t) cdotcos(2 pift),

where G (t) is the modulating function.

To implement phase modulation, you can use two generators, each of which forms the same frequency, but with a different initial phase. The modulating function allows you to expand the signal spectrum and accurately measure the pseudorange (the distance between the satellite and the receiver, calculated from the signal propagation time without a correction for the difference between the satellite clock and the receiver).

I will provide a listing explaining the basic principles of BPSK:

Listing
from scipy import* from pylab import* import numpy as np import scaleogram as scg f = 2; #f  fs = 100; #    t = arange(0,1,1/fs) #    1 / fs #      BPSK p1 = 0; p2 = pi; #     N =12#     #   bit_stream=np.random.random_integers(0, 1, N+1) #   time =[]; digital_signal =[]; PSK =[]; carrier_signal =[]; #  for ii in arange(1,N+1,1): #   if bit_stream [ii] == 0: bit = [0 for w in arange(1,len(t)+1,1)]; else: bit = [1 for w in arange(1,len(t)+1,1)]; digital_signal=hstack([digital_signal,bit ]) #  BPSK if bit_stream [ii] == 0: bit = sin (2*pi*f*t+p1); else: bit = sin (2*pi*f*t+p2); PSK=hstack([PSK,bit]) #   carrier = sin (2*f*t*pi); carrier_signal = hstack([carrier_signal,carrier]) ; time = hstack([time ,t]); t=t+1 suptitle("    (BPSK)") subplot (3,1,1); plot(time,digital_signal,'r'); grid(); subplot (3,1,2); plot (time,PSK); grid(); subplot (3,1,3); plot (time,carrier_signal); grid() show() figure() title("     (BPSK)") n = len(PSK) k = np.arange(n) T = n/fs frq = k/T frq = frq[np.arange(int(n/2))] Y = fft(PSK)/n Y = Y[range(n //2)] / max(Y[range(n // 2)]) plot(frq[75:150], abs(Y)[75:150], 'b')#    grid() #   PSK  scales = scg.periods2scales( arange(1, 40)) ax2 = scg.cws(PSK, scales=scales, figsize=(6.9,2.9)); show() 


We get:







Signal source model


Navigation phase-modulated harmonic signal from a satellite or spacecraft has the form:

x=a(2 pifct+ sumsncos(2 pifnt)),

where the frequency of the carrier oscillations fc=8.4Ghz.

The signal has several controlled parameters: the amplitude of the n-th modulating oscillation
sn,its frequency fcand the amplitude of the carrier oscillations a.

To obtain a correlation function in which its side lobes will be suppressed as much as possible and the narrowest peak of correlation will be reached, we will vary the frequencies using the values ​​of 2, 4, 8 and 16 MHz, and the modulation index in the range from 0 to 2π with step π. I will give the program listing for such a search for the parameters of the phase-modulated function for the final result:

Listing
 # coding: utf-8 from pylab import* from scipy import signal from scipy import * T = 5e-7 #   N = 2**18 #-  delay =4 # t1 =linspace(0, T, N) t2 = linspace(0 + delay, T + delay, N) fs = (N - 1)/T #  ax = 1e-3 bx = 2e-6 ay = 2e-3 by = 3e-6 aex = 1e-3 + 30e-9 bex = 2e-6 + 10e-12 aey = 2e-3 + 30e-9 bey = 3e-6 + 10e-12 taux = ax + bx*t1 tauy = ay + by*t2 tauex = aex + bex*t1 tauey = aey + bey*t2 #  # print(" :") No1 = No2 = 0 fc = 8.4e9 #  #   A1 = 2*pi A2 = 0 A3 =2*pi A4 = 4*pi #   fm1 = 2e6 fm2 = 4e6 fm3 = 8e6 fm4 = 16e6 f = 20e6 #     ff = fc - f #   fco = 16e6 #     def korel(x,y): #  def phase_shifter1(x, t, tau, b): L = linspace(0, N, N) fexp = ifftshift((L) - ceil((N - 1)/2))/T s = ((ifft(fft(x)*exp(-1j*2*pi*tau*fexp))).real)*exp(1j*2*pi*b*fc*t) return s #   def phase_shifter2(x, t, tau, b): L = linspace(0,N,N) fexp = ifftshift((L) - ceil((N - 1)/2))/T s =((ifft(fft(x)*exp(1j*2*pi*tau*fexp))).real)*exp(-1j*2*pi*b*fc*t) return s # def heterodyning(x, t): return x*exp(-1j*2*pi*ff*t) # def filt(S): p = signal.convolve(S,h) y = p[int((n - 1)/2) : int(N+(n - 1)/2)] return y def corr(y1, y2): Y1 = fft(y1) Y2 = fft(y2) # Z = Y1*Y2.conjugate() # z = ifft(Z)/N return sqrt(z.real**2 + z.imag**2) #   def graf(c, t): c1=c[int(N/2):N] c2=c[0:int(N/2)] C = concatenate((c1, c2)) xlabel(',') ylabel('') title('   ') grid(True) plot(t*1e9 - 250, C, 'b',label="    \n    ") legend(loc='best') show() noise1 = random.uniform(-No1, No1, size = N) #   noise2 =noise1 #   x1 = heterodyning(phase_shifter1(x + noise1, t1, taux, bx), t1) y1 = heterodyning(phase_shifter1(y + noise2, t2, tauy, by), t2) n = 100001 #  #  h = signal.firwin(n, cutoff = [((f - fco) / (fs * 0.5)), ((f + fco) / (fs *0.5))], pass_zero = False) x2 = filt(x1) y2 = filt(y1) X2 = phase_shifter2(x2, t1, tauex, bex) Y2 = phase_shifter2(y2, t2, tauey, bey) Corr = corr(X2, Y2) graf(Corr, t1) #     ##for A1 in [pi/4,pi/2,pi]: ## x = cos(2*pi*fc*t1 + A1*cos(2*pi*fm1*t1)) ## y = cos(2*pi*fc*t2 + A1*cos(2*pi*fm1*t2)) ## korel(x,y) ##for fm in [ fm2,fm3,fm4]: ## A1=2*pi ## x = cos(2*pi*fc*t1 + A1*cos(2*pi*fm*t1)) ## y = cos(2*pi*fc*t2 + A1*cos(2*pi*fm*t2)) ## korel(x,y) #     ##for fm2 in [ fm1, fm2,fm3,fm4]: ## A1=2*pi ## A2=2*pi ## fm1=2e6 ## x = cos(2*pi*fc*t1 + A1*cos(2*pi*fm1*t1)+A2*np.cos(2*pi*fm2*t1)) ## y =cos(2*pi*fc*t2 + A1*cos(2*pi*fm1*t2)+A2*np.cos(2*pi*fm2*t2)) ## korel(x,y) x = cos(2*pi*fc*t1 + A1*cos(2*pi*fm1*t1)+A2*np.cos(2*pi*fm2*t1)+A3*cos(2*pi*fm3*t1)+A4*cos(2*pi*fm4*t1)) y = cos(2*pi*fc*t2 + A1*cos(2*pi*fm1*t2) +A2*cos(2*pi*fm2*t2) +A3*cos(2*pi*fm3*t2)+A4*cos(2*pi*fm4*t2)) korel(x,y) 


We get:



The resulting function is:

x=cos(2 pifct+2 picos(2 pi106t)+2 picos(2 pi108t)+4 picos(2 pi1016t)).(1)

Further, this function will be used to simulate VLBI.

Model of noise generator simulating interference received with the signal from space and from the atmosphere of the Earth


The function (1) of the phase-modulated navigation signal can be applied to both channels of the radio interferometer, but it should take into account the signal delay in the second channel and the noise in both channels as shown in the following listing:

Listing
 # coding: utf-8 from pylab import* from scipy import signal from scipy import * T = 5e-7 #   N = 2**16 #-  delay =1e-7 # t1 =linspace(0, T, N) t2 = linspace(0 + delay, T + delay, N) fc = 8.4e9 #  # print(" :") No1 = No2 = 0.5 noise1 = random.uniform(-No1, No1, size = N) #   noise2 =random.uniform(-No1, No1, size = N) #   x = cos(2*pi*fc*t1 + 2*pi*cos(2*pi*2*10**6*t1)+2*pi*cos(2*pi*8*10**6*t1)+4*pi*cos(2*pi*16*10**6*t1)) y = cos(2*pi*fc*t2 + 2*pi*cos(2*pi*2*10**6*t2)+2*pi*cos(2*pi*8*10**6*t2)+4*pi*cos(2*pi*16*10**6*t2)) title("    \n    ") plot(t1,x,label="  ") plot(t2,y,label="  c ") x=noise1;y=noise2 plot(t1,x,label="  ") plot(t2,y,label="  ") legend(loc='best') grid(True) figure() noise1_2 = np.random.uniform(-No1, No1, size = N) #     sko=np.std(noise1_2) mo= np.mean(noise1_2) sko=round(sko,2) mo=round(mo,2) title("  . :%s,:%s"%(sko,mo)) ylabel('   ') xlabel('  ') hist(noise1_2,bins='auto') show() 


We get:



Delay delay = 1e-7 is set for demonstration, in reality it depends on the base and can reach four or more units.



Noise, both cosmic and near-earth, can be distributed according to a law different from the uniform one, which requires special studies.

Doppler effect modeling


Due to the fact that the Earth has a rounded shape and rotates around its axis, the signals from space arrive at antennas with different delays. For this reason, it is required to shift the signals in time and take into account the Doppler frequency. Approximately we will assume that the delay varies according to a linear law:

 taux(t)=ax+bxt,(2)

Where ax=1..3 cdot103ms, but bx=1..3 cdot106ms The Doppler phase is found as a derivative of the delay:

fdx= fracd tau(t)dt=bx,(3)

The received signal should be:

 hatx=x(t taux)ej2 pifdxt,
where x (t) is the emitted signal of the spacecraft.

A demonstration of the Doppler effect is given in the following listing:

Listing
 # coding: utf-8 from pylab import* from scipy import signal from scipy import * T = 5e-7#   N = 2**16 #-  t1 =linspace(0, T, N) delay =4 # t2 = linspace(0 + delay, T + delay, N) fc = 8.4e9#  def phase_shifter1(x, t, tau, b): L = linspace(0, N, N) fexp = ifftshift((L) - ceil((N - 1)/2))/T s = ((ifft(fft(x)*exp(-1j*2*pi*tau*fexp))).real)*exp(1j*2*pi*b*fc*t) return s.real figure() title("    ") ax = 3e-3 bx = 3e-6 taux = ax + bx*t1 x = cos(2*pi*fc*t1 + 2*pi*cos(2*pi*2*10**6*t1)+2*pi*cos(2*pi*8*10**6*t1)+4*pi*cos(2*pi*16*10**6*t1)) sx=phase_shifter1(x, t1, taux, bx ) plot(t1[0:150],x[0:150],label="      ") plot(t1[0:150],sx[0:150],label="      ") grid(True) legend(loc='best') figure() title("    ") ay = 2e-3 by = 3e-6 tauy = ay + by*t2 y = cos(2*pi*fc*t2 + 2*pi*cos(2*pi*2*10**6*t2)+2*pi*cos(2*pi*8*10**6*t2)+4*pi*cos(2*pi*16*10**6*t2)) sy= phase_shifter1(y, t2, tauy, by) plot(t2[0:150],y[0:150],label="      ") plot(t2[0:150],sy[0:150],label="      ") grid(True) legend(loc='best') show() 


We get:





Simulation of Doppler Effect Compensation


It is obvious that the changes made to the signal should be compensated. For this purpose, there is a delay and Doppler tracking system in the system. After the signal passes through the registration system, a delay is entered:

 tauex(t)=ax+bext,(4)

It will be assumed that the delay is calculated with a certain accuracy, such that  left|aexax right|<30ns  left|bexbx right|<10ns, i.e. it will be slightly different from the delay introduced earlier. It is clear that the delay is made with the opposite sign than the one introduced earlier.

The received signal will be:

 hatx= tildex(t+ tauex)ej2 pifdet.(5)

Compensation of the Doppler effect is given in the following listing:

Listing
 # coding: utf-8 from pylab import* from scipy import signal from scipy import * T = 5e-7#   N = 2**16 #-  t1 =linspace(0, T, N) delay =4 # t2 = linspace(0 + delay, T + delay, N) fc = 8.4e9#  def phase_shifter1(x, t, tau, b): L = linspace(0, N, N) fexp = ifftshift((L) - ceil((N - 1)/2))/T s = ((ifft(fft(x)*exp(-1j*2*pi*tau*fexp))).real)*exp(1j*2*pi*b*fc*t) return s.real ax = 3e-3 bx = 3e-6 taux = ax + bx*t1 x = cos(2*pi*fc*t1 + 2*pi*cos(2*pi*2*10**6*t1)+2*pi*cos(2*pi*8*10**6*t1)+4*pi*cos(2*pi*16*10**6*t1)) sx=phase_shifter1(x, t1, taux, bx ) ay = 2e-3 by = 3e-6 tauy = ay + by*t2 y = cos(2*pi*fc*t2 + 2*pi*cos(2*pi*2*10**6*t2)+2*pi*cos(2*pi*8*10**6*t2)+4*pi*cos(2*pi*16*10**6*t2)) sy= phase_shifter1(y, t2, tauy, by) def phase_shifter2(x, t, tau, b): L = linspace(0,N,N) fexp = ifftshift((L) - ceil((N - 1)/2))/T s =((ifft(fft(x)*exp(1j*2*pi*tau*fexp))).real)*exp(-1j*2*pi*b*fc*t) return s.real figure() title("     ") aex = 1e-3 + 30e-9 bex = 2e-6 + 10e-12 tauex = aex + bex*t1 x1 = phase_shifter2(sx, t1, tauex, bex) plot(t1[0:150],x1[0:150],label="      ") grid(True) legend(loc='best') figure() title("     ") aey = 2e-3 + 30e-9 bey = 3e-6 + 10e-12 tauey = aey + bey*t2 y2 = phase_shifter2(sy, t2, tauey, bey) plot(t2[0:150],y2[0:150],label="      ") grid(True) legend(loc='best') show() 


We get:





Signal heterodyning simulation


After the signal enters the recording system, a frequency conversion occurs, which is also called heterodyning. This is a non-linear transform at which from the signals of two different frequencies f1and f2difference frequency signal is released - f= left|f1f2 right.|The frequency of the local oscillator signal will be equal to the difference between the frequency of the signal under study and the frequency that you want to receive after the transfer. The heterodyning is performed with the help of an auxiliary generator of harmonic oscillations — a heterodyne and a nonlinear element. Mathematically, heterodyning is the multiplication of a signal by an exponent:

xg= hatxej2 pifgt,(6)
Where fg- local oscillator signal.

Program for heterodyning:

Listing
 # coding: utf-8 from pylab import* from scipy import signal from scipy import * T = 5e-7 #   N = 2**16 #-  t1 =linspace(0, T, N) fs = (N - 1)/T #  fc = 8.4e9 #  f = 20e6 #     ff = fc - f #   def spectrum_wavelet(y,a,b,c,e,st):#   n = len(y)#   k = arange(n) T = n / a frq = k / T #    frq = frq[np.arange(int(n/2))] #    Y = fft(y)/ n # FFT    Y = Y[arange(int(n/2))]/max(Y[arange(int(n/2))]) plot(frq[b:c],abs(Y)[b:c],e,label=st) #   xlabel('Freq (Hz)') ylabel('|Y(freq)|') legend(loc='best') grid(True) x = cos(2*pi*fc*t1 + 2*pi*cos(2*pi*2*10**6*t1)+2*pi*cos(2*pi*8*10**6*t1)+4*pi*cos(2*pi*16*10**6*t1)) a=fs;b=0;c=20000;e='g'; st='     ' spectrum_wavelet(x,a,b,c,e,st) show() 


We get:





Simulation of signal filtering after heterodyning


After heterodyning, the signal goes to a bandpass filter. Bandwidth (PP) Filter fpass=32MHz. The impulse response (IC) of the filter is calculated by the window method using the library function signal.firwin. To obtain a signal at the output of the filter, the IM filter is convolved and the signal in the time domain. The convolution integral for our case takes the form:

 checkx(t)= int infty+ inftyxg(t)h(tt)dt,(7)

where h (t) is the filter impulse response.

Convolution is found using the signal.convolve library function. Registered signal taking into account heterodyning and filtering is presented in the form of the formula

 checkx(t)=( hatx(t)ej2 pifgt)h

where convolution is indicated by *.

Program for filtering modeling:

Listing
 # coding: utf-8 from pylab import* from scipy import signal from scipy import * T = 5e-7 #   N = 2**16 #-  t1 =linspace(0, T, N) fs = (N - 1)/T #  fc = 8.4e9 #  f = 20e6 #     ff = fc - f #   def spectrum_wavelet(y,a,b,c,e,st):#   n = len(y)#   k = arange(n) T = n / a frq = k / T #    frq = frq[np.arange(int(n/2))] #    Y = fft(y)/ n # FFT    Y = Y[arange(int(n/2))]/max(Y[arange(int(n/2))]) plot(frq[b:c],abs(Y)[b:c],e,label=st) #   xlabel('Freq (Hz)') ylabel('|Y(freq)|') legend(loc='best') grid(True) x = cos(2*pi*fc*t1 + 2*pi*cos(2*pi*2*10**6*t1)+2*pi*cos(2*pi*8*10**6*t1)+4*pi*cos(2*pi*16*10**6*t1)) def heterodyning(x, t): return x*exp(-1j*2*pi*ff*t).real z=heterodyning(x, t1) fco = 16e6 #     n = 100001 #  h = signal.firwin(n, cutoff = [((f - fco) / (fs * 0.5)), ((f + fco) / (fs *0.5))], pass_zero = False) def filt(S): p = signal.convolve(S,h) y = p[int((n - 1)/2) : int(N+(n - 1)/2)] return y q=filt(z) a=fs;b=0;c=850;e='g'; st='    ' spectrum_wavelet(q,a,b,c,e,st) show() 


We get:



Digital signal converters for VLBI mainly use filters with finite impulse response (FIR), as they have several advantages compared to filters with infinite impulse response (IIR):

  1. FIR filters can have a strictly linear phase response in the case of impulse response (IC) symmetry. This means that using such a filter, phase distortions can be avoided, which is especially important for radio interferometry. Filters with infinite impulse response (IIR) do not have the symmetry properties of the EM and can not have a linear phase response.
  2. FIR filters are non-recursive, which means they are always stable. The stability of the IIR filters is not always guaranteed.
  3. The practical implications of the fact that a limited number of bits are used to implement filters are much less significant for FIR filters.

In the above listing, the FIR bandpass filter model is implemented using the window method, the filter order was chosen such that the shape of the frequency response of the filter was close to rectangular. The number of coefficients of the simulated filter is n = 100001, that is, the order of the filter is P = 100000.

The program for building the frequency response and phase response of the received FIR filter:

Listing
 # coding: utf-8 from pylab import* from scipy import signal from scipy import * T = 5e-7 #   N = 2**16 #-  t1 =linspace(0, T, N) fs = (N - 1)/T #  fc = 8.4e9 #  f = 20e6 #     ff = fc - f #   fco = 16e6 #     n = 100001 #  h = signal.firwin(n, cutoff = [((f - fco) / (fs * 0.5)), ((f + fco) / (fs *0.5))], pass_zero = False) #  def AFC(A, n, f, deltf, min, max): plot((fftfreq (n, 1./fs)/1e9), 10*log10(abs(fft(A))), 'k') axvline((f - fco)/1e9, color = 'red', label='  ') axvline((f + fco)/1e9, color = 'red') axhline(-3, color='green', linestyle='dashdot') text(8.381, -3, repr(round(-3, 9))) xlabel(', ') ylabel(' , ') title('') grid(True) axis([(f - deltf)/1e9, (f + deltf)/1e9, min, max]) grid(True) show() #  def PFC(A, n, f, deltf, min, max): plot(fftfreq(n, 1./fs)/1e9, np.unwrap(np.angle(fft(A))), 'k') axvline((f - fco)/1e9, color='red', label='  ') axvline((f + fco)/1e9, color='red') xlabel(', ') ylabel(',') title('') axis([(f - deltf)/1e9, (f + deltf)/1e9, min, max]) #  grid(True) legend(loc='best') show() AFC(h, n, f, 20e6, -30, 1) PFC(h, n, f, 20e6, -112, 0) 


We get:





FX Correlator Model


Each signal then undergoes a Fast Fourier Transform (FFT). The FFT is implemented using the fft library function from scipy.fftpack. The resulting complex-conjugate spectra are multiplied:

S(j omega)=S1(j omega)S2(j omega)=(a1+jb1)(a2jb2)=a1a2+b1b2+j(b1a2a1b2)

The last action is the inverse FFT. Since the amplitude of the correlation function is of interest, the resulting signal must be converted by the formula:

A= sqrtre2+im2

Program for the correlation function without registration system distortions:

Listing
 # coding: utf-8 from pylab import* from scipy import signal from scipy import * T = 5e-7#   N = 2**16 #-  t1 =linspace(0, T, N) delay =4 # t2 = linspace(0 + delay, T + delay, N) fc = 8.4e9#  def corr(y1, y2): Y1 = fft(y1) Y2 = fft(y2) # Z = Y1*Y2.conjugate() # z = ifft(Z)/N q=sqrt(z.real**2 + z.imag**2) c1=q[int(N/2):N] c2=q[0:int(N/2)] C = concatenate((c1, c2)) xlabel(',') ylabel('') title('  ') grid(True) plot(t1*1e9 - 250, C, 'b') show() x= cos(2*pi*fc*t1 + 2*pi*cos(2*pi*2*10**6*t1)+2*pi*cos(2*pi*8*10**6*t1)+4*pi*cos(2*pi*16*10**6*t1)) y = cos(2*pi*fc*t2 + 2*pi*cos(2*pi*2*10**6*t2)+2*pi*cos(2*pi*8*10**6*t2)+4*pi*cos(2*pi*16*10**6*t2)) corr(x, y) 


We get:



Full listing of computer model RSLB:


Listing
 # coding: utf-8 from pylab import* from scipy import signal from scipy import * T = 5e-7 #   N = 2**18 #-  delay =4 # t1 =linspace(0, T, N) t2 = linspace(0 + delay, T + delay, N) fs = (N - 1)/T #  ax = 1e-3 bx = 2e-6 ay = 2e-3 by = 3e-6 aex = 1e-3 + 30e-9 bex = 2e-6 + 10e-12 aey = 2e-3 + 30e-9 bey = 3e-6 + 10e-12 taux = ax + bx*t1 tauy = ay + by*t2 tauex = aex + bex*t1 tauey = aey + bey*t2 #  # print(" :") No1 = No2 = 0 #    # print(" :") fc = 8.4e9 #  f = 20e6 #     ff = fc - f #   fco = 16e6 #     #  def phase_shifter1(x, t, tau, b): L = linspace(0, N, N) fexp = ifftshift((L) - ceil((N - 1)/2))/T s = ((ifft(fft(x)*exp(-1j*2*pi*tau*fexp))).real)*exp(1j*2*pi*b*fc*t) return s #   def phase_shifter2(x, t, tau, b): L = linspace(0,N,N) fexp = ifftshift((L) - ceil((N - 1)/2))/T s =((ifft(fft(x)*exp(1j*2*pi*tau*fexp))).real)*exp(-1j*2*pi*b*fc*t) return s # def heterodyning(x, t): return x*exp(-1j*2*pi*ff*t) # def filt(S): p = signal.convolve(S,h) y = p[int((n - 1)/2) : int(N+(n - 1)/2)] return y def spectrum_wavelet(y,a,b,c,e,st):#   n = len(y)#   k = arange(n) T = n / a frq = k / T #    frq = frq[np.arange(int(n/2))] #    Y = fft(y)/ n # FFT    Y = Y[arange(int(n/2))]/max(Y[arange(int(n/2))]) plot(frq[b:c],abs(Y)[b:c],e,label=st) #   xlabel('Freq (Hz)') ylabel('|Y(freq)|') legend(loc='best') grid(True) def corr(y1, y2): Y1 = fft(y1) Y2 = fft(y2) # Z = Y1*Y2.conjugate() # z = ifft(Z)/N return sqrt(z.real**2 + z.imag**2) #   def graf(c, t): c1=c[int(N/2):N] c2=c[0:int(N/2)] C = concatenate((c1, c2)) xlabel(', ') ylabel('') title('  ') grid(True) plot(t*1e9 - 250, C, 'b') show() noise1 = random.uniform(-No1, No1, size = N) #   noise2 =random.uniform(-No1, No1, size = N) #   def signal_0(): x = cos(2*pi*fc*t1 + 2*pi*cos(2*pi*2*10**6*t1)+2*pi*cos(2*pi*8*10**6*t1)+4*pi*cos(2*pi*16*10**6*t1)) y = cos(2*pi*fc*t2 + 2*pi*cos(2*pi*2*10**6*t2)+2*pi*cos(2*pi*8*10**6*t2)+4*pi*cos(2*pi*16*10**6*t2)) return x,y title(" +  +   ") x,y= signal_0() x1 = heterodyning(phase_shifter1(x + noise1, t1, taux, bx), t1) plot(x1.real,label="  ") y1 = heterodyning(phase_shifter1(y + noise2, t2, tauy, by), t2) plot(y1.real,label=" ") grid(True) legend(loc='best') show() n = 100001 #  #  h = signal.firwin(n, cutoff = [((f - fco) / (fs * 0.5)), ((f + fco) / (fs *0.5))], pass_zero = False) title("- -    ") x2 = filt(x1) plot(x2.real,label="  ") y2 = filt(y1) plot(y2.real,label="  ") grid(True) legend(loc='best') show() plt.title("      \n   ") a=fs;b=400;c=4400;e='r' st="    " spectrum_wavelet(x,a,b,c,e,st) a=fs;b=20;c=850;e='g' st="    " spectrum_wavelet(x1,a,b,c,e,st) show() X2 = phase_shifter2(x2, t1, tauex, bex) Y2 = phase_shifter2(y2, t2, tauey, bey) Corr = corr(X2, Y2) graf(Corr, t1) 


We get:





findings


  1. A brief history of the development of radio astronomy is given.
  2. Analyzed the current state of VLBI - networks.
  3. The problems solved by means of VLBI – networks are considered.
  4. By means of Python, a model of navigation signals with a binary (two-position) phase modulation - BPSK (binary phase shift key) is built. The model used wavelet analysis of phase modulation.
  5. A model of signal sources is obtained, which allows one to determine modulation parameters that provide the optimal correlation function by the criterion of side lobe suppression and the maximum amplitude of the central lobe.
  6. A model of a simplified VLBI network is obtained, which takes into account noise and the Doppler effect. Filtering features are considered using a filter with a finite impulse response.
  7. After a brief presentation of the theory, all models are equipped with demonstration programs that allow you to track the influence of model parameters.

Source: https://habr.com/ru/post/458252/


All Articles