데이터분석 — 상관처리 데이터로 영상 만들기

관측데이터의 상관처리에서 살펴본 상관기의 출력은 아직 우리가 보는 "사진"이 아니라, 각 망원경 쌍(기선)·시간·주파수별로 얻은 밝기와 위상 정보인 가시성 데이터(visibility data)입니다. 상관처리가 "신호를 맞추어 합치는" 과정이라면, 이 가시성 데이터를 실제로 눈에 보이는 영상으로 바꾸는 것은 완전히 다른 별도의 계산 과정이며, 이 페이지에서 그 방법을 살펴봅니다. 자료는 이 과정에서 상관기가 만든 FITS-IDI → 보정을 마친 UVFITS → 완성된 FITS 영상으로 모습을 바꿉니다. 먼저 이 자료들을 담는 FITS 파일의 구조를 보고, 처리 단계와 영상이 만들어지는 원리(역푸리에 변환과 CLEAN), 화면에 표시하는 방법, 파이썬 분석과 연구자의 고민까지 차례로 따라가 봅니다.

FITS 파일 — 천문 자료를 담는 표준 그릇

FITS는 1979년에 천문대끼리 자료를 주고받기 위해 만든 형식으로, 지금은 전파·광학·X선 등 거의 모든 천문 자료가 이 형식을 씁니다. 구조는 단순합니다. 파일은 2,880바이트 블록을 이어 붙인 것이고, 그 안에 헤더(설명서)와 데이터(숫자 배열)가 한 쌍을 이룬 HDU(Header-Data Unit)가 하나 이상 들어 있습니다. 헤더는 사람이 그대로 읽을 수 있는 80글자짜리 줄(카드)들이고, 데이터는 컴퓨터가 읽는 이진 숫자입니다.

FITS 영상 파일의 구조 FITS 파일은 2880바이트 블록으로 이루어집니다. 앞부분 헤더 블록에는 80글자 카드 36장이 들어가며 SIMPLE, BITPIX, NAXIS 같은 키워드와 END로 끝납니다. 그 뒤 데이터 블록에는 픽셀 값이 4바이트 실수로 한 줄씩 저장되고, 마지막 블록의 남는 부분은 0으로 채웁니다. 헤더 (글자) SIMPLE = T BITPIX = -32 NAXIS = 4 NAXIS1 = 256 CTYPE1 = 'RA---SIN' BUNIT = 'JY/BEAM ' END 80글자 × 36장 = 2,880바이트 블록 데이터 (이진 숫자 — 픽셀 값) 3a 83 12 6f ba 0c 49 ba 39 d1 b7 17 … ← 1번째 줄(맨 아래) 3b 02 cd 14 3a 9d 49 52 bb 1a 03 f1 … ← 2번째 줄 … 3f 7f ff 2a 3f 7e 61 0b 3f 7b 44 c0 … ← 가운데(밝은 핵) … 픽셀 하나 = 4바이트 실수(BITPIX = −32), 큰 자리부터(빅엔디언) 256 × 256 × 4 = 262,144바이트 → 2,880바이트 블록 92개 0으로 채움 블록 끝까지 파일 = 2,880바이트 블록의 연속 (헤더 블록 → 데이터 블록)
FITS 영상 파일 하나의 구조입니다. 상관기 출력(FITS-IDI)처럼 표를 담는 파일은 이런 HDU 뒤에 표 형식의 HDU가 여러 개 더 이어집니다.

전파 영상 FITS에서 특히 중요한 헤더 키워드는 다음과 같습니다. 헤더만 읽어도 "어디를, 무엇으로, 어떤 크기로 찍었는지" 알 수 있습니다.

키워드예뜻
SIMPLE · BITPIXT · −32표준 FITS임 · 픽셀 하나의 형식(−32 = 4바이트 실수, 16 = 2바이트 정수)
NAXIS · NAXISn4 · 256, 256, 1, 1축의 개수와 각 축의 길이. 전파 영상은 보통 4축(가로·세로·주파수·편파)
BSCALE · BZERO1.0 · 0.0저장된 숫자를 실제 값으로 바꾸는 식: 실제 값 = BZERO + BSCALE × 저장 값
BUNIT'JY/BEAM'픽셀 값의 단위. 빔 하나 넓이에 들어오는 세기(잰스키)
CTYPEn · CRPIXn · CRVALn · CDELTn'RA---SIN' · 129 · 187.278° · −2.78e−8°좌표(WCS): 기준 픽셀 CRPIX가 하늘 좌표 CRVAL에 해당하고, 한 칸마다 CDELT도씩 바뀜(−2.78×10−8° = −0.1밀리각초)
BMAJ · BMIN · BPA2 mas · 1 mas · −10°복원 빔(CLEAN 빔) 타원의 긴지름·짧은지름(도 단위로 저장)·기울기. 영상의 '해상도'
CRVAL3 · CTYPE44.3e10 Hz · 'STOKES'관측 주파수(43 GHz) · 편파 성분(1 = 전체 세기 I)
OBJECT · TELESCOP · DATE-OBS'3C273' · 'KVN' · '2026-03-01'천체 이름 · 망원경 · 관측 날짜
HISTORYHISTORY CLEAN …어떤 처리를 거쳤는지 적은 기록. 다른 사람이 처리 과정을 되짚을 수 있음

VLBI 자료의 세 가지 FITS

같은 FITS라도 처리 단계마다 담긴 내용이 다릅니다. 앞의 두 가지는 아직 '그림'이 아니라 측정값의 표이고, 마지막 하나가 우리가 보는 영상입니다.

