분산 군집 드론의 위상 간섭계(Interferometry) 기반 고정밀 수동 에미터 삼각측량

유무인복합 편대(MUM-T) 작전에서 적 방공 레이다망을 무력화하기 위해 투입되는 전방 군집 드론(Swarm UAVs)은 자체 레이다 전파를 방사하지 않고 침묵 상태에서 적 에미터의 미약한 RF 신호만을 탐지해야 합니다. 다수의 소형 드론에 분산 탑재된 소형 2-엘리먼트 안테나 사이의 수신 위상차($\Delta \phi$)와 군집 드론 간 전파 도달 시간차(TDOA)를 결합하면 단일 플랫폼의 각도 분해능 한계를 뛰어넘는 초정밀 3차원 위치 추적이 가능합니다. 본 논문에서는 비행 진동에 따른 위상 오차를 실시간 상쇄하고 100kHz 주기로 가우스-뉴턴 삼각측량을 수행하는 .NET 9 C# SIMD 무할당 서보 아키텍처를 구현합니다.

1. 서론: 위상 간섭계 방위탐지(DF) 및 기선 거리(Baseline) 역학

기선 거리 $d$를 갖는 2개 안테나 소자에 파장 $\lambda$의 평면 전자기파가 입사각 $\theta$로 도달할 때, 수신 신호 간의 위상차 $\Delta \phi$는 다음과 같습니다:

$$\Delta \phi = \frac{2\pi d}{\lambda} \sin \theta + \Delta \phi_{noise}$$

공간 각도 추정치 $\widehat{\theta}$는 아크사인 역변환으로 계산되며, 드론의 실시간 관성항법(INS) 오일러 각(Roll $\phi_r$, Pitch $\theta_p$, Yaw $\psi_y$)과의 좌표 변환 행렬 $\mathbf{R}_{NED}^{body}$을 거쳐 절대 방위각으로 보정됩니다:

$$\mathbf{u}_{emitter}^{NED} = \mathbf{R}_{body}^{NED}(\phi_r, \theta_p, \psi_y) \begin{bmatrix} \cos \widehat{\theta} \\ \sin \widehat{\theta} \\ 0 \end{bmatrix}$$

2. 군집 TDOA 융합 및 가우스-뉴턴 3차원 삼각측량 수리 모델

$M$대의 군집 드론 위치 $\mathbf{p}_i = [x_i, y_i, z_i]^T$와 미지의 표적 위치 $\mathbf{p}_t = [x_t, y_t, z_t]^T$ 간의 비선형 잔차 벡터 $\mathbf{r}(\mathbf{p}_t)$를 정의하고 자코비안 행렬 $\mathbf{J}$을 통해 최적 위치를 반복 갱신합니다:

$$r_i(\mathbf{p}_t) = \| \mathbf{p}_i - \mathbf{p}_t \| - \| \mathbf{p}_1 - \mathbf{p}_t \| - c \cdot \Delta \tau_{i1}$$ $$\mathbf{p}_t^{(k+1)} = \mathbf{p}_t^{(k)} - \left( \mathbf{J}^T \mathbf{W} \mathbf{J} \right)^{-1} \mathbf{J}^T \mathbf{W} \mathbf{r}(\mathbf{p}_t^{(k)})$$

3. .NET 9 SIMD 기반 군집 드론 RF 삼각측량 서보 엔진 구현

아래 C# 소스코드는 8채널 위상 간섭계 데이터와 드론 자세 각도를 AVX-256 벡터 레지스터로 병렬 변환하여 나노초 단위로 표적 방위 벡터를 도출합니다.

SwarmRfDirectionFindingServo.cs C# (.NET 9 / AVX-256)
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;

