# 코드 구조(C/A 코드, P코드 등)

#### 개요

GNSS 위성신호에서 **코드 구조**는 위성에서 송출되는 원시 신호의 기본적인 형태와 특성을 결정짓는 핵심 요소다. 이 코드들은 위성 신호가 갖추어야 할 **상호 상관(Cross-Correlation) 특성**과 **자기 상관(Auto-Correlation) 특성**을 만족하도록 설계된다. 또한 위성별로 부여된 코드 시퀀스를 통해 신호를 식별할 수 있으며, 이것이 사용자 단말에서 **도래 신호 식별** 및 **추적**의 기본 근거가 된다. 일반적으로 GPS는 **C/A 코드**와 **P(Y) 코드**를 대표적으로 사용하며, 최근에는 새로운 신호 설계를 통해 다른 주파수 대역 및 코드도 도입되고 있다. 여기서는 전통적인 C/A 코드와 P(Y) 코드 위주로 코드를 엄밀하게 살펴본다.

#### C/A 코드의 특성

* **코드 길이**: $1023$ 칩(chip)
* **칩 레이트(Chipping Rate)**: $1.023\text{ MHz}$
* **프레임 기간**: 약 $1\text{ ms}$ (즉, 매 1ms마다 코드 시퀀스가 반복)
* **코드 계열**: 골드 코드(Gold Code)
* **생성 방식**: 이진 선형 피드백 시프트 레지스터(Linear Feedback Shift Register, LFSR) 두 개를 결합

C/A 코드는 짧은 길이와 비교적 느린 칩 레이트로 인해 **획득(Acquisition)** 단계에서 빠른 탐색이 가능하며, 단말이 처음으로 위성 신호를 포착하는 데 중요한 역할을 한다. 이후 보다 정밀한 측정을 위해 P(Y) 코드를 활용하거나 다른 대역으로 확장하여 추적 정밀도를 높이기도 한다.

#### C/A 코드 생성 원리

C/A 코드는 크게 $G\_1$과 $G\_2$라는 두 개의 이진 LFSR로부터 출력되는 시퀀스를 결합(배타적 논리합, XOR)하여 만든다. 각 레지스터는 특정 다항식을 피드백 경로로 사용한다. 두 레지스터에서 생성되는 이진 시퀀스 각각을 $G\_1(n)$, $G\_2(n)$이라 하고, 이를 통해 최종 출력 $C\_{\mathrm{CA}}(n)$를 만든다.

* $G\_1$ 레지스터의 생성 다항식 예시

  $$
  G\_1(D) = 1 + D^3 + D^{10}
  $$
* $G\_2$ 레지스터의 생성 다항식 예시

  $$
  G\_2(D) = 1 + D^2 + D^3 + D^6 + D^8 + D^9 + D^{10}
  $$

여기서 $D$는 디지털 시프트 연산자(한 칩 지연을 의미)이며, $G\_1(D)$와 $G\_2(D)$는 각각 10단 시프트 레지스터를 구성한다. 이 때 레지스터 초기값(즉, 시프트 레지스터의 시작 상태)은 모두 1로 세팅한다(단, 구현에 따라 0, 1 혼합된 다른 초기값을 쓸 수도 있으나 표준 GPS C/A 코드에서는 모든 레지스터를 1로 시작).

각 위성은 $G\_2$ 시퀀스에 위성별 고유한 지연(탭)을 적용해 $G\_2(n+\tau\_s)$ 형태로 만든 다음, $G\_1(n)$과 결합한다:

$$
C\_{\mathrm{CA}}(n) = G\_1(n) \oplus G\_2(n + \tau\_s)
$$

여기서 $\oplus$는 배타적 논리합(XOR) 연산을 의미하고, $\tau\_s$는 $s$번 위성에 대한 고유 지연값이다. 즉, 같은 $G\_1(n)$에 서로 다른 지연이 가해진 $G\_2(n)$를 조합함으로써 **서로 직교에 가깝게 설계된 골드 코드**를 얻을 수 있다.

**골드 코드의 상관 특성**

