AIDT 온디바이스 국방 MUM-T 잠수함 발사 자율 음향 기만기(ADC) 능·수동 음향 표적 신호 합성 및 회피 기동 서보 엔진

적 어뢰 능동 소나 핑(Ping) 수신 즉각 반향 모사(Echo Synthetic) 및 광대역 캐비테이션 소음 방출, 심도-침로 회피 서보, 10,000Hz C# 엔진

1. 개요

현대 대잠수함전(ASW)에서 아군 공격원잠 및 디젤 잠수함의 생존성을 좌우하는 최후의 방어 수단은 적 유도어뢰(중어뢰 및 경어뢰) 공격 시 발사관 또는 기만기 발사기에서 사출되는 이동형 자율 음향 기만기(Acoustic Device Countermeasure, ADC / Mobile Decoy)입니다. 적 어뢰는 모함 잠수함을 탐색하기 위해 능동 소나 핑(Ping)과 수동 소음 청음 모드를 번갈아 사용합니다. 자율 음향 기만기는 수신된 적 어뢰 능동 소나 핑의 주파수, 펄스 폭(Pulse Width), 반복 주기(PRI), 도플러 시프트를 수 밀리초 이내에 정밀 분석하여, 모함 잠수함 선체 크기에 상응하는 3차원 표적 반향 강도(Target Strength, TS)와 도플러 변조 에코를 실시간 역합성하여 재방출합니다. 동시에 어뢰의 수동 소나 호밍을 기만하기 위해 모함 추진기 캐비테이션 소음과 엔진 보기류 회전 토널(Tonal)을 발생시키며, 모함의 탈출 경로와 반대되는 방향으로 심도 및 침로를 변경하며 유인 항주합니다. 본 고에서는 핑 수신 신호 분석과 3차원 자율 회피 기동 조타 루프를 10,000Hz 주기로 통합 지휘하는 0-Alloc C# 엔진을 구현합니다.

2. 수학적 모델링 및 지배 방정식

적 어뢰 능동 핑 도달 각도 \(\theta\)에 따른 모함 잠수함 등가 표적 반향 강도(Target Strength, \(\mathrm{TS}\)) 및 도플러 변조 주파수 \(f_d\) 관계식은 다음과 같습니다:

\[ \mathrm{TS}(\theta) = 10 \log_{10}\left( \frac{L_{sub} R_{sub}}{2\lambda} \cos^2\theta + \frac{\pi R_{sub}^2}{4} \sin^2\theta \right) \]
\[ f_{echo}(t) = f_{ping} \left( \frac{c + v_{decoy} \cos\phi_d}{c - v_{torpedo} \cos\phi_t} \right) \]

적 어뢰 능동 핑 수신 후 반향 에코 방출 음향 출력 음압 레벨 \(SL_{echo}\) 및 수동 광대역 방사 소음 \(SL_{broad}\) 합성 방정식은 다음과 같습니다:

\[ SL_{echo}(t) = RL_{ping}(t) + \mathrm{TS}(\theta) - 20\log_{10}(R_{virtual}) + 10\log_{10}(G_{transducer}) \]
\[ s_{tx}(t) = A(SL_{echo}) \cdot \cos(2\pi f_{echo} (t - \tau_{delay})) + \sum_{k=1}^K A_k \cos(2\pi f_k t) + n_{broadband}(t) \]

기만기의 모함 이격 및 어뢰 기만을 위한 3차원 침로 \(\psi_d\) 및 심도 \(z_d\) 자율 조타 제어 법칙은 다음과 같습니다:

\[ \delta_{rudder}[k] = K_{p,\psi} (\psi_{target} - \psi[k]) - K_{d,\psi} r[k], \quad \delta_{stern}[k] = K_{p,z} (z_{target} - z[k]) - K_{d,z} w[k] \]

3. C# 고성능 온디바이스 서보 엔진 구현

10,000Hz 주기로 적 어뢰 핑 신호를 분석하여 기만 음향 신호를 합성하고 조타 타각을 연산하는 0-Alloc C# 엔진입니다.

