본문 바로가기

통신이론

KBS클래식FM SDR 복조

오늘 주제는 아날로그의 대장이고 아날로그 변조방식의 백미~! 바로바로 FM방송 입니다.

여러 지상파FM방송이 많지만, 여기서는 RDS(Radio Data System) 서비스를 하는 몇 안되는 방송 중 KBS클래식FM(청주 94.1  ㎑ )를 선택했습니다. 영화 '파반느'에서 여주가 광고없는 클래식FM을 좋아하고 추천해 주죠. ㅎㅎㅎ

영화 '파반느' 한장면

여기서는 FM방송의 주채널, 부채널, 파일럿, RDS를 살펴보고, mono와 stereo 음성 복조를 수행해볼게요!

 


 

마찬가지로 GQRX로 전파신호를 먼저 IQ데이터 형태로 캡처 합니다. 아래 그림 오른쪽 밑 RDS 디코딩도 동시에 되네요.

송신소에서 약 20km 밖 실내에서도 잘 수신되는 것이 새삼 놀랍네요.

KBS클래식FM(청주 94.1kHz) RF 스펙트럼

 

이상태로는 용량이 너무 커서 한 채널을 포함하는 10초 길이의 240 ㎑ 대역폭 신호로 축소하고 작업을 시작할게요.

아래파일은 샘플레이트 240㎑ 이고, 1샘플은 64비트 복소수 입니다.

94.1.npy
18.31MB

 

 

이제 RF신호를 베이스밴드신호로 복조를 합니다.

x가 메시지신호라고 할때, FM신호는 아래와 같이 표현할 수 있습니다.

FM(t) = A·cos{wct + kf·∫x(τ)dτ}

위상을 시간에 대해 미분하면, 순시주파수 wi(t) = wc + kf ·x(t) 가 되므로 연속된 샘플들 간의 위상 차이를 계산하여 FM 복조(Quadrature Demod)할 수 있습니다. FM 복조에서 편리한 점은 수신 신호의 진폭 변화가 AM 라디오와 달리 오디오 볼륨을 실제로 바꾸지 않는다는 것입니다.

-xp<x(t)<xp를 만족하므로 FM변조된 신호의 최대 주파수 변화(편이) △w = 2xpkf , 편이비 β = △w/wm , 일반적으로 β>0.2인 경우 WFM이라고 합니다. 

Quadrature Demod

복조한 결과를 보면, 흔히 MPX 혹은 컴포지트 신호라 불리는 아래같은 기저대역 스펙트럼을 볼 수 있습니다. 당황스럽긴 한데, 압축을 풀었더니 그 속에 또 압축파일이 있는 느낌이에요.

< MPX 혹은 컴포지트 신호 >
ㅇ 모노와 스테레오 오디오는 단순히 아날로그 오디오 신호를 전달하며, 더하고 빼면 왼쪽과 오른쪽 채널이 나옴
ㅇ 19 kHz 파일럿 톤은 스테레오 오디오를 복조하는 데 사용됩니다. 톤을 두 배로 하면 스테레오 오디오 신호가 38 ㎑에 위치해 있기 때문에 주파수와 위상 기준 역할을 합니다.
ㅇ RDS는 57 ㎑ 채널(대역폭 약 4 ㎑)에서 방송국 식별, 프로그램 정보, 시간 및 기타 기타 정보를 BPSK로 초당 1187.5개의 심볼 전송
ㅇ SCA는 67 채널 사용하여 스테레오 음성 보조 프로그램(보조 채널) 전송. 사용하지 않는 것 같음
ㅇ RDS2는 새로운 확장표준으로, UTF-8 문자 인코딩, 그래픽 RadioText, 하이브리드 라디오 기능 등을 지원.
    중심주파수는 57 , 66.5 , 71.25 , 76 이용

 

스테레오FM방송은 전파형식이 260KF9W 으로 표현되는데, 이는 변조형식:FM(F)·신호특성:아날로그와 디지털 채널 조합-MPX(9),정보형태:음악와 데이터 조합(W)과 카슨법칙에 따른 대략 대역폭 2*(편이 75 ㎑ + 신호최대주파수 59 ㎑ ) ≒ 260 ㎑ 를 의미합니다.

FM 복조신호(MPX) 스펙트럼

 

