AIDT 온디바이스 STEM 핵자기공명(NMR) 스핀 에코(CPMG) 이완시간 서보 엔진

블로흐(Bloch) 거시 자화 벡터 동역학, 카-퍼셀-메이붐-길(CPMG) RF 펄스열 스핀-스핀 이완시간 \\(T_2\\) 및 분자 확산 계수 10,000Hz C# 서보

1. 개요: 자기공명 신호의 불균일 디페이징을 극복하고 순수 스핀 상호작용을 측정하다

정자기장 \(B_0\) 속의 원자핵 스핀은 라모어 주파수(\(\omega_0 = \gamma B_0\))로 세차 운동을 합니다. \(90^\circ\) 고주파(RF) 펄스로 가로 평면(\(xy\))에 눕혀진 거시 자화 벡터는 자유유도감쇠(Free Induction Decay, FID)를 겪으며 소멸합니다. 그러나 실제 자석의 공간적 불균일성(\(\Delta B_0\))으로 인해 스핀들이 빠르게 위상을 잃어 겉보기 이완 시간(\(T_2^*\))이 진정한 분자 고유의 스핀-스핀 이완 시간(\(T_2\))보다 훨씬 짧아집니다.

어윈 한(Erwin Hahn)이 발견한 스핀 에코(Spin Echo)와 이를 확장한 카-퍼셀-메이붐-길(Carr-Purcell-Meiboom-Gill, CPMG) 펄스열은 \(90^\circ_x - [\tau - 180^\circ_y - \tau - \text{echo}]_n\) 시퀀스를 인가하여 정적 자기장 불균일성에 의한 디페이징을 완벽히 리포커싱(Refocusing)합니다. 이를 통해 분자의 회전 상관 시간, 결합 수분량, 나노 세공 크기 분포를 절대적으로 측정합니다.

2. 블로흐 방정식 및 CPMG 에코 감쇠 수식 모델

회전 좌표계(Rotating Frame)에서 거시 자화 벡터 \(\mathbf{M} = (M_x, M_y, M_z)\)의 시간 동역학은 블로흐(Bloch) 미분방정식에 의해 지배됩니다:

\\[ \frac{d M_{xy}}{dt} = -i (\omega_0 - \omega) M_{xy} - \frac{M_{xy}}{T_2}, \quad \frac{d M_z}{dt} = -\frac{M_z - M_0}{T_1} \\]

여기서 \(T_1\)은 스핀-격자 종이완 시간, \(T_2\)는 스핀-스핀 횡이완 시간입니다. CPMG 펄스열에서 \(n\)번째 에코 피크의 진폭 \(M(2n\tau)\)는 자기장 구배 \(G\) 하에서 분자 자기확산(Self-diffusion, \(D\)) 효과가 결합된 토리(Torrey) 확장 모델을 따릅니다:

\\[ M(2n\tau) = M_0 \exp\left( -\frac{2n\tau}{T_2} - \frac{1}{3} \gamma^2 G^2 D \tau^2 (2n\tau) \right) \\]

펄스 간격 \(2\tau\)를 수 밀리초 이하로 극도로 단축하면 확산 감쇠 항(\(\propto \tau^2\))이 0으로 수렴하여, 순수한 다성분 지수 감쇠 \(M(t) = \sum_j A_j \exp(-t / T_{2,j})\)를 얻을 수 있습니다. 이를 비음수 최소제곱법(NNLS) 역라플라스 변환(ILT)하여 유체와 다공성 물질의 세공 크기 분포 \(P(T_2)\)를 복원합니다.

3. 실시간 NMR CPMG 에코 트레인 서보 아키텍처 다이어그램