형식만드는 곳담긴 내용크기 (대략)
FITS-IDI상관기 (상관처리)여러 개의 표(이진 테이블): 기선·시각·주파수 채널별 복소수 가시성(UV_DATA), 안테나 위치(ARRAY_GEOMETRY, ANTENNA), 주파수 설정(FREQUENCY), 천체 목록(SOURCE), 시스템 온도·이득 같은 보정용 정보관측 하나에 수 GB ~ 수백 GB
UVFITSAIPS·CASA에서 보정 후 천체별로 잘라 냄보정된 가시성: 각 측정마다 u, v, w 좌표, 기선 번호, 시각과 (실수, 허수, 가중치) 묶음천체 하나에 수 MB ~ 수 GB
FITS 영상Difmap·CASA·AIPS의 영상화픽셀 배열(Jy/beam)과 좌표·빔·주파수 정보. DS9 같은 보기 프로그램으로 바로 열림영상 하나에 수백 KB ~ 수 MB
파일 안을 열어 보면 — FITS-IDI와 UVFITS의 구조

FITS-IDI는 내용이 빈 첫 HDU 뒤에 이진 테이블 HDU가 여러 개 이어진 파일입니다. 엑셀의 시트 여러 장과 비슷하게, 시트마다 이름(EXTNAME)이 붙어 있습니다.

HDU 이름 (EXTNAME)담긴 내용
PRIMARY데이터 없이 헤더만 있는 첫 HDU (관측 이름, 만든 프로그램 등)
ARRAY_GEOMETRY망원경들의 지구 중심 좌표(X, Y, Z), 관측 기준 날짜
ANTENNA안테나 번호와 이름, 편파 종류, 편파 누설 값
FREQUENCY주파수 대역(IF)별 시작 주파수, 채널 폭, 채널 수, 측파대
SOURCE관측한 천체 이름과 좌표(적경·적위), 고유 운동 등
INTERFEROMETER_MODEL상관기가 사용한 지연·위상 예측 모형(다시 보정할 때 필요)
SYSTEM_TEMPERATURE · GAIN_CURVE시간별 시스템 온도, 고도에 따른 안테나 이득 → 진폭 보정 재료
FLAG관측소가 미리 알려 준 '쓰면 안 되는 시간' 목록
UV_DATA가시성 자료 본체. 한 줄 = 기선 하나 × 적분 시간 하나
UV_DATA의 열뜻
UU---SIN · VV---SIN · WW---SIN그 순간 기선의 u, v, w 좌표(초 단위: 빛이 기선을 지나는 시간). 관측 주파수를 곱하면 파장 단위가 됨
DATE · TIME관측 날짜(율리우스일)와 그날 안의 시각
BASELINE기선 번호 = 256 × 안테나1 + 안테나2 (예: 1번·3번 안테나 → 259)
SOURCE · FREQID · INTTIM천체 번호, 주파수 설정 번호, 적분 시간(초)
FLUX복소수 가시성 배열: 대역(IF) × 채널 × 편파 조합 × (실수, 허수) — 파일 크기의 대부분

UVFITS는 오래된 '랜덤 그룹' 구조를 씁니다. 측정 하나가 그룹 하나이고, 그룹마다 앞에 매개변수(UU, VV, WW, BASELINE, DATE 등)가 붙고 뒤에 (실수, 허수, 가중치) 묶음이 편파·채널·대역별로 이어집니다. 헤더의 PTYPEn이 매개변수 이름을, CTYPEn이 COMPLEX·STOKES·FREQ·IF·RA·DEC 축 이름을 알려 줍니다. 안테나 목록과 주파수 정보는 'AIPS AN', 'AIPS FQ' 같은 이름의 테이블 HDU로 뒤에 붙습니다.

FITS-IDI에서 FITS 영상까지 — 처리 단계 따라가기

상관기 출력을 영상으로 만드는 일은 크게 보정 → 역푸리에 변환 → CLEAN입니다. 주로 미국 국립전파천문대(NRAO)가 만든 AIPS와 최신 표준 소프트웨어 CASA, VLBI 영상화에 특화된 Difmap을 쓰며, KVN·EAVN 자료도 이런 프로그램으로 처리합니다. 실제 작업 단위로 나누면 다음과 같고, 이름은 달라도 하는 일은 같습니다.

#단계하는 일AIPS 작업 예CASA 작업 예
1불러오기FITS-IDI 파일의 표들을 읽어 처리용 데이터로 만듦FITLDimportfitsidi
2살펴보고 걸러 내기망원경이 천체를 놓친 시간, 전파 간섭이 섞인 채널 같은 나쁜 자료를 표시해 빼냄(플래깅)UVFLG, SPFLGflagdata, plotms
3진폭 보정시스템 온도와 안테나 이득으로 '얼마나 밝은지'를 잰스키 단위로 맞춤ACCOR, APCALgencal, applycal
4프린지 맞추기망원경별로 남은 시간 지연·위상 변화율을 찾아 위상을 바로잡음FRINGfringefit
5대역 통과 보정주파수 채널마다 다른 장비 응답을 평평하게 맞춤BPASSbandpass
6보정 적용 · 천체별 분리구한 보정값을 적용하고, 원하는 천체만 골라 채널을 평균해 UVFITS로 저장CLCAL, SPLIT, FITTPapplycal, split, exportuvfits
7영상화 · CLEAN · 자기보정격자에 올려 역푸리에 변환(보정 전 영상) → CLEAN → 모형으로 위상·진폭을 다시 보정하는 일을 되풀이IMAGR, CALIBtclean, gaincal
8FITS 영상으로 저장CLEAN 성분을 복원 빔으로 다시 그리고 남은 잡음(잔차)을 더해 최종 영상을 FITS로 저장FITTPexportfits
7단계 자세히 — 역푸리에 변환과 CLEAN