* **자기 상관(Auto-Correlation)**: 위성 신호가 시간적으로 얼라인 되었을 때만 강한 에너지를 보이도록 하여, 수신 단말이 잘못된 타이밍(코드 단계)으로 추적하지 않도록 도와준다.
* **상호 상관(Cross-Correlation)**: 서로 다른 위성 코드 간 상호 간섭이 최대한 작아지도록 설계되어, 동일 대역을 여러 위성이 공용으로 사용하는 CDMA 환경에서 고성능 동작을 가능케 한다.

#### P(Y) 코드 개요

P(Y) 코드는 C/A 코드보다 훨씬 긴 코드 길이를 가지며, **정밀측정(Precision) 코드**를 의미한다. 군사용으로 사용되며, 평시에는 난수 생성 알고리즘을 통해 암호화된 형태(Y 코드)로 실제 전송된다.

* **코드 길이**: 일주기가 약 7일(시퀀스 전체가 매우 길다)
* **칩 레이트**: $10.23\text{ MHz}$
* **주파수 대역**: 주로 L1, L2 대역을 사용
* **암호화(Encrypted P-code = Y-code)**: 평시에는 반송파 위에 직접 P(Y) 코드를 얹는 대신, 방해나 오용 방지를 위해 P 코드를 암호화하여 Y 코드 형태로 송출한다.

P(Y) 코드는 C/A 코드보다 대역폭이 훨씬 크므로 더 정밀한 측위가 가능하며, 특히 군사용 단말은 이 P(Y) 코드를 정확히 복원하여 **정밀 추적**이 가능하다. 일반 민간 수신기는 (공식적으로 허가받지 않는 이상) P(Y) 코드에 직접 접근하지 못하며, C/A 코드를 기반으로 측위를 수행한다.

#### C/A 코드와 측정 오차

C/A 코드는 약 $1,\mathrm{MHz}$ 급의 칩 레이트로 전송되기 때문에, 단말이 **코드 위상(phase) 오차**를 한 칩 이하 단위로만 측정한다고 할 때, 이론적으로 대략 수십 센티미터\~미터 수준의 **코드 측정 오차**를 가진다. 실제 시스템에선 여러 보정(오차원 추정, 필터링 등)을 통해 이보다 더 정밀한 추정 결과를 낼 수 있으나, 기본 해상도 측면에서 P(Y) 코드보다 낮은 것은 부정할 수 없다.

#### C/A 코드 획득(Acquisition)과 추적(Tracking)

* **획득 단계**: 신호 수신 초기엔, 수신기는 각 위성별로 가능한 코드 지연($\tau\_s$)과 도플러 주파수를 검사하면서 **코드 상관**을 구한다. C/A 코드는 짧은 코드를 사용하므로 한 번 전체 코드를 스캔하는 데 필요한 시간이 짧아 상대적으로 빠른 획득이 가능하다.
* **추적 단계**: 획득 후 정확한 코드 위상 및 반송파 주파수를 지속적으로 추적해야 한다. 이를 위해 수신기는 디지털 코드를 내부에서 발생시켜(코드 발생기), **코드 지연 잠금 루프(Code Delay Lock Loop, DLL)**, **반송파 추적 루프(Carrier Tracking Loop, PLL/FLL)** 등을 사용하여 시시각각 변하는 코드 위상 및 반송파 주파수를 맞춰 나간다.

#### P(Y) 코드 상세 구조

P(Y) 코드는 일반적으로 두 부분으로 나뉜다.

1. **P 코드(Precision code)**
   * 위성별로 서로 다른 긴 주기를 가지는 코드로, 민감도와 정밀도가 훨씬 높다.
   * 일주기가 약 7일(정확히는 $6.187104 \dots$ 일 정도)로 매우 길기 때문에, 하나의 완전한 코드 시퀀스를 다시 만나려면 거의 일주일이 걸린다.
2. **Y 코드**
   * 군사용 암호화가 적용된 형태의 P 코드다.
   * 실제 전술 상황에서는 P 코드가 외부로 노출되지 않도록, **안티 스푸핑(Anti-Spoofing, A-S)** 기능을 수행하기 위해 암호화(Y-code) 처리가 이루어진다.

