(Radar) 11. 다중빔 — 빔 격자를 방향 코사인으로 놓고 한꺼번에 만들기
빔 여러 벌을 동시에 세우는 일을 처음부터 끝까지 — 빔 방향을 각도가 아니라 u, v 로 적는 이유, 빔을 얼마나 촘촘히 놓아야 하는지, 축소형 시제의 탐색 격자와 수신 다섯 빔, 운용 모드마다 격자를 다시 놓는 방식, 협대역 빔포밍 식과 C 구현, 그리고 빔마다 합·차를 만들어 각도를 재는 데까지.
이번 장에서는 다중빔을 다루겠다. 빔 여러 벌을 동시에 세우는 일인데, 실제로 해 보면 신호 처리보다 빔을 어디에 놓을지 정하는 쪽이 일이 많다. 빔 방향을 어떤 좌표로 적을 것인지, 얼마나 촘촘히 놓을 것인지, 송신과 수신에 각각 몇 개를 둘 것인지를 순서대로 정리하고, 마지막에 그것을 만드는 식과 코드를 놓겠다.
계산에 쓴 배열은 축소형 시제를 가정한 것이다. X 밴드 9.5 GHz, 반파장 간격 16 × 16 소자, 개구 25.2 × 25.2 cm, Taylor $-30$ dB 가중. 이 배열의 빔은 방향 코사인으로 0.140 폭이고 정면에서 각도로는 8.0° 다.
1. 빔 방향을 u, v 로 적는다
빔 방향을 방위각과 고각으로 적는 것이 자연스러워 보이지만, 배열에서는 거의 쓰지 않는다. 대신 방향 코사인(direction cosine) 이라 부르는 두 값을 쓴다.
\[u = \sin\theta\cos\varphi, \qquad v = \sin\theta\sin\varphi\]표적 방향을 배열 면에 수직으로 내린 그림자, 그 좌표가 $u$ 와 $v$ 다. 정면이 $(0, 0)$ 이고, 각도가 아니라 사인 값이다.
그림 1. 표적 방향을 배열 면에 내린 그림자가 (u, v) 다. 오른쪽 평면에서는 빔이 어디를 향하든 크기가 같다.
이렇게 적는 이유는 배열의 응답이 $u$ 의 함수이기 때문이다. 소자를 $x_n$ 에 놓고 $u_0$ 방향으로 조향하면 응답은 $u - u_0$ 에만 의존한다.
\[A(u) \;=\; \sum_n a_n \, e^{\,j2\pi x_n (u - u_0)}\]조향을 해도 패턴이 그대로 옮겨 갈 뿐 모양과 넓이가 변하지 않는다. 그래서 이 평면에서는 빔 하나가 어디에 놓이든 같은 크기의 원이고, 격자를 한 번 정해 두면 조향각이 바뀌어도 표를 고칠 일이 없다.
각도로 적으면 이야기가 달라진다. 같은 빔이 조향할수록 넓어져서 $\theta_{3\mathrm{dB}}/\cos\theta_0$ 이 되고, 빔을 어디에 놓을지 정할 때마다 다시 계산해야 한다. 반대로 $u$ 를 같은 간격으로 띄우면 각도 간격은 바깥으로 갈수록 벌어진다.
| $u$ | 각도 | 앞 칸과의 각도 차 |
|---|---|---|
| 0.0000 | 0.00° | |
| 0.1667 | 9.60° | 9.60° |
| 0.3333 | 19.47° | 9.87° |
| 0.5000 | 30.00° | 10.53° |
| 0.6667 | 41.84° | 11.84° |
$u^2 + v^2 \le 1$ 인 원 안쪽만 실제 방향에 대응한다. 이것을 가시 영역(visible region)이라 하고, 원 위가 지평선이다. 그 밖은 계산은 되지만 하늘에 대응하는 방향이 없다.
2. 빔을 얼마나 촘촘히 놓는가
빔을 여러 개 놓기로 했으면 다음 결정은 간격이다. 빔 사이 방향에서는 어느 빔으로도 정점보다 낮게 받는데, 그 낮아진 만큼을 빔 교차 손실이라 한다.
그림 2. 간격을 넓힐수록 두 빔 사이가 깊게 꺼진다. 빔폭만큼 띄운 자리가 −3 dB 다.
| 간격 ÷ 빔폭 | 교차점 손실 | 같은 구역을 덮는 빔 수 |
|---|---|---|
| 0.7 | $-1.44$ dB | 2.04 배 |
| 0.8 | $-1.89$ dB | 1.56 배 |
| 1.0 | $-3.00$ dB | 기준 |
| 1.2 | $-4.41$ dB | 0.69 배 |
촘촘히 놓을수록 손실은 줄지만 빔 수와 계산량이 그만큼 늘어난다. 사양의 최소 이득은 빔 정점이 아니라 이 교차점에서 잡는다. 어느 방향에서도 보장해야 하는 값이기 때문이다.
두 축을 함께 보면 손해가 겹친다. 가로 세로 모두 빔폭만큼 띄우면 대각선 방향의 구석은 $-6$ dB 다. 그래서 실제 격자는 축마다 다른 간격을 쓰는 일이 흔하다. 넓게 덮어야 하는 축은 성기게, 정확도가 필요한 축은 촘촘히 놓는다.
3. 축소형 시제의 탐색 격자
실제 시제의 격자를 놓고 보겠다. 탐색에 쓰는 격자는 $u$ 방향 7 개, $v$ 방향 2 개, 합해서 14 개다.
\[\begin{aligned} u &= [\,-0.5000,\; -0.3333,\; -0.1667,\; 0,\; 0.1667,\; 0.3333,\; 0.5000\,] \\ v &= [\,+0.0611,\; -0.0611\,] \end{aligned}\] 그림 3. 가로로 넓고 세로로 얇은 부채꼴이다. 빔 하나가 향하는 각도는 바깥으로 갈수록 촘촘하지 않다.
$u$ 간격은 정확히 $1/6$ 이고 $v$ 간격은 0.1222 다. 빔폭 0.140 으로 나누면 $u$ 는 1.19 빔폭, $v$ 는 0.87 빔폭이다. 교차점 손실이 $u$ 축 $-4.3$ dB, $v$ 축 $-2.3$ dB 로 갈린다. 한 축을 일부러 성기게 놓아 일곱 개로 60° 를 덮은 것이다.
덮는 범위는 이렇게 된다.
| 방향 코사인 | 각도 | 빔 가장자리까지 | |
|---|---|---|---|
| $u$ | $-0.50$ ~ $+0.50$ | $-30°$ ~ $+30°$ | ±34.8° |
| $v$ | ±0.061 | ±3.5° | ±7.5° |
가로로 60°, 세로로 7° 인 띠다. 위성이 지나갈 길목을 가로질러 세워 두는 모양이라, 하늘 전체를 덮는 대신 지나가는 것을 놓치지 않는 쪽에 무게를 둔 배치다.
수신빔 다섯을 안에 세운다
장거리 모드에서는 이 격자를 송신에 쓰고, 송신빔 하나마다 수신빔을 다섯 개 더 세운다. 자리는 네 모서리와 가운데다.
\[\begin{aligned} \Delta u &= [\,-0.0675,\; +0.0675,\; -0.0675,\; +0.0675,\; 0\,] \\ \Delta v &= [\,+0.0572,\; +0.0572,\; -0.0572,\; -0.0572,\; 0\,] \end{aligned}\]두 배열을 짝지어 읽는다. $(-0.0675, +0.0572)$, $(+0.0675, +0.0572)$, $(-0.0675, -0.0572)$, $(+0.0675, -0.0572)$, 그리고 $(0, 0)$ 이다. 가운데에서 모서리까지가 0.0885 로 빔폭의 0.63 배다.
그림 4. 가운데 그림이 한 빔으로만 받았을 때, 오른쪽이 다섯 빔을 다 썼을 때다. −1 dB 둘레가 다섯 군데로 늘어나 칸을 훨씬 고르게 덮는다.
이 다섯 빔이 채워야 하는 것은 그 송신빔이 맡은 격자 한 칸, 곧 $u$ 로 ±0.0834, $v$ 로 ±0.0611 인 네모다.
| 받는 방식 | 격자 한 칸 안에서 가장 낮은 이득 | 만드는 수신빔 |
|---|---|---|
| 가운데 한 빔만 | $-6.41$ dB | 1 개 |
| 네 모서리 + 가운데 | $-2.20$ dB | 5 개 |
한 칸의 구석이 4.2 dB 올라온다. 수신 채널을 다섯 배로 늘려 얻은 것이 이 4.2 dB 다. 그리고 네 모서리 빔은 각도를 재는 데도 그대로 쓰인다.
4. 운용 모드마다 격자를 다시 놓는다
같은 배열로 다섯 가지 모드를 돌린다. 격자는 대체로 같은 것을 쓰고 송신을 나눌지 한꺼번에 뿌릴지만 바꾼다.
그림 5. 주황이 송신빔, 파랑이 수신빔이다. 광역감시만 격자가 다르다.
| 모드 | 송신 | 송신당 수신 | 만드는 수신빔 | 송신 횟수 |
|---|---|---|---|---|
| 저궤도 근거리 탐색 | 확장빔 1 | 14 | 14 | 1 |
| 저궤도 장거리 탐색 | 집중빔 14 | 5 | 70 | 14 |
| 중궤도 탐색 | 집중빔 14 | 5 | 70 | 14 |
| 광역감시 | 확장빔 1 | 4 | 4 | 1 |
| 큐잉탐색 | 집중빔 3 | 5 | 15 | 3 |
근거리와 장거리는 같은 격자를 다르게 쓴다
저궤도 근거리와 장거리는 덮는 구역이 똑같다. 갈리는 것은 송신뿐이다. 근거리는 위상을 흐트러뜨려 넓힌 빔 한 발로 14 칸을 한꺼번에 비추고, 장거리는 집중빔 열넷으로 한 칸씩 차례로 비춘다.
그림 6. 왼쪽은 한 발로 다 덮고, 오른쪽은 열네 발로 나눈다. 수신빔이 서는 자리는 양쪽 다 같다.
넓혀야 하는 크기부터 계산해 보면 $u$ 로 1.140, $v$ 로 0.262 다. 집중빔의 0.140 과 견주면 $u$ 로 8.1 배, $v$ 로 1.9 배, 넓이로 15.2 배다. 같은 전력을 그만큼 넓은 각도에 나눠 뿌리므로 정점 이득이 11.8 dB 내려간다.
반대쪽은 시간을 쓴다. 집중빔 열넷으로 나눠 쏘면 한 바퀴에 14 배가 걸리고, 같은 시간을 한 방향에 몰아 준다면 11.5 dB 를 더 모을 수 있다. 11.8 dB 와 11.5 dB 가 거의 같다. 넓혀서 잃는 만큼을 나눠 쏘아 되찾는 셈이라, 같은 시간을 쓰면 두 모드의 감도가 사실상 같다.
| 확장 송신 1 발 | 집중 송신 14 발 | |
|---|---|---|
| 한 발의 송신 이득 | $-11.8$ dB | 기준 |
| 한 바퀴 도는 시간 | 1 회 | 14 회 |
| 한 조사의 탐지 거리 | 0.51 배 | 기준 |
그래서 두 모드 중에 무엇을 고를지는 성능이 아니라 무엇을 먼저 볼 것이냐로 정해진다. 한 번의 조사로 멀리 보고 싶으면 나눠 쏘고, 자주 갱신하고 싶으면 한꺼번에 뿌린다. 가까운 표적은 어차피 세게 돌아오니 갱신 주기를 택하고, 먼 표적은 한 발의 감도가 아쉬우니 거리를 택한다.
광역감시는 울타리를 세운다
광역감시만 격자가 다르다. 확장 송신빔 하나에 수신빔 넷인데, 그 넷이 비스듬한 선 위에 늘어선다.
\[\begin{aligned} u &= [\,-0.2699,\; -0.0900,\; +0.0900,\; +0.2699\,] \\ v &= [\,+0.2290,\; +0.0763,\; -0.0763,\; -0.2290\,] \end{aligned}\]네 점이 원점을 지나는 한 직선 위에 있다. 기울기는 $u$–$v$ 평면에서 40.3° 이고, 한 칸 간격이 0.236, 양 끝 빔 사이가 41.5° 다. 하늘을 가로지르는 울타리를 세워 두고 무엇이 지나가는지 보는 배치다.
간격 0.236 은 집중빔 기준으로 1.68 빔폭이라 교차점이 $-9.4$ dB 까지 꺼진다. 수신빔을 함께 넓히지 않으면 빔 사이가 뚫린다는 뜻이다. 넓게 보는 대신 빔 사이를 포기하거나, 수신도 확장빔으로 만들어 메우거나 둘 중 하나를 골라야 한다.
큐잉탐색은 좁게 훑는다
큐잉탐색은 이미 방향을 아는 표적을 다시 찾는 모드다. 송신 집중빔 셋을 $u$ 로 $-0.18$, $0$, $+0.18$ 에 놓고 각각 수신 다섯 빔을 세운다. $v$ 는 움직이지 않는다. 알려진 방향 둘레의 좁은 띠만 훑는 것이라 송신 세 발이면 끝난다.
간격 0.18 은 1.28 빔폭이라 교차점이 $-5.1$ dB 다. 탐색 격자보다도 성기다. 대략의 방향을 이미 알고 있으니 표적이 가운데 빔 근처에 있으리라 보고, 양옆은 놓친 경우를 대비한 여유로 두는 배치다.
5. 협대역 빔포밍
이제 이 빔들을 실제로 만드는 이야기다.
방향 $(u_0, v_0)$ 에서 오는 파는 소자마다 다른 시각에 닿는다. 원점을 기준으로 소자 $n$ 이 $(x_n, y_n)$ 에 있으면 도착 시각 차이는 $(u_0 x_n + v_0 y_n)/c$ 다. 이 시간차를 맞춰 주면 모든 소자의 신호가 같은 위상으로 겹친다.
그림 7. 왼쪽이 도착 시각 차이, 오른쪽이 그것을 위상으로 맞춰 합치는 구조다.
맞추는 방법이 둘이다. 실제로 그만큼 지연시키거나(true time delay), 그 시간차에 해당하는 위상을 걸거나. 위상으로 대신하는 쪽이 협대역 빔포밍이고, 회로가 훨씬 싸다. 소자 위치를 파장 단위로 적으면 가중은 이렇게 된다.
\[w_n \;=\; a_n \, e^{\,-j2\pi\,(u_0 x_n + v_0 y_n)}, \qquad y \;=\; \sum_n w_n\, x_n\]$a_n$ 은 부엽을 낮추는 크기 가중이고 지수부가 방향을 정한다. 가중 한 벌이 빔 하나다. 같은 수신 데이터에 가중을 $M$ 벌 곱하면 빔이 $M$ 개 나온다. 소자가 받은 숫자가 그대로 남아 있으니 몇 번을 다시 합치든 상관없다.
언제 위상으로 대신해도 되는가
위상은 한 주파수에서만 정확한 지연이다. 신호에 대역폭이 있으면 밴드 가장자리에서 빔이 밀린다. 밀리는 양은 $u_0 \cdot \Delta f / f_0$ 이고, 이것이 빔폭에 견줘 작아야 협대역 근사가 성립한다.
| 대역폭 | 30° 조향에서 밀리는 양 | 빔폭 대비 |
|---|---|---|
| 10 MHz | 0.00026 | 0.19 % |
| 50 MHz | 0.00132 | 0.94 % |
| 200 MHz | 0.00526 | 3.76 % |
| 1 GHz | 0.02632 | 18.78 % |
이 배열에서는 200 MHz 까지도 빔폭의 4 % 라 문제가 되지 않는다. 개구가 작으면 빔이 넓어서 협대역 근사가 아주 넉넉하게 성립한다. 개구를 열 배로 키우면 빔폭도 십 분의 일이 되므로 같은 대역폭에서 밀림 비율이 열 배가 된다. 대형 배열에서 부배열마다 지연선을 넣는 이유가 이것이다.
6. C 로 구현하기
가중을 미리 만들어 두고 표본마다 곱해 더하는 구조다. 세 벌을 함께 만드는데, 합 빔과 두 개의 차 빔이다. 차 빔은 다음 절에서 쓴다.
1
2
3
4
5
6
7
8
9
/* mbf.h — 협대역 다중빔 형성기 */
typedef struct { float re, im; } cf32;
typedef struct { float x, y; } mbf_elem; /* 소자 위치, 파장 단위 */
typedef struct { float u, v; } mbf_dir; /* 빔 방향, 방향 코사인 */
typedef struct {
int n_elem, n_beam;
cf32 *w_sum, *w_az, *w_el; /* [빔][소자] */
} mbf;
규약을 먼저 정해 둔다. 방향 $(u, v)$ 에서 온 평면파는 소자 $e$ 에 $e^{+j2\pi(u x_e + v y_e)}$ 로 닿는다. 그러므로 가중은 부호가 반대인 $e^{-j2\pi(u_0 x_e + v_0 y_e)}$ 이고, 출력은 켤레를 취하지 않고 그냥 곱해 더하면 된다.
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
#define TWO_PI 6.28318530717958648f
static void steer(cf32 *restrict w, const mbf_elem *restrict pos,
const float *restrict taper, int n_elem, float u0, float v0)
{
for (int e = 0; e < n_elem; ++e) {
const float ph = -TWO_PI * (u0 * pos[e].x + v0 * pos[e].y);
w[e].re = taper[e] * cosf(ph);
w[e].im = taper[e] * sinf(ph);
}
}
/* 차 채널은 개구를 반으로 갈라 부호를 뒤집는다.
* 대칭 가중에서 합은 실수, 차는 순허수가 되므로 −j 를 곱해
* Re(Δ/Σ) 가 그대로 각도가 되게 맞춘다. */
static void split(cf32 *restrict wd, const cf32 *restrict ws,
const mbf_elem *restrict pos, int n_elem, int use_y)
{
for (int e = 0; e < n_elem; ++e) {
const float c = ((use_y ? pos[e].y : pos[e].x) < 0.0f) ? -1.0f : 1.0f;
wd[e].re = c * ws[e].im; /* (−j)·(a+jb) = b − ja */
wd[e].im = -c * ws[e].re;
}
}
int mbf_init(mbf *m, const mbf_elem *pos, int n_elem,
const mbf_dir *dir, int n_beam, const float *taper)
{
if (n_elem <= 0 || n_beam <= 0) return -1;
const size_t n = (size_t)n_beam * (size_t)n_elem;
cf32 *buf = (cf32 *)calloc(3u * n, sizeof *buf);
if (!buf) return -1;
m->n_elem = n_elem; m->n_beam = n_beam;
m->w_sum = buf; m->w_az = buf + n; m->w_el = buf + 2u * n;
for (int b = 0; b < n_beam; ++b) {
const size_t o = (size_t)b * (size_t)n_elem;
steer(m->w_sum + o, pos, taper, n_elem, dir[b].u, dir[b].v);
split(m->w_az + o, m->w_sum + o, pos, n_elem, 0);
split(m->w_el + o, m->w_sum + o, pos, n_elem, 1);
}
return 0;
}
적용하는 쪽은 세 겹 반복문이다. 빔을 가장 바깥에 두어 그 빔의 가중 세 벌이 캐시에 머물게 하고, 표본은 스트리밍으로 지나가게 한다.
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
void mbf_run(const mbf *restrict m, const cf32 *restrict x, int n_samp,
cf32 *restrict y_sum, cf32 *restrict y_az, cf32 *restrict y_el)
{
const int ne = m->n_elem, nb = m->n_beam;
for (int b = 0; b < nb; ++b) {
const cf32 *ws = m->w_sum + (size_t)b * ne;
const cf32 *wa = m->w_az + (size_t)b * ne;
const cf32 *we = m->w_el + (size_t)b * ne;
for (int t = 0; t < n_samp; ++t) {
const cf32 *xs = x + (size_t)t * ne;
float sr = 0.0f, si = 0.0f, ar = 0.0f, ai = 0.0f, er = 0.0f, ei = 0.0f;
for (int e = 0; e < ne; ++e) {
const float xr = xs[e].re, xi = xs[e].im;
sr += ws[e].re * xr - ws[e].im * xi;
si += ws[e].re * xi + ws[e].im * xr;
ar += wa[e].re * xr - wa[e].im * xi;
ai += wa[e].re * xi + wa[e].im * xr;
er += we[e].re * xr - we[e].im * xi;
ei += we[e].re * xi + we[e].im * xr;
}
const size_t o = (size_t)b * n_samp + t;
y_sum[o].re = sr; y_sum[o].im = si;
y_az [o].re = ar; y_az [o].im = ai;
y_el [o].re = er; y_el [o].im = ei;
}
}
}
계산량이 어디서 막히는가
표본 하나마다 필요한 복소곱은 소자 수 × 빔 수 × 채널 수다.
| 구성 | 표본마다 복소곱 | 10 MSPS 면 |
|---|---|---|
| 소자 256 × 빔 14 × 합만 | 3,584 회 | 초당 35.8 G |
| 소자 256 × 빔 70 × 합만 | 17,920 회 | 초당 179 G |
| 소자 256 × 빔 70 × 세 채널 | 53,760 회 | 초당 538 G |
| 부배열 32 채널 × 빔 70 × 세 채널 | 6,720 회 | 초당 67 G |
위 코드를 -O3 -march=native 로 빌드해 한 코어에서 재 보면 초당 1.2 G 복소곱이 나온다. 필요한 538 G 와는 자릿수가 다르다. 평범한 C 로는 실시간에 한참 못 미친다는 것이 요점이다. 실제로는 SIMD 로 벡터화하고 여러 코어에 나누거나, FPGA 와 GPU 로 내린다.
한 가지 손쉬운 개선은 배치다. 위 코드처럼 실수부와 허수부를 구조체로 묶어 두면(cf32 {re, im}) 컴파일러가 벡터화하기 어렵다. 실수부 배열과 허수부 배열을 따로 두면 같은 계산이 초당 3.0 G 로 2.5 배 빨라진다. 그래도 자릿수가 모자라므로, 채널 수를 줄이는 부배열 구성이 함께 필요하다.
7. 다중빔에서의 합·차
다중빔으로 검출까지 했으면 다음은 각도다. 표적이 어느 빔에 걸렸는지만 알면 그 빔의 폭만큼 거친 각도밖에 나오지 않으므로, 빔 안 어디에 있는지를 따로 재야 한다.
그림 8. 왼쪽은 빔마다 가중을 세 벌 두는 방식, 오른쪽은 격자에 이미 있는 이웃 빔을 빼는 방식이다.
방법이 둘이다.
빔마다 가중을 세 벌 두는 방식. 합 빔은 모든 소자에 같은 부호를 주고, 방위차 빔은 개구를 좌우로 갈라, 고각차 빔은 위아래로 갈라 한쪽 부호를 뒤집는다. 앞 절의 split 이 하는 일이 그것이다. 빔 $M$ 개면 가중이 $3M$ 벌이 되어 계산이 세 배가 된다. 대신 차 빔의 가중을 합 빔과 따로 설계할 수 있다.
이웃한 빔을 빼는 방식. 격자에 이미 빔이 여러 개 서 있으므로, 마주 보는 두 빔의 차가 곧 차 빔이다. 수신 다섯 빔이라면 빔 1 과 빔 2 의 차가 방위차, 빔 1 과 빔 3 의 차가 고각차다. 가중을 더 만들 필요가 없다. 대신 기울기가 빔 간격에 묶인다.
| 빔 쌍 | 간격 ÷ 빔폭 | S 곡선 기울기 $k_m$ | SNR 20 dB 각도 오차 |
|---|---|---|---|
| 수신 5빔 좌우 | 0.96 | 1.381 | 빔폭의 1/20 |
| 수신 5빔 상하 | 0.82 | 1.143 | 빔폭의 1/16 |
| 탐색 격자 $u$ | 1.19 | 1.787 | 빔폭의 1/25 |
멀리 떨어진 빔 쌍일수록 기울기가 가팔라 각도가 예민해진다. 다만 그만큼 두 빔이 함께 세게 받는 구간이 좁아지므로, 표적이 두 빔 사이에 있을 때만 쓸 수 있다.
잰 값을 어디에 더하는가
어느 방식이든 나오는 값은 그 빔이 향한 방향에서 얼마나 벗어났는지다. 실제 방향은 빔 좌표에 이 값을 더한 것이다.
\[\hat{u} = u_b + \frac{\Delta u_{3\mathrm{dB}}}{k_{m,u}}\,\mathrm{Re}\!\left(\frac{\Delta_{az}}{\Sigma}\right), \qquad \hat{v} = v_b + \frac{\Delta v_{3\mathrm{dB}}}{k_{m,v}}\,\mathrm{Re}\!\left(\frac{\Delta_{el}}{\Sigma}\right)\]$u$–$v$ 로 적어 둔 값이 여기서 한 번 더 편해진다. 빔이 격자 어디에 있든 같은 식으로 더하기만 하면 되고, 기울기를 빔마다 다시 잴 필요가 없다. 각도로 관리했다면 조향각에 따라 빔폭과 기울기가 모두 달라지므로 빔마다 표를 따로 들고 있어야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* 빔 안에서 벗어난 양을 방향 코사인 단위로 돌려준다. */
void mbf_monopulse(const cf32 *s, const cf32 *a, const cf32 *e,
float du_3db, float dv_3db, float km_u, float km_v,
float *du, float *dv)
{
const float p = s->re * s->re + s->im * s->im;
if (p <= 0.0f) { *du = *dv = 0.0f; return; }
/* Re(Δ/Σ) = Re(Δ·conj(Σ)) / |Σ|² */
const float ru = (a->re * s->re + a->im * s->im) / p;
const float rv = (e->re * s->re + e->im * s->im) / p;
*du = du_3db / km_u * ru;
*dv = dv_3db / km_v * rv;
}
16 × 16 배열에 해밍 가중을 걸고 $(u, v) = (0.021, -0.013)$ 에서 오는 평면파를 넣어 보면, 가장 센 빔은 가운데 빔이 잡히고 되짚은 값이 $(0.02115, -0.01303)$ 이 나온다. 오차가 0.00015 로 빔폭의 0.1 % 다.
$\mathrm{Re}$ 를 쓰는 이유는 그대로다. 표적이 하나뿐이고 채널이 잘 맞춰져 있으면 $\Delta/\Sigma$ 는 실수에 가깝다. 허수부에 값이 생겼다면 채널이 어긋났거나 빔 안에 표적이 둘 이상이라는 뜻이라, 그것을 이상 감시 지표로 쓴다.
8. 정리
| 질문 | 답 |
|---|---|
| 왜 각도 대신 $u$, $v$ 인가 | 배열 응답이 $u - u_0$ 의 함수라서, 조향해도 빔 모양과 넓이가 변하지 않는다. 격자를 한 번 정하면 고칠 일이 없다 |
| 빔을 얼마나 띄우는가 | 빔폭만큼 띄우면 사이가 $-3$ dB 다. 촘촘할수록 손실이 줄지만 빔 수와 계산량이 늘어난다 |
| 사양의 이득은 어디서 잡는가 | 빔 정점이 아니라 빔 사이 교차점이다. 어느 방향에서도 보장해야 하는 값이기 때문이다 |
| 왜 송신빔 하나에 수신빔 여럿인가 | 송신이 덮은 칸을 나눠 받으면 구석이 덜 꺼진다. 한 빔이면 $-6.4$ dB, 다섯이면 $-2.2$ dB 다 |
| 확장 송신과 집중 송신 | 덮는 넓이가 같으니 넓히면 이득이 내려가고 나눠 쏘면 시간이 든다. 11.8 dB 와 14 배가 거의 상쇄된다 |
| 무엇을 기준으로 고르는가 | 한 조사의 탐지 거리인가, 갱신 주기인가. 성능이 아니라 운용이 정한다 |
| 위상으로 지연을 대신해도 되는가 | 밴드 가장자리에서 빔이 밀리는 양이 빔폭에 견줘 작으면 된다. 개구가 작을수록 넉넉하다 |
| 계산량은 어디서 막히는가 | 소자 × 빔 × 채널이 표본마다 필요하다. 평범한 C 로는 자릿수가 모자라 부배열과 SIMD 가 함께 필요하다 |
| 각도는 어떻게 재는가 | 빔마다 합·차를 만들거나 이웃 빔을 뺀다. 잰 값은 그 빔 좌표에 더하면 그대로 방향이 된다 |
참고 자료
- R. J. Mailloux, Phased Array Antenna Handbook, Artech House — 방향 코사인 좌표, 빔 격자 설계, 합·차 빔 가중
- R. C. Hansen, Phased Array Antennas, Wiley — 다중빔 배열, 빔 교차 손실과 격자 간격
- H. L. Van Trees, Optimum Array Processing, Wiley — 협대역 가정과 그 한계, 빔포밍 연산의 구조
- M. A. Richards, Fundamentals of Radar Signal Processing, McGraw-Hill — 디지털 빔포밍의 계산량, 부배열 구성
- S. M. Sherman, D. K. Barton, Monopulse Principles and Techniques, Artech House — 이웃 빔에서 차 빔을 얻는 구성과 기울기