가시성 데이터는 하늘의 밝기 분포를 푸리에 변환한 값(공간주파수)을 u-v 평면의 여러 점에서 잰 것입니다. 기선 하나는 한 순간에 u-v 평면의 점 하나(와 그 맞은편 점)를 재고, 지구가 자전하면 기선의 길이와 방향이 바뀌어 점들이 타원 모양의 궤적을 그립니다(간섭계 원리). 이 점들을 격자에 올려 역푸리에 변환하면 영상이 되지만, 망원경 수가 유한해 u-v 평면에 빈칸이 많으므로 진짜 천체에 가짜 무늬(사이드로브)가 겹친 보정 전 영상(dirty image)이 나옵니다. 점 하나를 관측했을 때 생기는 이 무늬를 보정 전 빔(dirty beam)이라고 합니다.

CLEAN은 이 무늬를 걷어 내는 대표적인 디컨볼루션 방법입니다. ① 영상에서 가장 밝은 곳을 찾아 ② 그 밝기의 일부(보통 10 %)만큼 보정 전 빔 무늬를 빼고 ③ 그 위치와 세기를 'CLEAN 성분'으로 기록하는 일을 수백 ~ 수천 번 되풀이합니다. 마지막으로 기록한 성분들을 사이드로브가 없는 깨끗한 타원(복원 빔, FITS 헤더의 BMAJ·BMIN·BPA)으로 다시 그리고, 빼고 남은 잔차를 더하면 최종 영상이 됩니다. 이것이 FITS 영상으로 저장됩니다.

👉 망원경 구성과 관측 시간을 바꿔 u-v 채움과 보정 전 빔이 어떻게 달라지는지 보고, CLEAN 버튼으로 가짜 무늬를 걷어 내 보세요!

u-v 측정점복원 빔 (BMAJ × BMIN, BPA)CLEAN 반복CLEAN 성분 세기 합 / 실제 세기 합남은 잔차 최대 / 처음 최대

망원경 위치는 실제 관측소의 위도·경도로 계산했고, 하늘에는 고른 천체 방향에 점 모양의 핵과 제트 성분 다섯 개를 두었습니다(모의 천체, ④의 초록 + 표시가 실제 위치). ③의 잔차는 처음 보정 전 영상과 같은 눈금으로 그려, CLEAN이 진행될수록 옅어집니다. 보정 전 빔과 영상은 측정한 u-v 점으로 직접 역푸리에 변환해 구하고, CLEAN은 회그봄 방식(한 번에 10 %씩)으로 실제로 계산합니다. 잡음과 보정 오차는 넣지 않았습니다. 색은 양(+)의 값을 붉은색, 음(−)의 값을 푸른색으로 칠했습니다.

KVN 4대로 적도 근처의 3C 273을 보면 u-v 궤적이 거의 가로줄이 되어, 보정 전 빔에 진짜 봉우리만큼 높은 가짜 봉우리가 위아래로 되풀이됩니다. 이럴 때는 CLEAN도 성분을 엉뚱한 곳에 놓기 쉽습니다(④의 초록 + 표시와 비교해 보세요). 적위가 높은 3C 84를 고르면 궤적이 타원을 그리며 u-v 평면을 더 고르게 채워 무늬가 줄어듭니다. 관측 시간을 늘려도 궤적이 길어져 무늬가 줄어듭니다. 일본 VERA를 더하면 기선이 길어져 빔(해상도)이 작아지고 u-v 채움도 촘촘해집니다. 이것이 한국·일본·중국 망원경을 묶는 동아시아 VLBI 관측망(EAVN)의 장점입니다. 처음 몇 번의 CLEAN에서 영상이 크게 바뀌고, 뒤로 갈수록 바뀌는 양이 줄어드는 것도 확인해 보세요. 밝은 성분부터 차례로 빠지기 때문입니다.

VLBI 영상화에는 Difmap을 많이 씁니다. 6단계에서 만든 UVFITS로 영상을 만드는 짧은 예는 다음과 같습니다(값은 43 GHz 관측을 가정한 예시이며, 실제로는 자료를 보며 조정합니다).

! Difmap 예시 — UVFITS → FITS 영상
observe 3C273_Q.uvf      ! 보정된 가시성 불러오기
select i                 ! 전체 세기(Stokes I)만
mapsize 256, 0.1         ! 256 × 256 픽셀, 한 칸 0.1 mas
uvweight 2, -1           ! 가중치 방식(자연·균일 사이)
clean 200, 0.05          ! CLEAN 200번, 한 번에 5 %씩
selfcal                  ! 모형으로 위상 자기보정
clean 500, 0.05
selfcal true, true       ! 진폭까지 자기보정
restore                  ! 복원 빔으로 다시 그리기
wmap 3C273_Q.fits        ! FITS 영상으로 저장
# CASA 예시 (파이썬) — 보정된 자료 → FITS 영상
tclean(vis='kv26a_3c273.ms',
       imagename='3c273_q',
       imsize=256,
       cell='0.1mas',          # 한 칸 크기
       weighting='briggs', robust=0,
       niter=2000,             # CLEAN 최대 반복
       threshold='3mJy')       # 이 세기까지 CLEAN
