1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-27 02:09:14 -05:00
sdrangel/plugins/channelmimo/interferometer
Jon Beniston c966f1cb5a dd maximize button to MainSpectrum and expandible Channels and Features.
Add sizeToContents in ChannelGUI and FeatureGUI, called when widget is
rolled, so we can remove resizing code from all of the individual
channels and features.

In RollupContents, use minimumSizeHint for calculated size, so that
minimumWidth can come from .ui file.

In DeviceGUI::sizeToContents(), call adjustSize(), so Device GUIs start
out at minimum needed size (which should restore appearance prior to
last patch).

In stackSubWindows, use available space for channels if no
spectrum/features present.
In stackSubWindows, fix spectrum from being sized too big, resulting in
scroll bars appearing.
Reset user-defined channel width in stackSubWindows, when channels are
removed.
Don't stack maximized windows.

There's one hack in Channel/FeatureGUI::maximizeWindow(). It seems that
when maximimzing a window, QOpenGLWidgets aren't always paint properly
immediately afterwards, so the code forces an additional update. I can't
see why the first call to paintGL doesn't work.
2022-11-11 12:24:27 +00:00
..
CMakeLists.txt Install debug symbols on Windows for debug builds 2022-02-06 12:56:58 +00:00
interferometer.cpp Interferometer: updated threading model. Part pf #1346 2022-10-10 23:15:49 +02:00
interferometer.h Interferometer: updated threading model. Part pf #1346 2022-10-10 23:15:49 +02:00
interferometerbaseband.cpp Replace deprecated QMutex(Recursive) with QRecursiveMutex 2022-09-17 23:00:07 +02:00
interferometerbaseband.h Replace deprecated QMutex(Recursive) with QRecursiveMutex 2022-09-17 23:00:07 +02:00
interferometercorr.cpp Fixed -Wsign-compare warnings 2020-11-14 22:08:06 +01:00
interferometercorr.h Fixed -Wsign-compare warnings 2020-11-14 22:08:06 +01:00
interferometergui.cpp dd maximize button to MainSpectrum and expandible Channels and Features. 2022-11-11 12:24:27 +00:00
interferometergui.h Fixed Interferometer and BeamSteeringCW absolute center frequency display 2022-05-26 12:34:38 +02:00
interferometergui.ui Massive UI revamping (v7): added channels 2022-04-12 16:20:45 +02:00
interferometerplugin.cpp Updated versions and changelogs 2022-10-19 17:40:14 +02:00
interferometerplugin.h Interferomter 2020-11-10 16:38:12 +01:00
interferometersettings.cpp Massive UI revamping (v7): persistent channel show/hide 2022-04-12 18:27:27 +02:00
interferometersettings.h Massive UI revamping (v7): persistent channel show/hide 2022-04-12 18:27:27 +02:00
interferometerstreamsink.cpp Interferomter 2020-11-10 16:38:12 +01:00
interferometerstreamsink.h Interferomter 2020-11-10 16:38:12 +01:00
interferometerwebapiadapter.cpp Implement serialize and deserialize to/from API in Serializable interface. Related changes and fixes 2021-12-01 00:21:19 +01:00
interferometerwebapiadapter.h Rename GLSpectrumSettings to SpectrumSettings 2021-04-20 23:12:05 +02:00
readme.md Fix typing errors in readme's 2022-05-15 12:39:57 +02:00

Interferometer plugin

Introduction

This MIMO reception only (MI) plugin can be used to study phase difference between two coherent streams. It must be connected to a device that exposes at least two input streams and will connect to streams 0 and 1 as channels A and B respectively.

Interface

The top and bottom bars of the channel window are described here

Interferometer plugin GUI

The interface is divided in 3 sections that will be detailed next:

  • A: settings. These are the plugin controls
  • B: spectrum (frequency domain). This is a spectrum display analogous to other spectrum displays. Its input varies depending on the correlation function selected. Details on the spectrum view and controls can be found here
  • C: scope (time domain). This is a scope display analogous to other scope displays. Its input varies depending on the correlation function selected. For FFT type correlation this is not a time domain but a frequency domain display transposed to time analogous to a frequency sweep.

A. Settings section

Interferometer plugin settings GUI

A.1. Decimation

Input streams from baseband are decimated by a power of two. Use this combo to select from 0 (no decimation) to 64 (2^6). The resulting channel sample rate is displayed next (A.2)

A.2. Channel sample rate

This is the channel sample rate in kilo or mega samples per second indicated by the k or M letter.

A.3. Half-band filter chain sequence display

This string represents the sequence of half-band filters used in the decimation from device baseband to channel stream and controlled by (A.7). Each character represents a filter type:

  • L: lower half-band
  • H: higher half-band
  • C: centered

A.4. Correlation function