P(Y) 코드의 **칩 레이트**는 $10.23,\mathrm{MHz}$로 C/A 코드보다 10배 빠르다. 이로 인해 동일한 관측 시간(코드의 한 주기 당)을 기준으로 더 많은 칩을 비교하게 되므로, **잡음 대비 코드 에너지비**가 상승하며 이론적으로 더 정교한 시간 측정이 가능하다.

#### P(Y) 코드 획득과 추적

* **획득 난이도**: 코드 길이가 매우 길어, 일반적인 민간 수신기가 P(Y) 코드를 직접 획득하기는 현실적으로 어렵다. 또한 암호화로 인해 실제 시퀀스를 알 수 없으므로, 합법적으로 키(암호 정보)를 가진 군용 수신기가 아니면 직접 P(Y) 코드 추적이 사실상 불가능하다.
* **정밀 추적**: 군용 수신기는 P(Y) 코드를 통해 미세 오차를 줄이는 정밀 추적이 가능하며, 이를 통해 보다 높은 정확도를 얻는다.
* **민간 수신기의 접근**: 민수용 GNSS 수신기는 보통 C/A 코드(또는 새로 도입된 L2C, L5 등) 위주의 공개 신호로만 측위를 수행하며, P(Y) 코드를 통한 신호 획득은 하지 못한다.

#### 코드 반복 주기와 중첩 연산

C/A 코드는 $1,\mathrm{ms}$ 주기로 반복되며, P(Y) 코드는 일주기가 훨씬 길다. 실제 수신기는 비교적 짧은 관측 구간 내에서 상관 연산을 수행하기 때문에, 긴 코드의 경우 일정 구간을 잘라서 쓰거나, 연속 신호를 XOR, PLL 추적 과정을 통해 동기화한다. 그러나 신호 처리 알고리즘 자체는 원천적으로 C/A 코드와 동일한 상관 기반 기법을 사용하되, 코드 길이와 칩 레이트가 달라지는 차이가 있을 뿐이다.

#### 상관 함수(Formal Correlation Function)

GNSS 코드(예: C/A 코드, P(Y) 코드)는 **직교성**을 확보하기 위해 상관 특성이 매우 중요하다. 특정 코드 $c(n)$에 대해, 자기 상관(Auto-Correlation) 함수를 $\mathbf{R}\_c(\tau)$라 하면 다음과 같이 정의할 수 있다.

$$
R\_c(\tau) = \sum\_{n=0}^{N-1} \bigl\[2,c(n) - 1\bigr] ,\bigl\[2,c(n+\tau) - 1\bigr]
$$

* 여기서 $c(n)$은 $n$번째 칩(chip)이 0 또는 1 값을 가지는 이진 신호다. 실제 상관 계산 시에는 0/1을 보통 $\pm1$ 값으로 변환해 사용하기도 한다.
* $N$은 한 주기(코드 길이) 동안의 칩 수이며, $\tau$는 정수 지연(코드 칩 단위)로 가정했다.
* $R\_c(\tau)$가 $\tau = 0$에서 가장 큰 값을 나타내도록 코드가 설계되며, $\tau \neq 0$에서 최대한 작은 값을 가지도록 골드 코드와 같은 의사잡음(PN) 코드가 채택된다.

#### C/A 코드의 골드 코드 생성 상세

C/A 코드는 두 개의 10단 LFSR, 즉 $G\_1$과 $G\_2$ 시퀀스를 XOR하여 얻는다고 했는데, 이를 조금 더 수식화하면 다음과 같은 꼴로 정리된다.

$$
G1(n)9G\_1(n+1) =  \bigl\[ ,G\_1(n)*3 \oplus G\_1(n)*{10}\bigr] ,\Vert ,G\_1(n)\_1 \dots G\_1(n)\_9
$$

* $G\_1(n)\_k$는 $k$번 시프트 레지스터의 현재 값을 의미하고, $\Vert$는 시프트 연산(즉, 레지스터를 한 칩 지연)으로 이해할 수 있다.
* 실제로는 내부 피드백 경로가 다항식 $1 + D^3 + D^{10}$에 의해 결정되며, 주기 $1023$ 칩의 순환을 이룬다.