exportfits(imagename='3c273_q.image',
           fitsimage='3c273_q.fits')

🧮 실제 값으로 계산해 보기 — 픽셀 크기는 어떻게 정할까?

KVN 43 GHz(파장 7 mm), 가장 긴 기선 약 500 km: 빔 크기 ≈ 파장 ÷ 기선 = 0.007 ÷ 500,000 rad ≈ 1.4 × 10−8 rad ≈ 2.9 mas
빔 하나를 3 ~ 5칸으로 나누도록 픽셀 크기를 정함 → 약 0.5 ~ 1 mas보다 작게, 여기서는 0.1 mas로 넉넉히
  • 픽셀이 빔보다 크면 작은 구조가 뭉개지고, 너무 작으면 파일만 커지고 계산이 느려집니다.
  • 영상 전체 크기(256 × 0.1 = 25.6 mas)는 천체의 제트가 다 들어가도록 정합니다. 1 mas는 1도의 360만 분의 1입니다.

FITS 영상 파일을 화면의 그림으로 — 표시 과정

FITS 영상 파일에는 '색'이 없습니다. 들어 있는 것은 픽셀마다의 세기(Jy/beam) 숫자뿐이고, 이것을 사람이 볼 수 있는 그림으로 바꾸는 것은 보는 프로그램의 몫입니다. 같은 FITS라도 표시 방법에 따라 전혀 다른 느낌의 그림이 됩니다.

#단계하는 일
1헤더 읽기80글자 카드를 차례로 읽어 END가 나올 때까지 키워드를 모음 → 픽셀 형식(BITPIX), 크기(NAXISn), 좌표(WCS), 빔, 단위를 알아냄
2숫자 읽기헤더 블록 다음부터 픽셀 수 × 4바이트를 빅엔디언 실수로 읽고, BSCALE·BZERO로 실제 값(Jy/beam)으로 바꿈. 값이 없는 픽셀은 NaN
3위아래 맞추기FITS는 맨 아랫줄부터 저장하고 화면은 맨 윗줄부터 그리므로 뒤집어 그림. 동쪽이 왼쪽이 되도록 CDELT1은 음수
4세기 범위 고르기(스트레치)어디부터 어디까지를 검정~흰색에 대응시킬지와, 선형·제곱근·로그 중 어떤 눈금을 쓸지 정함. 밝은 핵과 희미한 제트를 함께 보려면 로그가 유리
5색 지도 입히기0~1로 바꾼 세기에 회색조·열지도 같은 색 목록을 대응시킴. 색은 실제 색이 아니라 세기를 알아보기 쉽게 칠한 것
6등고선 · 빔 · 좌표 눈금VLBI 논문에서는 잡음(rms)의 3배부터 2배씩 커지는 등고선을 그리고, 왼쪽 아래에 빔 타원을, 가장자리에 기준점에서 떨어진 각도(mas) 눈금을 표시

이렇게 표시한 실제 KVN·KaVA 영상에서 축·빔·등고선·색·크기 막대를 찾아 읽어 보는 연습은 관측영상 편에서 이어집니다.

🧮 실제 값으로 계산해 보기 — FITS 숫자에서 과학 값 꺼내기

픽셀 좌표 → 하늘 좌표: (149 − CRPIX1 129) × CDELT1 (−0.1 mas) = −2 mas → 기준점에서 서쪽으로 2 mas
빔 넓이(픽셀) = π × BMAJ × BMIN ÷ (4 ln 2) ÷ 픽셀 넓이 = π × 2 × 1 ÷ 2.77 ÷ 0.01 ≈ 226.6픽셀
전체 세기(Jy) = 천체 영역 픽셀 값의 합(Jy/beam) ÷ 빔 넓이(픽셀)  |  다이내믹 레인지 = 최대 세기 ÷ 잡음 rms
  • 픽셀 값의 단위가 'Jy/beam'이라서, 빔 하나에 몇 픽셀이 들어가는지로 나눠야 천체 전체의 세기(Jy)가 됩니다. 아래 실험실의 '전체 세기'가 이 계산입니다.
  • 최대 1 Jy/beam, 잡음 1 mJy/beam인 영상의 다이내믹 레인지는 1,000입니다. 이 값이 클수록 밝은 핵 옆의 희미한 구조까지 믿고 볼 수 있습니다.
🔬 FITS 실험실 — 파일을 열어 숫자에서 그림까지

👉 모의 FITS 파일의 헤더와 바이트를 살펴보고, 스트레치·색 지도·등고선을 바꿔 그림이 어떻게 달라지는지 보세요. 내 FITS 파일을 열어 볼 수도 있습니다!

영상 위에 마우스를 올리면 그 픽셀의 좌표와 세기가 나옵니다.

헤더 카드 (80글자씩, 사람이 읽을 수 있는 글자)


          

데이터 시작 부분 (이진 숫자 → 실수)


          

모의 영상은 3C 273의 위치에 둔 가상의 핵-제트 구조(43 GHz, 빔 2 × 1 mas, 잡음 1 mJy/beam)를 FITS 규격대로 만든 것으로, 실제 관측 결과가 아닙니다. 내려받은 파일은 SAOImage DS9 같은 FITS 보기 프로그램에서 열 수 있습니다. 내 파일을 열면 첫 번째 HDU의 첫 영상 면만 보여 주며, 파일은 이 화면 안에서만 읽고 어디로도 보내지 않습니다.

파이썬으로 FITS 다루기