This combo selects which function is applied to A and B channel inputs to obtain resulting correlation signal.

  • A: A channel only (no correlation)
  • B: B channel only (no correlation)
  • A+B: This is the complex sum of A and B
  • A.B*: This is the complex multiplication of A with the conjugate of B
  • IFFT: This is a time correlation obtained by FFT. The FFT of A is multiplied by the conjugate of the FFT of B and the result is passed to an IFFT to obtain the final result. This can be used for passive radar.
  • IFFT*: Same FFT operations as above but the IFFT is handled differently: sums the first half of IFFT with the reversed second half as one is the conjugate of the other so this should yield constant phase
  • FFT: The FFT of A is multiplied by the conjugate of the FFT of B (no IFFT) thus the result is in the frequency domain. This is sometimes called "interspectrum". It can be used in practice to evaluate the direction of arrival (DOA) of a plane wave (see next)
  • IFFT2: Same as IFFT but looks at the entire time domain including "negative" times.

Spectrum and scope inputs

The spectrum and scope displays inputs vary depending on the correlation types and are summarized in the table below:

Correlation type Spectrum Scope
A FFT(A) A(t)
B FFT(B) B(t)
A+B FFT(A+B) (A+B)(t)
A.B* FFT(A.B*) (A.B*)(t)
IFFT FFT(A)*FFT(B)* IFFT(FFT(A).FFT(B)*)
IFFT FFT(A)*FFT(B)* IFFT(FFT(A).FFT(B)*) with special manipulation (see above)
FFT FFT(A)*FFT(B)* over 1 FFT length FFT(A)*FFT(B)* possibly over several FFT lengths depending on trace length
IFFT2 FFT(A)*FFT(B)* IFFT(FFT(A).FFT(B)*) with positive and negative times

Direction Of Arrival (DOA) estimation with FFT correlation

The "FFT" correlation function can be selected for DOA estimation. "A.B*" should yield similar results but is less precise because FFT analysis helps in removing non essential contributions. The FFT analysis can also show different DOAs for signals at different frequencies.

It assumes that channel A is connected to the antenna of reference (device stream 0) and channel B is connected to the second antenna (device stream 1) in the following configuration:

Interferometer antennas

The scope is configured to have X and Y displays with Y1 set to a magnitude display projection and X to a phase related projection. See scope controls in C section for setup. Here are the different possibilities:

  • X: Phi, DOAP, DOAN
  • Y1: Mag, MagSq, MagDB (this one is usually the most convenient)

You will select the XY display on the scope and you can use the polar grid display to show phase or direction angles directly.

Angles are counted from -π to π and normalized to π for display thus displayed from -1.0 to 1.0

The phase difference on X input (Phi selected) is then the actual phase difference between the reference signal A and the second signal B. Thus for a given phase difference the wave may come from the positive side of angles (0 to π) or the negative side (-π to 0). Angles of arrival are referenced to the axis perpendicular to the axis passing by the two antennas.

Interferometer DOA

Thus when antennas are separated by half the wavelength the relation between the angle of arrival θ and the phase difference φ can be expressed as:

φ = π cos(θ) thus θ = acos(φ / π)

This angle can be displayed directly when DOAP (positive angles) or DOAN (negative angles) is selected for X input.

Thus a possible procedure to determine DOA could be the following:

  1. Arrange antennas axis so that the phase difference φ or DOA angle θ is roughly π/2 (zero phase difference)
  2. Make an assumption for the wave to come from the positive or negative angles side
  3. Rotate the antennas axis slightly and if the DOA angle moves in the direction corresponding to your assumption (2) then the assumption is correct and the wave is coming from the side corresponding to your assumption. You can then refine the antenna axis direction to obtain a π/2 or -π/2 angle depending from which side the wave is coming. The scope DOAP projection is for waves coming from the positive angles side and DOAN for the negative angles side
  4. If when performing previous step (3) the DOA angle moves in the opposite direction to the one corresponding to your assumption then the wave is coming from the opposite side w.r to your assumption. You can then refine the antenna axis direction to obtain a ±π/2 DOA as in (3).
  5. Once the ±π/2 DOA angle (zero phase difference) is obtained at λ/2 distance between antennas you can move your antennas further apart to refine the ±π/2 DOA angle.

A.5. Phase difference correction

This is the phase correction in degrees applied to signal in channel B.

A.6 Center frequency shift

This is the shift of the channel center frequency from the device center frequency. Its value is driven by the baseband sample rate, the decimation factor (A.1) and the filter chain sequence (A.7).

A.7. Half-band filter chain sequence adjust

The slider moves the channel center frequency roughly from the lower to the higher frequency in the device baseband. The number on the right represents the filter sequence as the decimal value of a base 3 number. Each base 3 digit represents the filter type and its sequence from MSB to LSB in the filter chain:

  • 0: lower half-band
  • 1: centered
  • 2: higher half-band

The resulting filter chain sequence is represented in (A.3)

B. Spectrum display

This is the spectrum (frequency domain) display. This display and controls are identical to all spectrum displays in the software. Further details on spectrum controls can be found here

C. Scope display

This is the scope (mainly time domain) display. This display and controls are identical to all scope displays in the software. Further details can be found in Channel Analyzer documentation