그다음은 복조한 신호가 이미 오디오의 고주파수대역을 높인 프리엠파시스를 적용했기때문에 (아래 주파수응답 참조),

다시 최종 원음으로 복원하기 위해서는 디엠파시스를 필터처리해야 합니다.

프리엠파시스 및 디엠파시스 주파수응답

 

바로 (15 ㎑ 이상 불필요한 부분은 날려 버리는) 다운샘플링해서 '94.1_classic_Pre-emphasis_mono' 오디오를 만들고, 

디엠파시스 필터를 적용하여 원래대로 복원한 후 다운샘플링해서 '94.1_classic_De-emphasis_mono' 오디오 생성하고,

디엠파시스 필터를 적용한 주채널(L+R)과 주파수이동하고 디엠파시스 필터적용한 부채널(L-R)를 더하거나 빼서 좌우 입체음향을 주는 '94.1_classic_De-emphasis_stereo' 오디오 생성합니다.


Pre-emphasis_mono
De-emphasis_mono

 

94.1_classic_De-emphasis_mono.wav
0.57MB
94.1_classic_De-emphasis_stereo.wav
1.14MB
94.1_classic_Pre-emphasis_mono.wav
0.57MB

 

프리엠파시스 적용된 mono오디오는 고대역이 강조되어 날카로운 느낌이고, 디엠파시스 적용 mono는 가장자리가 처지면서 둥글둥글한 느낌이네요. 일단 둘 다 충분히 고음질로 느껴집니다. 다만, 15 ㎑ 이상 초음파에 가까워질 수록 나이가 들면 잘 안들리고(ㅠㅠ) 음질에 크게 영향을 끼치지 않아서 FM방송에서도 제한한다고 합니다.

 

마지막으로 아래 참고자료1를 보면, RDS도 디코딩이 가능한데 복잡해서 여기서는 생략하고 수행했던 소스코드를 공유할게요.


import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
from scipy.signal import bilinear, lfilter, decimate

x = np.load('94.1.npy')
sample_rate = 240e3

# Quadrature Demod
x = 0.5 * np.angle( x[0:-1] * np.conj(x[1:]) )

down = 8
sample_rate_audio = sample_rate/down
sd = decimate(x, down, ftype='fir')   # 30k
sd = 2**15 * sd / max(abs(sd))
wavfile.write('94.1_classic_Pre-emphasis_mono.wav', int(sample_rate_audio), sd.astype(np.int16))   # sample_rate, audio_data

# De-emphasis filter, H(s) = 1/(RC*s + 1), implemented as IIR via bilinear transform
bz, az = bilinear(1, [75e-6, 1], fs=sample_rate)
x = lfilter(bz, az, x)
t = np.arange(len(x)) / sample_rate
y = x * np.exp(2j*np.pi*-38e3*t)
y = lfilter(bz, az, y)
y = np.abs(y)

# decimate by 8 to get mono audio  
x = decimate(x, down, ftype='fir')   # L+R
y = decimate(y, down, ftype='fir')   # L-R
left , right = x + y , x - y

# normalize volume so its between -1 and +1
x *= 2**15/np.max(np.abs(x))
left *= 2**15/np.max(np.abs(left))
right *= 2**15/np.max(np.abs(right))

# Save to wav file, you can open this in Audacity for example
wavfile.write('94.1_classic_De-emphasis_mono.wav', int(sample_rate_audio), x.astype(np.int16))

stereo = np.array([left, right], dtype=np.int16).T   # stereo
wavfile.write('94.1_classic_De-emphasis_stereo.wav', int(sample_rate_audio), stereo)
 

 

읽어주셔서 감사드립니다! 다음에는 BPSK 디코딩을 해 보겠습니다!! 두둥!!

 

<참고자료>

1. End-to-End Example | PySDR: A Guide to SDR and DSP using Python

2. 전파 방출의 종류 - 위키피디아

 

'통신이론' 카테고리의 다른 글

SSTV 디코딩 실습(feat. Robot8, 24, 36)  (0) 2026.01.29
ATIS_비행정보방송(feat. SDR)  (0) 2025.12.18
동기화(Synchronization)  (0) 2025.09.30
간단한 OFDM 체험기  (8) 2025.08.15
대역확산스펙트럼 기술들(DSSS, FHSS)  (1) 2025.06.17