영상을 만든 뒤의 분석(세기 재기, 그림 그리기, 여러 관측 비교)은 대부분 파이썬으로 합니다. 천문학 공동체가 함께 만드는 Astropy가 FITS 읽기·쓰기와 하늘 좌표 계산의 표준이고, CASA도 파이썬 모듈로 불러 쓸 수 있습니다.

라이브러리쓰임
astropy.io.fitsFITS의 HDU·헤더·데이터를 읽고 쓰기(영상, 이진 테이블, 랜덤 그룹 모두)
astropy.wcs헤더의 WCS 키워드로 픽셀 ↔ 하늘 좌표 변환
astropy.visualization선형·로그 등 스트레치와 표시 범위 정하기, 좌표 눈금이 있는 그림(WCSAxes)
numpy · matplotlib픽셀 배열 계산(잡음, 합, 최댓값)과 그림·등고선 그리기
radio-beam · reproject빔 정보 다루기와 다른 빔으로 다시 흐리게 하기 · 서로 다른 격자의 영상을 같은 격자로 옮기기(다주파수 비교)
casatasks · casatoolsCASA의 보정·영상화 작업을 파이썬 스크립트에서 그대로 실행
eht-imaging (ehtim)EHT가 쓴 VLBI 영상화 도구. CLEAN과 다른 방식(정규화 최대우도)으로 가시성에서 바로 영상을 만듦

예제 1 — FITS 영상 읽고 좌표·등고선·빔이 있는 그림 그리기

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
from astropy.io import fits
from astropy.wcs import WCS
from astropy.visualization import simple_norm

with fits.open('3C273_Q.fits') as hdul:
    hdul.info()                          # HDU 목록 보기
    hdr = hdul[0].header
    img = hdul[0].data.squeeze()         # (1, 1, 256, 256) → (256, 256): 주파수·편파 축 제거

print(hdr['OBJECT'], hdr['BUNIT'], hdr['CRVAL3'] / 1e9, 'GHz')
pix_mas = abs(hdr['CDELT1']) * 3.6e6     # 도 → 밀리각초
bmaj, bmin = hdr['BMAJ'] * 3.6e6, hdr['BMIN'] * 3.6e6

rms = np.nanstd(img[:60, :60])           # 천체가 없는 구석으로 잡음 추정
peak = np.nanmax(img)
levels = 3 * rms * 2.0 ** np.arange(12)  # 3σ부터 2배씩 커지는 등고선
levels = levels[levels < peak]

wcs = WCS(hdr).celestial                 # 하늘 좌표 두 축만 사용
ax = plt.subplot(projection=wcs)
ax.imshow(img, origin='lower', cmap='inferno',          # FITS는 아랫줄부터 → origin='lower'
          norm=simple_norm(img, 'log', vmin=rms, vmax=peak))   # astropy 6.1 이상
ax.contour(img, levels=levels, colors='white', linewidths=0.6)
ax.add_patch(Ellipse((20, 20), bmin / pix_mas, bmaj / pix_mas, angle=hdr['BPA'],
                     facecolor='none', edgecolor='cyan'))   # 왼쪽 아래 빔 타원
ax.set_xlabel('적경'); ax.set_ylabel('적위')
plt.savefig('3C273_Q.png', dpi=200)

예제 2 — 과학 값 계산하기 (잡음, 다이내믹 레인지, 전체 세기)

beam_pix = np.pi * hdr['BMAJ'] * hdr['BMIN'] / (4 * np.log(2)) / (abs(hdr['CDELT1']) * abs(hdr['CDELT2']))
mask = img > 3 * rms                     # 3σ보다 밝은 곳만 천체로 봄
total_jy = img[mask].sum() / beam_pix    # Jy/beam의 합 ÷ 빔 넓이(픽셀) = Jy
print(f'잡음 {rms*1e3:.2f} mJy/beam, 최대 {peak:.3f} Jy/beam, '
      f'다이내믹 레인지 {peak/rms:.0f}, 전체 세기 {total_jy:.3f} Jy')

y, x = np.unravel_index(np.nanargmax(img), img.shape)
sky = wcs.pixel_to_world(x, y)           # 가장 밝은 픽셀의 하늘 좌표
print(sky.to_string('hmsdms'))

예제 3 — 영상 전 단계의 자료 열어 보기 (UVFITS, FITS-IDI)

with fits.open('3C273_Q.uvf') as uvf:     # UVFITS: 랜덤 그룹
    g = uvf[0].data
    print(g.parnames)                     # ['UU', 'VV', 'WW', 'BASELINE', 'DATE', ...] (프로그램마다 이름이 조금 다름)
    freq = uvf[0].header['CRVAL4']        # 기준 주파수(Hz) — 어느 축인지는 CTYPEn으로 확인
    u_lambda = g.par(0) * freq            # 초 × Hz = 파장 단위의 u
    vis = g.data                          # (측정 수, …, 편파, 3) 마지막 축 = 실수·허수·가중치

with fits.open('kv26a.idifits') as idi:   # FITS-IDI: 이진 테이블 여러 개
    idi.info()                            # ARRAY_GEOMETRY, ANTENNA, FREQUENCY, SOURCE, UV_DATA …
    uv = idi['UV_DATA'].data
    a1, a2 = divmod(uv['BASELINE'], 256)  # 기선 번호 → 안테나 두 개
    print(idi['ANTENNA'].data['ANNAME'])  # 안테나 이름