$$
G\_2(n+1) =  \bigl\[ ,G\_2(n)\_2 \oplus G\_2(n)\_3 \oplus G\_2(n)\_6 \oplus G\_2(n)\_8 \oplus G\_2(n)*9 \oplus G\_2(n)*{10}\bigr] ,\Vert ,G\_2(n)\_1 \dots G\_2(n)\_9
$$

* $G\_2(n)$은 다항식 $1 + D^2 + D^3 + D^6 + D^8 + D^9 + D^{10}$에 의해 결정된다.

각 위성은 $G\_2(n)$에 고유 탭 조합을 통해 특정 지연 $\tau\_s$만큼 옮겨 쓰고, 이를 $G\_1(n)$과 XOR 연산하여 최종 $C\_{\mathrm{CA}}(n)$을 생성한다.

#### P(Y) 코드 생성 기초

P 코드 역시 LFSR(또는 G-코드 생성 과정)을 기반으로 생성되며, 다만 **암호화 변수**와 **코드 길이**가 훨씬 복잡하고 길다. P 코드 자체는 다음과 같은 특징을 가진다.

* **생성기**: 약 15단 또는 그 이상의 피드백 시프트 레지스터 기반(실제 구조는 군사적으로 민감 정보)
* **코드 길이**: 약 7일간 반복되지 않는 긴 주기
* **출력 이진열**: C/A 코드에 비해 10배 높은 칩 레이트($10.23,\mathrm{MHz}$)를 갖는다.

암호화된 Y 코드는 이 P 코드에 **비밀 키**를 추가하여 XOR하는 방식으로 구현되며, **대역확산** 성능은 P 코드와 동일하게 유지하면서도 외부에서 임의로 재생할 수 없게 만든다.

#### 코드 도플러 영향

GNSS 위성은 고속으로 지구 주변을 선회하기 때문에 수신기 입장에서는 **도플러 주파수 이동**이 발생한다. 코드 추적기에서는 반송파 도플러와 함께 코드 도플러도 고려해야 하며, 이는 코드 레이트가 높을수록 실제 추적 루프에서의 보상 폭도 커진다.

* **코드 도플러** C/A 코드 칩 레이트가 $1.023,\mathrm{MHz}$라고 하면, 위성-수신기 상대 속도에 따라 수 kHz 범위 내에서 코드 도플러가 생길 수 있다. 추적 루프에서 **DLL**을 통해 이를 지속적으로 보정한다.
* **P(Y) 코드 칩 레이트**가 $10.23,\mathrm{MHz}$이므로, 동일한 상대 속도에 대해서도 10배 큰 코드 도플러가 발생하며, 추적 루프 설계가 상대적으로 더 정밀하고 복잡하다.

#### 수신 신호 모델

수신기에 도달한 단일 경로(single path) 위성 신호를 단순 모델링하면 아래와 같다.

$$
r(t) = A , d(t) , c(t) \cos\bigl(\omega\_c t + \phi \bigr) + n(t)
$$

* $A$: 신호 진폭
* $d(t)$: **데이터 비트**(Navigation Message)
* $c(t)$: 확산 코드(예: C/A 혹은 P(Y))
* $\omega\_c$: 반송파 중심 각주파수
* $\phi$: 반송파 위상(도플러에 의해 시간에 따라 변동)
* $n(t)$: 열 잡음 등 수신 잡음

수신기는 내부에서 동일한 코드 $c'(t)$와 반송파를 생성하여, **상관기**(Correlator)를 통해 $\int r(t) \cdot c'(t) \cos(\omega\_c t) ,dt$와 같은 연산을 수행한다. 이 때 최적의 코드 지연 및 반송파 도플러를 찾으면, 상관 출력이 극대화되어 신호가 검출 및 추적된다.

#### 추가 GPS 신호에서의 코드 구조: L2C, L5, M-Code

GPS는 초기엔 L1 대역의 **C/A 코드**(민간)와 **P(Y) 코드**(군용)만 존재했으나, 현대화 계획(GPS Modernization)에 따라 더 다양한 주파수 대역과 새로운 코드들이 도입되었다. 이들은 기존 C/A 코드나 P(Y) 코드와 마찬가지로 **CDMA** 기반 확산 스펙트럼 방식을 채택하지만, 신호 간 상호 간섭을 줄이고 각 채널별 신호 특성을 개선하기 위해 서로 다른 코드 구조가 설계되었다. 대표적인 예로 **L2C, L5, M-Code** 등이 있다.