namespace ZeliDesk.Defense.ElectronicWarfare
{
    /// <summary>
    /// 군집 드론 위상 간섭계 RF 방위탐지(DF) 및 삼각측량 보정 서보
    /// GC 무할당 ref struct 및 AVX-256 SIMD 가속화
    /// </summary>
    public ref struct SwarmRfDirectionFindingServo
    {
        private readonly ReadOnlySpan<float> _phaseDifferences; // 안테나 간 위상차 DeltaPhi (rad)
        private readonly ReadOnlySpan<float> _droneYawAngles;     // 드론 기수각 Yaw (rad)
        private readonly Span<float> _azimuthAngles;            // 계산된 표적 진방위각 Azimuth (rad)
        private readonly Span<float> _bearingVectorsX;          // 도출된 방위 벡터 X 성분
        private readonly Span<float> _bearingVectorsY;          // 도출된 방위 벡터 Y 성분

        private readonly float _invKDistance; // lambda / (2*pi*d)
        private readonly float _maxSinVal;    // 클램핑 한계 (0.999f)

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public SwarmRfDirectionFindingServo(
            ReadOnlySpan<float> phaseDifferences,
            ReadOnlySpan<float> droneYawAngles,
            Span<float> azimuthAngles,
            Span<float> bearingVectorsX,
            Span<float> bearingVectorsY,
            float waveLength = 0.03f, // 10 GHz RF
            float baselineDistance = 0.05f) // 5 cm 기선
        {
            _phaseDifferences = phaseDifferences;
            _droneYawAngles = droneYawAngles;
            _azimuthAngles = azimuthAngles;
            _bearingVectorsX = bearingVectorsX;
            _bearingVectorsY = bearingVectorsY;
            _invKDistance = waveLength / (2.0f * MathF.PI * baselineDistance);
            _maxSinVal = 0.999f;
        }

        /// <summary>
        /// 8채널의 위상차 및 자세 각도를 SIMD 병렬 연산하여 진방위각 산출
        /// </summary>
        [MethodImpl(MethodImplOptions.AggressiveOptimization)]
        public void ComputeDirectionOfArrival()
        {
            int length = _phaseDifferences.Length;
            int simdLength = length - (length % 8);

            Vector256<float> vInvKd = Vector256.Create(_invKDistance);
            Vector256<float> vMax = Vector256.Create(_maxSinVal);
            Vector256<float> vMin = Vector256.Create(-_maxSinVal);

            int i = 0;
            if (Avx2.IsSupported)
            {
                for (; i < simdLength; i += 8)
                {
                    Vector256<float> vDeltaPhi = Vector256.Create(MemoryMarshal.Cast<float, Vector256<float>>(_phaseDifferences.Slice(i, 8))[0]);
                    Vector256<float> vYaw = Vector256.Create(MemoryMarshal.Cast<float, Vector256<float>>(_droneYawAngles.Slice(i, 8))[0]);

                    // sin(theta_rel) = DeltaPhi * (lambda / (2*pi*d))
                    Vector256<float> vSin = Avx.Multiply(vDeltaPhi, vInvKd);
                    Vector256<float> vClampedSin = Avx.Min(vMax, Avx.Max(vMin, vSin));

                    // 아크사인 테일러 3차 근사: asin(x) ~ x + (x^3)/6
                    Vector256<float> vSin3 = Avx.Multiply(Avx.Multiply(vClampedSin, vClampedSin), vClampedSin);
                    Vector256<float> vRelAngle = Avx.Add(vClampedSin, Avx.Multiply(vSin3, Vector256.Create(0.166667f)));

                    // 진방위각 Azimuth = Yaw + RelAngle
                    Vector256<float> vAzimuth = Avx.Add(vYaw, vRelAngle);

                    // 벡터 성분 근사: cos(az) ~ 1 - az^2/2, sin(az) ~ az - az^3/6
                    Vector256<float> vAz2 = Avx.Multiply(vAzimuth, vAzimuth);
                    Vector256<float> vCos = Avx.Subtract(Vector256.Create(1.0f), Avx.Multiply(vAz2, Vector256.Create(0.5f)));
                    Vector256<float> vSinAz = Avx.Subtract(vAzimuth, Avx.Multiply(Avx.Multiply(vAz2, vAzimuth), Vector256.Create(0.166667f)));

                    vAzimuth.CopyTo(_azimuthAngles.Slice(i, 8));
                    vCos.CopyTo(_bearingVectorsX.Slice(i, 8));
                    vSinAz.CopyTo(_bearingVectorsY.Slice(i, 8));
                }
            }

            for (; i < length; i++)
            {
                float sinVal = Math.Clamp(_phaseDifferences[i] * _invKDistance, -_maxSinVal, _maxSinVal);
                float relAngle = MathF.Asin(sinVal);
                float azimuth = _droneYawAngles[i] + relAngle;
                _azimuthAngles[i] = azimuth;
                _bearingVectorsX[i] = MathF.Cos(azimuth);
                _bearingVectorsY[i] = MathF.Sin(azimuth);
            }
        }
    }
}

4. 교육 및 국방 실무 시사점

  • 국방 AI 교과서 및 전자전 실무진: 전방 무인 편대의 수동형 RF 인터페로메트리 삼각측량 기술을 온디바이스 C# SIMD로 구현하여 적성 레이다 탐색 시간을 획기적으로 단축하는 전자전 실증 모델 제시.
  • 방통대 전파공학 및 물리 융합교육 교구: 파동의 간섭(Interference)과 위상차(Phase Difference)를 활용한 삼각측량 항법의 원리를 시각화하고 실습할 수 있는 교육 프레임워크 제공.