파일 이름은 예시입니다. 실제 키워드와 축 순서는 만든 프로그램마다 조금씩 다르므로, 먼저 hdul.info()와 헤더를 출력해 확인하는 습관이 중요합니다.

연구자는 무엇을 고민할까?

버튼 몇 번으로 영상이 나오는 것처럼 보이지만, 같은 자료로도 처리 선택에 따라 다른 영상이 나옵니다. 연구자는 단계마다 다음과 같은 질문을 붙들고 씨름하며, "이 구조가 정말 천체에 있는가, 처리 과정이 만든 것인가"를 끝까지 확인합니다.

단계고민하는 것흔히 쓰는 대처
자료 거르기어디까지를 나쁜 자료로 볼까? 너무 많이 버리면 감도와 u-v 채움이 줄고, 남기면 전파 간섭·낮은 고도의 오차가 영상에 섞입니다.시간·채널별 그림으로 하나하나 살펴보고, 거른 기준을 기록
진폭 눈금세기의 절댓값을 얼마나 믿을 수 있을까? 시스템 온도·이득 곡선·대기 흡수의 오차로 보통 5 ~ 10 %의 불확실성이 남습니다.밝기를 잘 아는 천체로 확인, 다른 망원경·다른 시기와 비교할 때 오차 막대 표시
가중치해상도를 높일까(균일 가중), 감도를 높일까(자연 가중)? 같은 자료로도 영상이 달라집니다.목적에 맞게 고르고 중간값(Briggs robust)도 비교, 쓴 설정을 논문에 명시
CLEAN 범위어디까지를 진짜 구조로 보고 CLEAN할까? 너무 깊게 하면 잡음을 천체로 착각하고, 얕게 하면 희미한 제트를 놓칩니다.CLEAN 상자(창)를 신중히 지정, 잔차 영상이 고른 잡음처럼 보일 때 멈춤
자기보정모형을 믿고 보정하다 보면, 모형에 있던 가짜 구조가 오히려 강화되지 않을까? 또 위상 자기보정은 천체의 절대 위치 정보를 잃게 합니다.위상부터 조금씩, 진폭 보정은 마지막에 긴 시간 간격으로. 위치가 중요하면 가까운 기준 천체를 번갈아 보는 위상 기준 관측
영상 대 모형그림만 볼까, 숫자로 잴까? 제트 성분이 1년에 몇 mas 움직였는지 재려면 위치·크기·세기를 수치로 뽑아야 합니다.가시성에 가우스 성분을 직접 맞추는 모형 맞추기(Difmap modelfit 등), 성분별 오차 추정
다주파수 비교22·43·86 GHz 영상은 빔 크기가 다르고, 주파수마다 '핵'의 위치가 조금씩 달라(core shift) 그냥 겹치면 틀린 결론이 나옵니다.같은 빔으로 흐리게 맞추고(radio-beam), 같은 격자로 옮긴 뒤(reproject) 광학적으로 얇은 제트 성분으로 위치 정렬 → 스펙트럼 지수 지도
불확실성u-v 평면의 빈칸 때문에 같은 자료에 맞는 영상이 여러 개입니다. 내가 만든 영상이 유일한 답일까?다른 방법(CLEAN, 정규화 최대우도)과 다른 사람이 독립적으로 영상화해 비교(EHT 방식), 모의 자료로 방법 검증
재현성몇 년 뒤 나나 다른 연구자가 같은 결과를 다시 만들 수 있을까?처리 스크립트·소프트웨어 버전 보관, FITS HISTORY 기록, 원자료와 결과를 공개 저장소에 보관
자료 크기·시간수백 GB의 FITS-IDI를 몇 번이고 다시 처리해야 하는데, 저장 공간과 계산 시간은 충분할까?채널·시간 평균으로 줄인 사본 만들기, 계산 서버와 고속 저장소 사용(관측데이터 저장, 대용량 데이터 전송)

✅ 영상을 발표하기 전 연구자의 점검 목록

  • 잔차 영상(자료 − 모형)이 특별한 무늬 없이 고른 잡음처럼 보이는가? 잡음 수준은 이론적인 기대값과 비슷한가?
  • 최종 모형으로 계산한 가시성 진폭·닫힘 위상이 실제 자료와 기선마다 잘 맞는가?
  • 가중치·CLEAN 상자·자기보정 순서를 바꿔도 주요 구조가 그대로 남는가?
  • 3σ보다 약한 구조를 결론에 쓰지는 않았는가? 빔보다 작은 구조를 '보인다'고 말하지는 않았는가?
  • 헤더의 천체 이름·좌표·주파수·빔·단위가 맞고, 처리 과정이 HISTORY와 스크립트로 남아 있는가?