using System;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Defense.MumT.SubmarineDecoy
{
    /// <summary>
    /// 기만기 수신 하이드로폰 및 어뢰 음향 센서 계측 상태
    /// </summary>
    public readonly ref struct TorpedoAcousticPingState
    {
        public readonly double PingFrequencyKhz;     // 수신된 어뢰 능동 핑 주파수 [kHz]
        public readonly double PingReceivedLevelDb;  // 수신 음압 레벨 (RL) [dB]
        public readonly double TorpedoBearingRad;    // 어뢰 방위각 [rad]
        public readonly double CurrentDepthMeters;   // 기만기 현재 심도 [m]
        public readonly double CurrentHeadingRad;    // 기만기 현재 침로 [rad]
        public readonly double DecoySpeedKnots;      // 기만기 속력 [kt]

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public TorpedoAcousticPingState(double freq, double rl, double bearing, double depth, double heading, double speed)
        {
            PingFrequencyKhz = freq;
            PingReceivedLevelDb = rl;
            TorpedoBearingRad = bearing;
            CurrentDepthMeters = depth;
            CurrentHeadingRad = heading;
            DecoySpeedKnots = speed;
        }
    }

    /// <summary>
    /// 기만 음향 방출 지령 및 회피 조타 명령
    /// </summary>
    public readonly ref struct DecoyDefenseOutput
    {
        public readonly double TransmitSoundLevelDb; // 송신 반향 합성 음압 레벨 [dB]
        public readonly double DopplerShiftHz;       // 도플러 변조 주파수 편위 [Hz]
        public readonly double RudderCommandRad;     // 방향타 조타각 [rad]
        public readonly double SternPlaneCommandRad; // 잠타(승강타) 조타각 [rad]
        public readonly bool IsDecoyActive;          // 기만 음향 방출 유효 플래그

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public DecoyDefenseOutput(double sl, double doppler, double rudder, double stern, bool active)
        {
            TransmitSoundLevelDb = sl;
            DopplerShiftHz = doppler;
            RudderCommandRad = rudder;
            SternPlaneCommandRad = stern;
            IsDecoyActive = active;
        }
    }

    /// <summary>
    /// 10,000Hz 잠수함 자율 음향 기만기(ADC) 신호 합성 및 조타 서보 엔진
    /// </summary>
    public ref struct SubmarineAcousticDecoyServoEngine
    {
        private const double SoundSpeedWater = 1500.0; // 수중 음속 [m/s]
        private readonly double _virtualSubmarineTsDb; // 가상 잠수함 표적 반향 강도 (TS) [dB]
        private readonly double _kpHeading;
        private readonly double _kdHeading;
        private readonly double _kpDepth;
        private readonly double _kdDepth;

        private double _prevHeadingErr;
        private double _prevDepthErr;

        public SubmarineAcousticDecoyServoEngine(
            double virtualSubmarineTsDb,
            double kpHeading,
            double kdHeading,
            double kpDepth,
            double kdDepth)
        {
            _virtualSubmarineTsDb = virtualSubmarineTsDb;
            _kpHeading = kpHeading;
            _kdHeading = kdHeading;
            _kpDepth = kpDepth;
            _kdDepth = kdDepth;
            _prevHeadingErr = 0.0;
            _prevDepthErr = 0.0;
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public DecoyDefenseOutput ProcessCycle(
            in TorpedoAcousticPingState state,
            double targetDepthMeters,
            double targetHeadingRad,
            double dtSeconds)
        {
            // 1. 적 어뢰 능동 핑 수신 판정 (RL > 70dB)
            bool isPingDetected = state.PingReceivedLevelDb >= 70.0;

            // 2. 표적 반향 신호 음압 레벨 및 가상 도플러 연산
            double slEchoDb = 0.0;
            double dopplerHz = 0.0;

            if (isPingDetected)
            {
                // SL = RL + TS
                slEchoDb = state.PingReceivedLevelDb + _virtualSubmarineTsDb;
                slEchoDb = Math.Clamp(slEchoDb, 120.0, 210.0); // 트랜스듀서 출력 한계

                // 도플러 시프트: fd = f0 * (2 * v * cos(theta)) / c
                double speedMps = state.DecoySpeedKnots * 0.514444;
                double relAngle = state.TorpedoBearingRad - state.CurrentHeadingRad;
                dopplerHz = (state.PingFrequencyKhz * 1000.0) * (2.0 * speedMps * Math.Cos(relAngle)) / SoundSpeedWater;
            }

            // 3. 침로 제어 루프 (PD)
            double headingErr = targetHeadingRad - state.CurrentHeadingRad;
            // 각도 랩핑 (-pi ~ +pi)
            while (headingErr > Math.PI) headingErr -= 2.0 * Math.PI;
            while (headingErr < -Math.PI) headingErr += 2.0 * Math.PI;

            double derHeading = (headingErr - _prevHeadingErr) / dtSeconds;
            _prevHeadingErr = headingErr;
            double rudderCmd = Math.Clamp(_kpHeading * headingErr + _kdHeading * derHeading, -0.436, 0.436); // +-25도

            // 4. 심도 제어 루프 (PD)
            double depthErr = targetDepthMeters - state.CurrentDepthMeters;
            double derDepth = (depthErr - _prevDepthErr) / dtSeconds;
            _prevDepthErr = depthErr;
            double sternCmd = Math.Clamp(_kpDepth * depthErr + _kdDepth * derDepth, -0.35, 0.35); // +-20도

            return new DecoyDefenseOutput(slEchoDb, dopplerHz, rudderCmd, sternCmd, isPingDetected);
        }
    }
}

4. 국방 및 교육 적용 방안

  • 국방부 AI 교과서 & 해군작전사령부 잠수함사령부 ASW 훈련: 대잠전 유도어뢰 회피 시뮬레이터, 음향 기만기 능·수동 에코 모사 교구.
  • 국방과학연구소(ADD) 해양기술연구원 / 한화시스템: 차세대 장보고-III 잠수함 탑재 자율 기만기 신호합성기 및 통합 기동 제어기 실장.