-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbroad.py
110 lines (93 loc) · 2.26 KB
/
broad.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), ".."))
import matplotlib.pyplot as plt
import numpy as np
from doa_py.algorithm import cssm, imusic, tops
from doa_py.arrays import UniformLinearArray
from doa_py.plot import plot_spatial_spectrum
from doa_py.signals import ChirpSignal
# signal parameters
angle_incidence = np.array([0, 30])
num_snapshots = 1000
fre_min = 1e6
fre_max = 1e7
fs = 2.5e7
snr = 0
num_antennas = 8
antenna_spacing = 0.5 * (
3e8 / fre_max
) # set to half wavelength of highest frequency
# generate signal and received data
signal = ChirpSignal(f_min=fre_min, f_max=fre_max, fs=fs)
array = UniformLinearArray(m=num_antennas, dd=antenna_spacing)
# plot the signal in the frequency domain
plt.plot(
np.fft.fftshift(np.fft.fftfreq(num_snapshots, 1 / fs)),
np.abs(
np.fft.fftshift(
np.fft.fft(
signal.gen(n=len(angle_incidence), nsamples=num_snapshots)
)
)
).transpose(),
)
plt.xlabel("Frequency (Hz)")
plt.ylabel("Magnitude")
plt.show()
received_data = array.received_signal(
signal=signal,
snr=snr,
nsamples=num_snapshots,
angle_incidence=angle_incidence,
unit="deg",
)
search_grids = np.arange(-90, 90, 1)
num_signal = len(angle_incidence)
spectrum = imusic(
received_data=received_data,
num_signal=num_signal,
array=array,
fs=fs,
angle_grids=search_grids,
num_groups=16,
unit="deg",
)
plot_spatial_spectrum(
spectrum=spectrum,
ground_truth=angle_incidence,
angle_grids=search_grids,
num_signal=num_signal,
)
spectrum = cssm(
received_data=received_data,
num_signal=num_signal,
array=array,
fs=fs,
angle_grids=search_grids,
fre_ref=(fre_min + fre_max) / 2,
pre_estimate=np.array([-1, 29]),
unit="deg",
)
plot_spatial_spectrum(
spectrum=spectrum,
ground_truth=angle_incidence,
angle_grids=search_grids,
num_signal=num_signal,
)
spectrum = tops(
received_data=received_data,
num_signal=num_signal,
array=array,
fs=fs,
num_groups=32,
angle_grids=search_grids,
fre_ref=4e6,
unit="deg",
)
plot_spatial_spectrum(
spectrum=spectrum,
ground_truth=angle_incidence,
angle_grids=search_grids,
num_signal=num_signal,
)