핵심 정리

  • 상관기의 출력인 가시성 데이터는 하늘의 밝기 분포를 푸리에 변환한 값과 같습니다.
  • 가시성 데이터를 역푸리에 변환하면 영상을 얻을 수 있지만, 망원경 개수가 유한해 보정 전 영상(dirty image)이 만들어집니다.
  • CLEAN 같은 디컨볼루션 알고리즘을 반복 적용해야 사이드로브가 걷힌 선명한 최종 영상을 얻을 수 있습니다.
  • 이 과정에는 AIPS·CASA·Difmap 같은 전용 소프트웨어와 FITS-IDI·UVFITS·FITS 같은 표준 파일 형식이 쓰입니다.
  • FITS는 2,880바이트 블록으로 된 파일로, 80글자 카드로 된 헤더와 숫자 배열인 데이터가 짝을 이룬 HDU로 구성됩니다. 헤더의 BITPIX·NAXIS·WCS(CRPIX·CRVAL·CDELT)·BMAJ/BMIN·BUNIT가 영상을 해석하는 열쇠입니다.
  • 상관기 출력 FITS-IDI(이진 테이블 여러 개) → 보정 후 UVFITS(랜덤 그룹) → 영상화 후 FITS 영상(Jy/beam 픽셀 배열)으로 바뀌며, 불러오기·플래깅·진폭 보정·프린지·대역 보정·분리·영상화·저장 순으로 처리합니다.
  • FITS 영상에는 색이 없고, 아랫줄부터 저장된 숫자를 스트레치·색 지도·등고선·빔으로 표시해야 그림이 됩니다. 전체 세기(Jy)는 Jy/beam 합을 빔 넓이(픽셀)로 나눠 구합니다.
  • 분석에는 파이썬의 Astropy(fits, wcs, visualization)와 numpy·matplotlib를 주로 쓰며, 연구자는 가중치·CLEAN 범위·자기보정·다주파수 정렬·불확실성·재현성을 끝까지 따져 영상의 구조가 진짜인지 확인합니다.

🧑‍🏫 선생님·학부모님을 위한 설명 도움말

원리 자세히 보기

  • 기선 하나는 '줄무늬 하나'를 잰다 — 망원경 두 대(기선 하나)는 하늘에 특정한 간격과 방향의 줄무늬를 겹쳐 놓고, 천체가 그 무늬와 얼마나 닮았는지를 잽니다(푸리에 변환). 긴 기선은 촘촘한 줄무늬로 작은 구조를, 짧은 기선은 넓은 줄무늬로 큰 구조를 봅니다. KVN 망원경 4대로는 기선이 6개뿐이지만, 지구가 자전하면서 기선의 길이와 방향이 계속 바뀌어 몇 시간 동안 u-v 평면을 조금씩 채웁니다.
  • 얼마나 작은 것까지 볼까? — 분해능은 대략 파장 ÷ 기선 길이입니다(간섭계 원리). KVN의 가장 긴 기선(약 504 km)으로 129 GHz(파장 약 2.3 mm)를 관측하면 약 1밀리각초(1 mas, 1도의 360만 분의 1)를 구별할 수 있습니다. 달 표면에 놓인 약 2 m 크기의 물체를 구별하는 정도입니다. 22 GHz에서는 약 5.6 mas입니다.
  • 보정(calibration)의 세 단계
    • 진폭 보정 — 각 망원경의 감도와 그날의 잡음 수준(시스템 온도)으로 '얼마나 밝은지'를 같은 단위로 맞춥니다.
    • 프린지 맞추기 — 상관처리 뒤에도 남은 망원경별 작은 시간 지연과 위상 변화를 찾아 없앱니다.
    • 대기 보정 — 수증기 때문에 흔들린 위상을 바로잡습니다. KVN은 여러 주파수를 동시에 관측하므로, 비교적 안정된 22 GHz에서 잰 흔들림으로 높은 주파수를 보정할 수 있습니다(전파 수신기).
  • 닫힘 위상과 자기보정 — 망원경 세 대가 이루는 삼각형의 세 위상을 더하면, 각 망원경에 따로 붙은 오차가 서로 지워져 천체 고유의 값만 남습니다. 이 성질을 이용해 영상과 보정값을 번갈아 고쳐 나가는 자기보정(self-calibration)이 VLBI 영상의 질을 크게 높였습니다.
  • CLEAN이 하는 일 — 점 하나를 관측하면 생기는 무늬(보정 전 빔)를 미리 계산해 둡니다. 영상에서 가장 밝은 곳을 찾아 그 밝기의 일부(보통 10 % 정도)만큼 빔 무늬를 빼고 위치와 밝기를 기록하는 일을 수백~수천 번 되풀이합니다. 마지막에 기록해 둔 점들을 깨끗한 둥근 빔으로 다시 그려 최종 영상을 만듭니다.
  • 영상은 하나의 정답이 아니다 — 채우지 못한 u-v 칸이 있어 같은 데이터에 맞는 영상이 여러 개일 수 있습니다. 그래서 2019년 EHT는 여러 팀이 서로 결과를 보지 않은 채 따로 영상을 만들고, CLEAN과 다른 방법들을 함께 써서 결과를 비교·검증했습니다(관측영상).

전파 영상 처리의 발전사