graph TD A[영구자석 어레이 B_0 ~ 0.5 T / 21 MHz 1H] --> B[RF 코일 90도x 가진 펄스 인가 t=0] B --> C[가로 자화 M_xy 디페이징 시작] C --> D[연속 180도y 리포커싱 펄스열 간격 2*tau] D --> E[정적 불균일성 상쇄 스핀 에코 기전력 발생] E --> F[저잡음 프리앰프 & 디지털 수신 믹서 IQ 샘플링] F --> G[10,000Hz 0-Alloc C# 에코 피크 피팅 서보 엔진] G --> H[T2 이완 시간 스펙트럼 및 수분/유류 비율 매핑] H --> D

4. 고성능 0-Alloc C# CPMG 스핀 에코 서보 구현

연속된 에코 진폭을 적분하고 잡음 속에서 \(T_2\) 이완 시간을 실시간 단일/다성분 추출하는 0-Alloc C# 클래스입니다:

using System;
using System.Runtime.CompilerServices;

namespace ZeliDesk.Stem.MagneticResonance
{
    public readonly record struct CpmgParameters(
        double LarmorFreqHz,      // 21.3 MHz (0.5 Tesla 1H)
        double EchoSpacingTau2S,  // 2*tau (예: 500 us = 0.0005 s)
        int TotalEchoCount        // 에코 개수 (예: 200)
    );

    public ref struct CpmgServoState
    {
        public double InitialMagnetizationM0;
        public double EstimatedT2Seconds;
        public double EstimatedT2Ms;
        public double FitResidueR2;
        public double SignalToNoiseRatio;
        public bool IsRelaxationValid;
    }

    public static class SpinEchoCpmgServo
    {
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static void FitRelaxationDecay(
            in CpmgParameters p,
            ReadOnlySpan echoAmplitudes,
            ref CpmgServoState state)
        {
            int n = Math.Min(echoAmplitudes.Length, p.TotalEchoCount);
            if (n < 4)
            {
                state.IsRelaxationValid = false;
                return;
            }

            // 1. 초기 추정 및 로그 선형 회귀: ln(M) = ln(M0) - t / T2
            double sumT = 0.0;
            double sumY = 0.0;
            double sumTY = 0.0;
            double sumT2 = 0.0;
            int validCount = 0;

            for (int i = 0; i < n; i++)
            {
                double amp = echoAmplitudes[i];
                if (amp > 1e-4) // 잡음 플로어 이상
                {
                    double t = (i + 1) * p.EchoSpacingTau2S;
                    double y = Math.Log(amp);

                    sumT += t;
                    sumY += y;
                    sumTY += t * y;
                    sumT2 += t * t;
                    validCount++;
                }
            }

            if (validCount < 4)
            {
                state.IsRelaxationValid = false;
                return;
            }

            double denom = (validCount * sumT2 - sumT * sumT);
            if (Math.Abs(denom) < 1e-15)
            {
                state.IsRelaxationValid = false;
                return;
            }

            // 기울기 slope = -1 / T2
            double slope = (validCount * sumTY - sumT * sumY) / denom;
            double intercept = (sumY - slope * sumT) / validCount;

            state.InitialMagnetizationM0 = Math.Exp(intercept);

            if (slope < -1e-5)
            {
                state.EstimatedT2Seconds = -1.0 / slope;
                state.EstimatedT2Ms = state.EstimatedT2Seconds * 1000.0;
                state.IsRelaxationValid = true;
            }
            else
            {
                state.EstimatedT2Seconds = 0.0;
                state.EstimatedT2Ms = 0.0;
                state.IsRelaxationValid = false;
            }

            // 2. SNR 추정: M0 / (마지막 에코 잔차)
            double noiseEst = Math.Abs(echoAmplitudes[n - 1]);
            state.SignalToNoiseRatio = state.InitialMagnetizationM0 / Math.Max(1e-5, noiseEst);
        }
    }
}

5. 교육 연수 및 석유 자원 탐사/휴대용 생화학 검사 국방 적용 지침

방통대 직무연수 및 국방 휴대용 소형 NMR 분석기

  • 물리/화학 교과 지도: 양자 스핀 각운동량과 라모어 세차, 고주파 펄스에 의한 자화 반전, 스핀 에코 리포커싱의 기하학적 블로흐 구면 시각화.
  • 국방 항공 연료 품질 검사 및 폭발물 식별: 야전 비행기 급유 전 항공유 내 잔류 수분/결빙 불순물 즉시 검사 및 액체 폭약(TATP) 분자 이완 시간 비파괴 판별.