#### L2C 코드

* **주파수 대역**: L2(1227.60 MHz)
* 채널 구성:
  * CM(Code-Moderate): 길이 $10,230$ 칩, 반복 주기 $20,\mathrm{ms}$
  * CL(Code-Long): 길이 $767,250$ 칩, 반복 주기 $1.5,\mathrm{s}$

**CM/CL 코드의 특성**

* **칩 레이트**: 두 코드 모두 $0.5115,\mathrm{MHz}$ 정도(기존 L1 C/A의 절반 수준)
* **데이터 채널(디지털 신호)**: CM 코드가 주로 데이터 메시지를 실어 나르고, CL 코드는 **파일럿 채널**로 사용된다(즉, 데이터 없이 순수한 코드만 송출).
* 동기 및 추적 편의성:
  * CM 코드는 짧은 반복 주기(20ms)를 가져 초기 획득(Acquisition)이 비교적 용이하다.
  * CL 코드는 긴 코드로 되어 있어 추적 중 잡음 억제 및 정밀 측정에 도움이 된다.
* **결합 추적 기법**: 수신기는 CM과 CL을 동시에 상관 처리하여 **추적 성능**을 높인다.

#### L5 코드

* **주파수 대역**: L5(1176.45 MHz)
* 채널 구성:
  * I채널(파일럿)과 Q채널(데이터)로 분리
* 코드 길이:
  * I채널(파일럿) 코드 길이 약 $10,230$ 칩/기호
  * Q채널(데이터) 코드 길이 약 $10,230$ 칩/기호 (실제로는 하위 구조가 더 복잡하게 구성되어 있다.)
* **칩 레이트**: $10.23,\mathrm{MHz}$ (L1 P(Y)와 동일한 칩 레이트)

**L5 코드의 주요 특징**

* **넓은 대역폭**: L5는 이전 민간신호(C/A, L2C)보다 대역폭이 크고, **항공용 안전신호(Aeronautical Radio Navigation Service, ARNS)** 대역에 할당되어 있어 항공 분야 활용에 최적화되어 있다.
* **강건한 신호 구조**: I/Q 분할로 인해 데이터가 없는 파일럿 신호(I채널)에서 위상 추적 정밀도가 높아지고, Q채널에서는 네비게이션 데이터를 전송한다.
* **코드 설계**: L5 코드 역시 **상호 상관**이 작고 **자기 상관**이 예리한 PN 코드를 사용하여, 멀티패스 환경에서의 에러를 줄이고 추적 성능을 높이는 방향으로 설계되었다.

#### M-Code

* **용도**: 군사용 차세대 신호
* **주파수**: 주로 L1, L2 대역(기존 군용 코드와 동일한 주파수 범위)
* **암호화 구조**: 일반 민수용 접근이 불가능하도록 강력한 암호화와 스펙트럼 제어가 적용
* 코드 특성:
  * 기존 P(Y)보다 탐지(획득) 및 추적이 어렵게 설계되어, 외부 교란 및 스푸핑에 대한 **보안성**이 대폭 강화되었다.
  * 수신기의 높은 동적 범위(dynamic range)를 고려한 신호 전력 분포와 코드 시퀀스를 채택한다.

M-Code는 외부에 자세한 코드 생성 방식을 공개하지 않고 있으며, 군용 수신기는 M-Code를 통해 **정밀 측정**과 **안티 스푸핑** 기능을 수행한다.

#### 신호 다중과 코드 식별

현대 GPS 위성은 L1, L2, L5 등 여러 주파수 대역에 걸쳐 서로 다른 코드(또는 채널) 조합으로 신호를 송출한다. 이는 크게 **데이터 채널**과 **파일럿 채널**로 나뉘며, 각 채널마다 고유의 코드가 할당된다. 이렇게 동시에 전송되는 코드를 **수신기**가 구분하기 위해서는 다중 코드 상관기가 필요하며, 각각의 코드 지연 및 도플러를 별도로 추적한다.
