DoA estimation simulation with MVDR/MUSIC/ESPRIT; questions on the random number generator and "phased.XXXEstimator" functions.

조회 수: 6 (최근 30일)
I'm trying to simulate some DoA estimation algorithms to point their respective strenghts/weaknesses out by testing with two spaced out angles (let's say -15 and 20 degrees) and then two narrowly spaced angles (20 and 25 degrees). I took the dedicated MathWorks function information pages as a guide. However, I have a few things that I can not quite get my head around:
  • The first one is the precision of the results by phased.MVDREstimator and phased.MUSICEstimator functions. They are always integers, even if the input is given as a decimal number, the results turn up as integers (except the phased.ESPRITEstimator, it gives the values in 4 dp). How do I get more precise results (I guess the "angle" arrays are integers by default? How do I specify the data type as float/double?)? And in addition to these, I seem to be unable to stress these algorithms. I mean, they always estimate the angles perfectly even with a low count of ULA elements or low number of snapshots. I think I'm missing something here.
  • The second one is the random number generator. It has to do with the nature of the noise (added to the received signal by the sensorsig function) being random, okay. But it is not one of the inputs of the sensorsig function, and yet removing the rng or using a different seed affects the results every time (how it does is mentioned below). How does it affect the sensorsig function? Can someone explain why and how this is?
  • The third is, again, to do with random number generator. Unless a specific seed is given, and it's left at 'default' (or the rng deleted altogether), with each run of the codes, the output of the array that stores the results is flipped randomly, but it does not for a specific given seed. It also exhibits the flipping behaviour if the number or ULA elements or the number of the snapshots are changed with the same rng seed. For instance, the first angle is 20 and the second is 25 (these are the azimuth, the elevation angles are kept at zero, thus the output "broadside angles" are essentially the same as the azimuth angles), and the output is sometimes 20 & 25 (the correct way), or sometimes it is 25 & 20. Why would these angles flip positions at the output for different rng seeds or with different ULA elements? (At first I thought the estimator algorithms were struggling due to low number of ULA elements or snapshots, but increasing these significantly, the "flipping" phenomenon can still be replicated.)
MVDR
fc= 24.25e9;
c = physconst('LightSpeed');
wavelength = c/fc;
d = wavelength/2;
uniform_lineararray = phased.ULA('NumElements', 10, 'ElementSpacing', d); %%%%%%%%%
pos = getElementPosition(uniform_lineararray)/wavelength;
snapshots = 500; %%%%%%%%%
angle_1 = [20; 0]; %%%%%%%%%
angle_2 = [ 25; 0]; %%%%%%%%%
all_angles = [angle_1 angle_2];
Thermal_Noise = 0.1;
%random_s = rng('shuffle');
%rng 'default'
random_s = rng(3072);
received_signal = sensorsig(pos, snapshots, all_angles, Thermal_Noise);
mvdr_out = phased.MVDREstimator ('SensorArray', uniform_lineararray, 'OperatingFrequency', fc, 'ScanAngles', -90:90, 'DOAOutputPort', true, 'NumSignals', 2);
[~,ang] = mvdr_out(received_signal)
MUSIC
fc = 24.25e9;
c = physconst('LightSpeed');
wavelength = c/fc;
d = wavelength/2;
uniform_lineararray = phased.ULA('NumElements', 10, 'ElementSpacing', d); %%%%%%%%%
pos = getElementPosition(uniform_lineararray)/wavelength;
snapshots = 500; %%%%%%%%%
angle_1 = [20; 0]; %%%%%%%%%
angle_2 = [ 25; 0]; %%%%%%%%%
all_angles = [angle_1 angle_2];
Thermal_Noise = 0.01;
random_s = rng(3072);
received_signal = sensorsig(pos, snapshots, all_angles, Thermal_Noise);
music_out = phased.MUSICEstimator ('SensorArray', uniform_lineararray, 'OperatingFrequency', fc, 'ScanAngles', -90:90, 'DOAOutputPort', true, 'NumSignalsSource', 'Property', 'NumSignals', 2);
[~,ang] = music_out(received_signal)
ESPRIT
fc = 24.25e9;
c = physconst('LightSpeed');
wavelength = c/fc;
d = wavelength/2;
uniform_lineararray = phased.ULA('NumElements', 10, 'ElementSpacing', d); %%%%%%%%%
pos = getElementPosition(uniform_lineararray)/wavelength;
snapshots = 500; %%%%%%%%%%
angle_1 = [20; 0]; %%%%%%%%%%
angle_2 = [ 25; 0]; %%%%%%%%%%
all_angles = [angle_1 angle_2];
Thermal_Noise = 0.01;
random_s = rng(3072);
received_signal = sensorsig(pos, snapshots, all_angles, Thermal_Noise);
esprit_out = phased.ESPRITEstimator ('SensorArray', uniform_lineararray, 'OperatingFrequency', fc, 'ForwardBackwardAveraging', true, 'NumSignalsSource', 'Property', 'NumSignals', 2);
ang = esprit_out(received_signal)
Thanks in advance.

답변 (0개)

카테고리

Help CenterFile Exchange에서 Direction of Arrival Estimation에 대해 자세히 알아보기

제품


릴리스

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by