원자력 발전소 압력용기 용접부, 잠수함 내압선체, 차세대 스텔스 전투기 탄소복합재(CFRP)의 서브밀리미터 미세 균열을 파괴 없이 검출하는 표준 비파괴 검사 기법은 초음파 전집중 집속법(Total Focusing Method, TFM)입니다. 64채널 초음파 변환기 어레이에서 전 매트릭스 캡처(Full Matrix Capture, FMC)로 수집된 모든 송수신 신호쌍의 지연 시간(Time-of-Flight)을 검사 대상 영역(ROI)의 모든 격자점에 동시 합성하여 회절 한계에 도달하는 고해상도 음향 단층 영상을 1,000Hz 주기로 0-Alloc C# 렌더링하는 실시간 신호처리 엔진을 공개합니다.

1. 2022 개정 교육과정 교과 연계 분석

  • 물리학 (파동의 굴절, 스넬의 법칙 및 하위헌스 원리에 기초한 음향 빔 합성): 종파(Longitudinal wave) 음속 $c_L$과 횡파(Shear wave) 음속 $c_T$, 매질 경계면에서의 음향 임피던스 $Z = \rho c$ 차이에 따른 반사율 $R = \left(\frac{Z_2 - Z_1}{Z_2 + Z_1}\right)^2$.
  • 화학/재료공학 (금속 결정립 미세구조 산란 및 초음파 감쇠): 오스테나이트계 합금 및 복합재의 결정립계(Grain Boundary) 탄성파 레일리 산란 손실 $\alpha(f) = a f + b f^4$ 및 초음파 신호 대 잡음비(SNR) 모델링.
  • 수학 (비행 시간 기하 경로 유클리드 거리 및 2차원 공간 합성 적분): 송신 소자 $i(x_{tx}, 0)$와 수신 소자 $j(x_{rx}, 0)$에서 격자점 $(x, z)$까지의 지연 시간 $t_{ij}(x, z) = \frac{\sqrt{(x - x_{tx,i})^2 + z^2} + \sqrt{(x - x_{rx,j})^2 + z^2}}{c}$ 및 힐베르트 변환 포락선 합산.
  • 정보 (무할당 실시간 1,000Hz 64채널 FMC 집속 및 SIMD 음향 영상화 코어): 1ms 제어 루프 내에서 가비지 컬렉터 중단 없이 수만 개 복셀의 음향 강도를 0-Alloc 인라인으로 고속 병렬 누적하는 C# 온디바이스 엔진.

2. TFM 음향 빔 형성 수식 모델

$N$개 소자를 가진 어레이에서 소자 $i$로 발신하고 소자 $j$로 수신한 시간 영역 FMC 신호를 $s_{ij}(t)$라 할 때, ROI 내부 임의의 점 $(x, z)$에서의 집속 음향 강도 $I(x, z)$는 다음과 같이 계산됩니다:

$$t_{ij}(x, z) = \frac{1}{c} \left( \sqrt{(x - x_i)^2 + z^2} + \sqrt{(x - x_j)^2 + z^2} \right)$$ $$I(x, z) = \left| \sum_{i=1}^N \sum_{j=1}^N w_i w_j \, s_{ij}\big(t_{ij}(x, z)\big) \right|$$

여기서 $w_i, w_j$는 측엽(Sidelobe) 감쇠를 위한 해닝(Hanning) 가중치 함수이며, 결함 에코의 위상 일관성 지수(Phase Coherence Factor, PCF)를 곱하여 공간 분해능을 극대화합니다.

3. 1,000Hz 0-Alloc C# TFM 음향 영상화 코어

힙 메모리 할당 없이 ref struct와 스택 기반 Span<T> 포인터 연산으로 1ms 주기마다 FMC 신호를 공간 집속하는 순수 C# 고속 엔진입니다.

using System;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Stem.NdtUltrasonic;

