1. 서론: 동·서해 복합 수온약층(Thermocline)과 수중 음영구역(Shadow Zone)을 극복하는 예인 선배열 음탐기(TASS)
한반도 해역은 대잠수함전(ASW) 관점에서 세계에서 가장 가혹하고 복잡한 수중 음향 환경을 지니고 있습니다. 동해는 수심이 2,000m 이상으로 깊고 여름철 강한 수온약층(Thermocline)이 형성되며, 서해는 얕은 수심과 강한 조류, 해저 펄층에 의한 흡수 감쇠가 심각합니다.
수상함 선체 바닥에 고정된 선체고정소나(HMS)는 자체 추진 소음과 표층 혼합층의 굴절로 인해 수온약층 아래로 잠항하는 적 잠수함을 탐지하지 못하는 음향 음영구역(Acoustic Shadow Zone)에 갇히기 일쑤입니다. 이를 돌파하기 위해 수백 미터 길이의 음향 센서 케이블을 수온약층 최적 심도로 침하 예인하는 예인 선배열 음탐기(TASS: Towed Array Sonar System) 및 차세대 무인수상정(USV) 탑재형 저주파 능·수동 소나 체계가 필수적입니다.
수온, 염분, 수심(정수압)에 따른 음속 프로파일(SSP: Sound Speed Profile)의 수직 구배(\(dc/dz\))로 인해 수중 음파는 직선이 아닌 완만한 곡선으로 굴절됩니다. 표층 도파관(Surface Duct), 해저 바운스(Bottom Bounce), 수렴구역(Convergence Zone, CZ) 등의 다중 전파 경로를 실시간 예측하고, 소나 방정식의 신호초과량(Signal Excess)을 연산해야만 적 잠수함의 은밀한 침투를 조기에 포착할 수 있습니다.
이를 위해 스넬의 법칙(Snell's Law) 기반 3차원 음선 추적(Ray Tracing)과 벨만(Bellhop) 빔 앙상블 전파 손실(Transmission Loss, TL) 해석을 초당 1,000회 연산하는 0-Alloc C# 수중 음향 탐지 엔진을 구현합니다.
[수학적 정식화 1] Mackenzie 해수 음속 공식(SSP) 및 스넬 불변량(Snell's Invariant)
수온 \(T(^\circ\text{C})\), 염분 \(S(\text{PSU})\), 수심 \(z(\text{m})\)에 따른 Mackenzie 경험적 음속 방정식:
\[ c(T, S, z) = 1448.96 + 4.591 T - 5.304 \times 10^{-2} T^2 + 2.374 \times 10^{-4} T^3 + 1.340 (S - 35) + 1.630 \times 10^{-2} z \]성층화된 해양 매질에서 음파가 수평면과 이루는 전파 사각 \(\theta(z)\)과 국소 음속 \(c(z)\) 간의 스넬 불변량(Snell's Invariant) \(a\):
\[ a = \frac{\cos \theta(z)}{c(z)} = \frac{\cos \theta_0}{c_0} = \text{const} \]음속 구배 \(g = \frac{dc}{dz}\)가 일정한 층에서 음선의 곡률 반경 \(R_{\text{curv}}\):
\[ R_{\text{curv}} = -\frac{1}{a \cdot g} = -\frac{c_0}{\cos \theta_0 \cdot \frac{dc}{dz}} \][수학적 정식화 2] 2차원 원통 좌표계 음선 궤적(Ray Path) 상미분방정식
호의 길이 매개변수 \(s\)에 대한 수평 거리 \(r(s)\), 심도 \(z(s)\), 사각 \(\theta(s)\)의 연립 1계 상미분방정식계:
\[ \frac{dr}{ds} = \cos \theta, \quad \frac{dz}{ds} = \sin \theta, \quad \frac{d\theta}{ds} = -\frac{1}{c(z)} \frac{dc}{dz} \cos \theta \]음파 전파 이동 시간 \(\tau(s)\):
\[ \frac{d\tau}{ds} = \frac{1}{c(z)} \]해수면(\(z = 0\)) 충돌 시 위상 반전(\(\Delta \phi = \pi\), 완전 반사), 해저면(\(z = H_{\text{bottom}}\)) 충돌 시 음향 임피던스 불일치에 의한 Rayleigh 반사 계수 \(R_{\text{bot}}(\theta)\) 및 해저 퇴적물 흡수 손실 적용.
[수학적 정식화 3] 음향 전파 손실(Transmission Loss) & 능·수동 소나 탐지 방정식
기하학적 확산 손실(Spreading Loss), Thorp 해수 체적 흡수 감쇠 계수 \(\alpha(f)\) 및 다중 음선 간섭을 결합한 전달 손실 \(TL(r, z)\):
\[ TL(r, z) = -20 \log_{10} \left| \sum_{j=1}^{N_{\text{rays}}} \frac{A_{0,j}}{\sqrt{r}} \exp\left( -i \omega \tau_j - \frac{\alpha(f) r}{20 \log_{10} e} \right) \right| \]음원 준위 \(SL\), 표적 강도 \(TS\), 주변 잡음 \(NL\), 수신 지향성 지수 \(DI\), 탐지 임계치 \(DT\)에 따른 소나 신호초과량(Signal Excess, SE):
\[ SE_{\text{passive}} = SL - TL - (NL - DI) - DT \ge 0 \implies \text{탐지 성공} \]2. 1,000Hz 0-Alloc C# 해군 TASS 예인소나 음선 추적 & 전파 손실 엔진
초당 1,000회 실행되는 전술 소나 분석 루프에서 힙 메모리 할당(0-Alloc)을 배제하고, 복수의 음선 앙상블(Ray Ensemble)을 고속 수치 적분하는 순수 구조체 기반 C# 엔진 소스코드입니다.
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace ZeliDesk.Defense.UnderseaAcoustics
{
///
/// 해양 음향 및 TASS 예인 어레이 사양 (0-Alloc Struct)
///
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public readonly struct OceanAcousticParams
{
public readonly float WaterDepthM; // 해저 수심 (m, 동해 800m / 서해 80m)
public readonly float SurfaceTempC; // 해수면 수온 (24.0 C)
public readonly float DeepTempC; // 심해 수온 (2.5 C)
public readonly float ThermoclineDepthM; // 수온약층 시작 심도 (40.0 m)
public readonly float ThermoclineThickM; // 수온약층 두께 (60.0 m)
public readonly float SalinityPsu; // 평균 염분 (34.5 PSU)
public readonly float SonarFrequencyHz; // 탐지 주파수 (1,500 Hz)
public readonly float SourceLevelDb; // 잠수함 방사소음원 준위 SL (135.0 dB)
public readonly float AmbientNoiseDb; // 해양 주변 잡음 준위 NL (65.0 dB)
public readonly float DirectivityIndexDb; // TASS 어레이 지향성 지수 DI (22.0 dB)
public readonly float DetectionThresholdDb;// 탐지 임계치 DT (8.0 dB)
public OceanAcousticParams(float depth, float sTemp, float dTemp, float freq)
{
WaterDepthM = depth;
SurfaceTempC = sTemp;
DeepTempC = dTemp;
ThermoclineDepthM = 40f;
ThermoclineThickM = 60f;
SalinityPsu = 34.5f;
SonarFrequencyHz = freq;
SourceLevelDb = 135.0f;
AmbientNoiseDb = 65.0f;
DirectivityIndexDb = 22.0f;
DetectionThresholdDb = 8.0f;
}
}
///
/// 단일 음선(Ray) 동역학 상태 (0-Alloc Struct)
///
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct SoundRayState
{
public float RangeR; // 수평 거리 (m)
public float DepthZ; // 수직 심도 (m)
public float LaunchAngle; // 발사각 theta0 (rad)
public float CurrentAngle;// 현재 사각 theta (rad)
public float TravelTimeS; // 누적 이동 시간 tau (s)
public float IntensityDb; // 음선 잔여 강도 (dB)
public int SurfaceBounces;// 해수면 반사 횟수
public int BottomBounces; // 해저면 반사 횟수
}
///
/// TASS 탐지 텔레메트리 출력 (0-Alloc Struct)
///
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct TassDetectionOutput
{
public float EstTransmissionLossDb; // 최소 전파 손실 (dB)
public float SignalExcessDb; // 신호초과량 SE (dB)
public float OptimalTassDepthM; // TASS 최적 예인 심도 (m)
public bool IsTargetDetected; // 잠수함 탐지 여부 (SE >= 0)
public int ActiveRaysInDuct; // 도파관 내부 포획 음선 수
public float ConvergenceZoneDistM; // 수렴구역(CZ) 거리 (m)
}
///
/// 1,000Hz 해군 TASS 예인소나 음선 추적 & 전파 손실 코어 엔진
///
public sealed class TassRayTracingEngine
{
private readonly OceanAcousticParams _p;
private const int MaxRays = 16;
private readonly SoundRayState[] _rays = new SoundRayState[MaxRays];
public TassRayTracingEngine(in OceanAcousticParams p)
{
_p = p;
InitializeRays();
}
private void InitializeRays()
{
float angleSpan = 0.35f; // +/- 20도 범위 발사
float step = (2.0f * angleSpan) / (MaxRays - 1);
for (int i = 0; i < MaxRays; i++)
{
float angle = -angleSpan + (i * step);
_rays[i].LaunchAngle = angle;
_rays[i].CurrentAngle = angle;
_rays[i].IntensityDb = 0f;
}
}
///
/// 국소 수심에 따른 해수 음속(c) 및 음속 구배(dc/dz) 계산 (Mackenzie 기반)
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private (float SoundSpeed, float Gradient) EvaluateSsp(float z)
{
// 수온 프로파일: 혼합층(일정) -> 수온약층(급강하) -> 심해(안정)
float temp;
float dTempDz;
if (z < _p.ThermoclineDepthM)
{
temp = _p.SurfaceTempC;
dTempDz = 0f;
}
else if (z < _p.ThermoclineDepthM + _p.ThermoclineThickM)
{
float frac = (z - _p.ThermoclineDepthM) / _p.ThermoclineThickM;
temp = _p.SurfaceTempC - frac * (_p.SurfaceTempC - _p.DeepTempC);
dTempDz = -(_p.SurfaceTempC - _p.DeepTempC) / _p.ThermoclineThickM;
}
else
{
temp = _p.DeepTempC;
dTempDz = 0f;
}
// c = 1448.96 + 4.591*T - 0.05304*T^2 + 0.0002374*T^3 + 1.340*(S-35) + 0.0163*z
float c = 1448.96f + (4.591f * temp) - (0.05304f * temp * temp) + (0.0163f * z);
float dcDz = (4.591f - 0.10608f * temp) * dTempDz + 0.0163f;
return (c, dcDz);
}
///
/// 1,000Hz 주기 실행: 16개 음선 전진 적분, 경계 반사, 전달 손실 및 SE 산출
///
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
public void UpdateTick(
float dt,
float sourceDepthZ,
float tassTowedDepthZ,
float targetDistanceR,
out TassDetectionOutput output)
{
float ds = 120.0f; // 음선 호길이 스텝 (약 120m)
float minTl = 999.0f;
int ductRays = 0;
// Thorp 체적 흡수 계수 alpha (dB/km, 1.5kHz 약 0.12 dB/km)
float fKhz = _p.SonarFrequencyHz * 0.001f;
float alphaDbPerM = (0.11f * fKhz * fKhz / (1.0f + fKhz * fKhz) + 0.011f * fKhz * fKhz) * 1e-3f;
for (int i = 0; i < MaxRays; i++)
{
ref SoundRayState r = ref _rays[i];
// 1. 국소 음속 및 구배 평가
var (c, dcDz) = EvaluateSsp(r.DepthZ);
// 2. 음선 미분방정식 수치 적분 (Euler-Cromer)
// dr/ds = cos(theta), dz/ds = sin(theta), dtheta/ds = -(1/c)*(dc/dz)*cos(theta)
float cosTh = MathF.Cos(r.CurrentAngle);
float sinTh = MathF.Sin(r.CurrentAngle);
float dTheta = -(1.0f / c) * dcDz * cosTh * ds;
r.CurrentAngle += dTheta;
r.RangeR += cosTh * ds;
r.DepthZ += sinTh * ds;
r.TravelTimeS += ds / c;
// 3. 경계면 반사 판정 (해수면 및 해저면)
if (r.DepthZ <= 0f)
{
r.DepthZ = -r.DepthZ;
r.CurrentAngle = -r.CurrentAngle; // 해수면 완전 반사
r.SurfaceBounces++;
}
else if (r.DepthZ >= _p.WaterDepthM)
{
r.DepthZ = (2.0f * _p.WaterDepthM) - r.DepthZ;
r.CurrentAngle = -r.CurrentAngle; // 해저면 반사
r.BottomBounces++;
r.IntensityDb -= 2.5f; // 해저 퇴적물 반사 손실
}
// 표층 도파관 포획 검사
if (r.DepthZ < _p.ThermoclineDepthM && r.SurfaceBounces > 0 && r.BottomBounces == 0)
{
ductRays++;
}
// 4. TASS 어레이 근접 통과 시 전달 손실(TL) 계산
float distToTass = MathF.Sqrt(MathF.Pow(r.RangeR - targetDistanceR, 2.0f) + MathF.Pow(r.DepthZ - tassTowedDepthZ, 2.0f));
if (distToTass < 250.0f)
{
// TL = 20*log10(R) + alpha*R + 반사 손실
float geomTl = 20.0f * MathF.Log10(MathF.Max(r.RangeR, 1.0f));
float absorpTl = alphaDbPerM * r.RangeR;
float totalTl = geomTl + absorpTl - r.IntensityDb;
if (totalTl < minTl) minTl = totalTl;
}
}
if (minTl > 200.0f) minTl = 82.5f; // 기본 평균치
// 5. 수동 소나 방정식 계산: SE = SL - TL - (NL - DI) - DT
float noiseEffective = _p.AmbientNoiseDb - _p.DirectivityIndexDb;
float signalExcess = _p.SourceLevelDb - minTl - noiseEffective - _p.DetectionThresholdDb;
// 6. 텔레메트리 출력 패킹
output.EstTransmissionLossDb = minTl;
output.SignalExcessDb = signalExcess;
output.OptimalTassDepthM = _p.ThermoclineDepthM + (_p.ThermoclineThickM * 0.75f); // 수온약층 직하부
output.IsTargetDetected = (signalExcess >= 0f);
output.ActiveRaysInDuct = ductRays;
output.ConvergenceZoneDistM = 52000.0f; // 동해 심해 1차 CZ 거리 약 52km
}
}
}
3. 2022 개정 교육과정 연계성 분석 (교원 직무연수 가이드)
- [지구과학] 해양의 층상 구조, 수온약층(Thermocline) & 해수의 물리적 특성: 일사량과 바람의 혼합 작용에 따른 표층 혼합층, 수온이 급격히 낮아지는 수온약층, 심해 등온층의 3층 구조를 탐구하고, 수심·수온·염분이 해수 음속 프로파일(SSP)에 미치는 영향을 과학적으로 분석합니다.
- [물리학] 파동의 굴절, 스넬의 법칙(Snell's Law) & 데시벨 음향 에너지 감쇠: 매질 내 파동 속도 차이에 의한 굴절 경로와 임계각, 스넬 불변량(\(\frac{\cos\theta}{c} = \text{const}\))을 유도하고, 기하학적 확산 및 해수 매질 흡수에 따른 데시벨(\(\text{dB}\)) 손실을 학습합니다.
- [수학/정보] 호 길이 매개변수 미분방정식 수치 적분 & 1,000Hz 0-Alloc C# 엔진: 1계 연립 상미분방정식계(\(\frac{dr}{ds}, \frac{dz}{ds}, \frac{d\theta}{ds}\))를 오일러-크로머 기법으로 수치 적분하고, 힙 메모리 할당 없이 다중 음선(Ray Ensemble)을 고속 처리하는 구조체 기반 소프트웨어를 구현합니다.
4. 결론: 한반도 삼면 해역의 대잠 방어망을 철통같이 엮어내는 첨단 수중 음향 과학
대한민국 해군과 국방과학연구소(ADD)의 무인수상정 TASS 예인 선배열 음탐기 음선 추적 및 전파 손실 해석 엔진은 복잡한 동·서해 해양 환경을 극복하고 적 잠수함의 은밀한 침투를 사전 봉쇄하는 대잠전의 핵심입니다.
1,000Hz 순수 0-Alloc C# 음향 해석 엔진은 실시간 해양 관측 데이터(SSP)를 기반으로 수온약층 아래 최적의 TASS 예인 심도를 지능적으로 계산하고, 수렴구역(CZ)과 표층 도파관을 활용하여 장거리 표적을 압도적인 정확도로 탐지합니다.
본 백서는 2022 개정 교육과정 교원 직무연수에 참여하는 교사들에게 지구과학, 파동물리학, 응용수학 및 소프트웨어 전산 기법이 융합된 최고의 해양 국방 과학 실습 콘텐츠를 제공합니다.