시기사건의미
1946년첫 전파 간섭계 관측호주의 페인-스콧·포시, 영국의 라일·본버그가 여러 안테나의 신호를 합쳐 천체를 관측했습니다.
1958년제니슨의 닫힘 위상망원경 셋의 위상을 더하면 오차가 지워진다는 아이디어가 나왔고, 훗날 VLBI 보정의 바탕이 되었습니다.
1960년대지구 자전 개구 합성과 FFT영국 케임브리지의 라일 연구진이 지구 자전을 이용해 큰 망원경 효과를 내는 개구 합성 영상을 만들었습니다. 1965년 발표된 고속 푸리에 변환(FFT) 계산법이 컴퓨터 영상화를 크게 앞당겼습니다.
1974년회그봄의 CLEAN, 라일·휴이시의 노벨상스웨덴의 얀 회그봄이 CLEAN 알고리즘을 발표했습니다. 같은 해 라일과 휴이시가 개구 합성과 펄서 발견 등의 공로로 천문학 분야 최초의 노벨 물리학상을 받았습니다.
1979 ~ 1982년FITS 형식 탄생미국 국립전파천문대·키트피크 천문대 연구자들(웰스·그라이젠 등)이 천문대끼리 자료를 주고받기 위한 FITS를 만들어 1981년 발표했고, 1982년 국제천문연맹(IAU)이 표준으로 인정했습니다.
1978년AIPS 개발 시작미국 국립전파천문대(NRAO)가 전파 간섭계 자료 처리 프로그램 AIPS를 만들기 시작했고, 지금도 VLBI 자료 처리에 쓰입니다.
1970년대 말~1980년대자기보정 기법의 정착대기와 장비 오차를 영상과 함께 풀어내는 방법이 자리 잡으며 VLBI 영상의 질이 크게 좋아졌습니다.
1990년대 말 ~ 2002년FITS-IDI와 WCS 표준상관기 출력용 FITS-IDI 형식이 AIPS 메모로 정의되었고, 2002년 하늘 좌표를 헤더에 적는 WCS 규칙이 논문으로 정리되어 모든 프로그램이 같은 방식으로 좌표를 읽게 되었습니다.
2013년 ~Astropy와 파이썬 분석천문학 공동체가 함께 만드는 파이썬 패키지 Astropy가 발표되어, FITS 읽기와 좌표 계산의 표준 도구가 되었습니다. 2016년에는 FITS 표준 4.0이 승인되었습니다.
2019년EHT 블랙홀 그림자 영상여러 영상화 방법을 독립적으로 비교해 M87 블랙홀 그림자를 발표했습니다. KVN도 같은 천체의 제트를 관측하며 이 연구를 보완하고 있습니다(KVN).

비유로 설명하기

  • 조각이 군데군데 빠진 퍼즐을 맞추는 것과 같습니다. 가지고 있는 조각(가시성 데이터)과 어긋나지 않으면서 빈자리를 가장 그럴듯하게 채워 그림을 완성합니다. CLEAN은 "이 그림은 밝은 점들이 모여 이루어져 있다"고 가정하고 퍼즐을 맞추는 방법입니다.
  • 메아리가 심한 강당에서 녹음한 목소리에서, 메아리가 어떻게 생기는지 알고 있으면 메아리만 빼내 원래 목소리를 또렷하게 만들 수 있습니다. 사이드로브를 빼는 것도 같은 원리입니다.

자주 하는 오해

  • "전파 영상의 색은 천체의 실제 색이다" — 전파는 눈에 보이지 않으므로, 영상의 색은 전파의 세기를 알아보기 쉽게 칠한 것입니다. 같은 자료라도 다른 색으로 나타낼 수 있습니다.
  • "FITS 파일 안에 영상의 색이 들어 있다" — FITS에는 세기 숫자만 있습니다. 색과 밝기 범위는 보는 프로그램에서 정하는 것이라, 같은 파일도 DS9와 파이썬에서 다르게 보일 수 있습니다.
  • "CLEAN은 사진 보정 앱처럼 없는 것을 그려 넣는다" — CLEAN 결과는 실제로 측정한 가시성 데이터와 맞아야 하며, 천문학자들은 처리 결과를 원래 데이터와 비교하고 서로 다른 방법으로 다시 만들어 보며 검증합니다.

함께 해 볼 질문·활동

  • 모눈종이에 몰래 점 세 개를 찍고, 친구에게는 가로줄별·세로줄별 점의 개수만 알려 준 뒤 원래 위치를 맞혀 보게 하기 — 일부 정보만으로 영상을 되살리는 어려움을 느껴 볼 수 있습니다
  • 지도에 망원경 위치를 점으로 찍고 모든 쌍을 선으로 이어 기선 수 세어 보기: KVN 4대는 6개, 망원경이 8대라면 몇 개일까요?(28개)
  • FITS 실험실에서 모의 FITS를 내려받아 무료 프로그램 SAOImage DS9로 열고, 헤더(File → Header)의 BMAJ·CDELT1 값으로 빔이 몇 픽셀인지 직접 계산해 보기
  • 메모장 같은 글자 편집기로 FITS 파일을 열어 앞부분 헤더는 읽히고 데이터 부분은 깨진 글자로 보이는 것을 확인하고, 그 이유(글자와 이진 숫자) 이야기하기
  • 파이썬 예제 1을 실행해 스트레치를 'linear', 'sqrt', 'log'로 바꿔 보며 희미한 제트가 가장 잘 보이는 방법 찾기
  • CLEAN 시뮬레이션에서 3C 273과 3C 84를 KVN 4대로 각각 끝까지 CLEAN해 '실제 위치 근처에 놓인 비율'을 비교하고, u-v 채움 그림과 연결해 차이를 설명하기. 일본 VERA를 더하면 어떻게 달라지는지도 확인하기
  • 이 페이지의 CLEAN 시뮬레이션을 누르며, 처음 몇 번과 나중 몇 번 중 언제 영상이 더 크게 바뀌는지 관찰하고 그 이유 이야기하기

본 교육자료는 Anthropic(Claude) 및 OpenAI(ChatGPT)를 활용하여 제작하였으며, 제작자가 내용을 검토·편집하였습니다. 주요 참고자료와 출처는 각 페이지의 「참고 자료 및 출처」에 명시하였습니다. 출처가 별도로 표기되지 않은 페이지와 참고자료에 포함되지 않은 내용은 제작자가 직접 작성하거나 정리한 것입니다. 내용에 오류가 있거나 수정이 필요한 사항을 발견하시면 kvnsite@kasi.re.kr로 알려 주시기 바랍니다.