/// 
/// 초음파 위상배열 TFM 수치 상태 구조체 (100% Stack Allocation)
/// 
public readonly ref struct TfmResultState
{
    public readonly double PeakIntensityDb;      // 최대 결함 반사 강도 (dB)
    public readonly double DefectPosXMm;         // 결함 추정 X 좌표 (mm)
    public readonly double DefectPosZMm;         // 결함 추정 Z 깊이 (mm)
    public readonly double SnrDb;                // 신호 대 잡음비 (dB)
    public readonly int ProcessedSamples;        // 집속 연산된 총 음선 수

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public TfmResultState(
        double peakIntensityDb,
        double defectPosXMm,
        double defectPosZMm,
        double snrDb,
        int processedSamples)
    {
        PeakIntensityDb = peakIntensityDb;
        DefectPosXMm = defectPosXMm;
        DefectPosZMm = defectPosZMm;
        SnrDb = snrDb;
        ProcessedSamples = processedSamples;
    }
}

/// 
/// 1,000Hz 0-Alloc C# 64채널 초음파 FMC 전집중 집속(TFM) 이미징 엔진
/// 
public static class PhasedArrayTfmEngine
{
    private const double WaveSpeedMPerS = 5900.0;    // 강재 내 종파 음속 (m/s)
    private const double PitchM = 0.0006;            // 소자 간격 (0.6mm)
    private const int ElementCount = 16;             // 데모용 16채널 FMC 서브세트

    /// 
    /// 단일 검사 지점 (x, z)에 대한 TFM 빔포밍 합성 연산 (0-Alloc)
    /// 
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static TfmResultState ComputePointFocus(
        ReadOnlySpan fmcSignals,
        int samplesPerSignal,
        double targetXMm,
        double targetZMm,
        double samplingFreqHz = 50e6)
    {
        double targetXM = targetXMm * 1e-3;
        double targetZM = targetZMm * 1e-3;
        double invSpeed = 1.0 / WaveSpeedMPerS;

        double sumAmplitude = 0.0;
        int pairCount = 0;

        for (int i = 0; i < ElementCount; i++)
        {
            double xTx = (i - (ElementCount - 1) * 0.5) * PitchM;
            double distTx = Math.Sqrt((targetXM - xTx) * (targetXM - xTx) + targetZM * targetZM);

            for (int j = 0; j < ElementCount; j++)
            {
                double xRx = (j - (ElementCount - 1) * 0.5) * PitchM;
                double distRx = Math.Sqrt((targetXM - xRx) * (targetXM - xRx) + targetZM * targetZM);

                double totalTime = (distTx + distRx) * invSpeed;
                int sampleIdx = (int)(totalTime * samplingFreqHz);

                if (sampleIdx >= 0 && sampleIdx < samplesPerSignal)
                {
                    int flatIdx = (i * ElementCount + j) * samplesPerSignal + sampleIdx;
                    if (flatIdx < fmcSignals.Length)
                    {
                        sumAmplitude += fmcSignals[flatIdx];
                    }
                }
                pairCount++;
            }
        }

        double absSum = Math.Abs(sumAmplitude);
        double intensityDb = 20.0 * Math.Log10(Math.Max(absSum, 1e-5));
        double snr = intensityDb - 12.0; // 기준 잡음 플로어 대비 SNR

        return new TfmResultState(
            intensityDb,
            targetXMm,
            targetZMm,
            snr,
            pairCount);
    }
}

4. 교육 및 산업적 시사점

2022 개정 교육과정 물리학의 파동 전파, 하위헌스 원리, 간섭과 굴절 법칙이 실제 최첨단 산업 현장에서 안전 진단에 활용되는 과정을 생생하게 학습할 수 있습니다. 64채널 초음파 신호의 기하학적 비행 시간을 직접 계산하고 이를 실시간 합성하는 알고리즘을 0-Alloc C# 코드로 구현함으로써, 컴퓨터 프로그래밍과 응용 물리학의 융합 역량을 길러주는 최고급 교구로 활용될 수 있습니다.