Transmitting NTSC-M video with GNU Radio and USRP 2920




 이전 포스팅에서 소개했듯이 GNU Radio는 사용자의 목적과 니즈에 따라 다양한 시스템을 구현할 수 있으며 USRP를 함께 이용해 실제 무선환경에서 자신이 구축한 시스템의 통신 성능을 확인할 수 있다. 

실제로 이와같이 GNU Radio와 USRP 혹은 HackRF One 과 같은 다양한 RF 장비를 이용해 실제 무선통신시스템을 구축하고 그 성능을 확인, 분석하는 예제나 데모 영상들은 구글이나 유튜브에서 쉽게 찾아볼 수 있다. 이러한 예제 중 사용자가 가장 효과적으로 그 시스템의 구현도나 성능을 쉽게 확인하기 위한 방법 중 하나는 데이터의 시각화이다. 


 따라서 단순한 랜덤 비트시퀀스(bit sequence)가 아닌 텍스트나 사진 혹은 영상과 같은 정형 데이터를 이용하는것이 구현 시스템의 데모를 위해 매우 효과적이라고 생각한다. 

 하지만 실제로 GNU Radio를 이용해 사진, 텍스트 및 영상과 같은 데이터 송수신이 가능한 시스템을 구현한 예제는 그리 많지 않으며, 그 중 실제 무선환경에서 RF 장비를 이용해 데이터를 실제로 송수신한 시스템은 더더욱 적다. 


 게다가 대부분의 예제는 일반 사용자들이 보고 참고할 수 있는 설명이 매우 적거나, 제한적인 정보 공개로  사용자들로 하여금 입맛만 다시고 뒤로가기 버튼을 누를 수 밖에 없는 경우도 많다. 


실제 본인도 '비디오 송수신'을 위해 GNU Radio를 기반으로 시스템을 만들려고 '정말 괜찮은' 자료를 찾기위해 매우 오랜시간, 매우 다양한 예제와 데모영상을 찾아야만 했다. 그래서 분명 어딘가에 나와 같이 비슷한 고민을 갖고 이러한 자료를 찾고 있을 누군가를 위해 실제로 구현하고 성공했던 예제를 총 두개의 예제(NTSC-M 방식 / OFDM 방식)로 나누어 포스팅하려고 한다.  




Part. 1 


1. 개요

  NTSC-M 이라는 단어는 비디오, 방송 분야쪽에 관심이 있는 사람이 아니라면 생소한 단어인데, 사실상 꽤 오랜시간동안 우리의 생활에 밀접했던 기술용어이다. 아시다시피 우리나라는 2012년 중반부터 아날로그 TV 서비스를 종료하고 DTV 서비스로 전환하였는데, 이때 아날로그 TV 서비스를 위해 사용되었던 표준이 바로 NTSC-M 방식이다. 


 여기서 굳이 NTSC를 장황하게 설명하는지 궁금해하는 분들도 있을텐데 비디오 송수신 시스템을 구현하는 과정에서 나와 같은 착오와 실수를 똑같이 하지 않길 바래서이다. 그럼 내가 했던 착오와 실수가 무었이 있었는지 간단히 적어보겠다. 


  (1) 비디오데이터도 결국엔 binary로 이루어져있을테니, 그 binary 파일만 제대로 송수신 된다면 비디오 영상 송수신도 제대로 될것이다.

   ex) 동영상 파일 -> binary file -> 송수신 -> binary file -> 동영상 파일 -> 재생 -> 끝 ! 


  (2) 결국 내가 구현하고 싶은건 (1)번의 송수신 파트이지 그 전후 단계는 GNU Radio에서 알아서 해줄테니 신경쓸 필요가 없다. 하지만 실제로 구현해보니 '송수신' 파트 뿐만 아니라 그 전후의 모든 단계도 내가 알고 있어야하고 사용하고자 하는 표준의 방식과 형태를 알아야 가능했다.


 즉, 어떠한 시스템을 이용해 비디오를 재생 혹은 스트리밍할지 정확히 알아야 하며 그에 맞춰 시스템을 디자인해야 한다. 


2. NTSC-M 

 NTSC-M 방식은 앞서 말한바와 같이 아날로그 TV의 표준(PAL, NTSC)중 하나이며, 기존의 6MHz 주파수 대역내에 컬러신호를 수용하기 위한 방식이다. (북미와 우리나라에서 채택, 유럽은 PAL 방식)

GNU Radio에서 여러 변수값들은 다음의 NTSC-M 스펙에 따라 정해지게 된다. 


NTSC-M specification

 Bandwidth

 6MHz 

 Frame size

 30fps(=frames/second), technically accurate 29.96 fps

 Vertical scan line(주사선)

 525 = 2 * ( 241.5(visible lines)+21(vertical lines blanking/field) )

 Vertical frequency

 59.94Hz 

 Horizontal frequency

 15,734Hz 

 Refresh rate

 59.94 fields/sec 

 Video Bandwidth

 4.2MHz 

 Video carrier frequency

 Channel lower boundary + 1.25MHz

(ex: 470MHz + 1.25MHz = 471.25MHz) 

 Color subcarrier freq.

 Video carrier freq. + 3.57954545MH 

 Audio carrier frequency

 Video carrier freq. + 4.5MHz

 Modulation

 Video = VSB(AM) / Audio = FM

표 1. NTSC-M 표준 세부사항 



그림 1. NTSC-M 표준 스펙트럼 구성


 표 1의 NTSC-M 표준의 스펙트럼 구성은 그림 1과 같다. Video carrier frequency(반송파)는 Channel lower boundary + 1.25MHz 라고 정의되어 있는데 이는 그림 1과 같이 각 채널의 시작 주파수에서 1.25MHz 떨어진 곳을 의미한다. 여기서 채널은 실제로 TV의 채널번호를 의미하는데 우리나라의 채널 주파수 할당은 미국의 채널 주파수 할당과 동일하며 표 2와 같다. 


채널번호 

주파수 대역

(a~b MHz)

영상 반송파(V)

(Video carrier freq.) 

음성 반송파 

(Audio carrier freq.)

 2

54~60 

 a+1.25 = 55.25[MHz]

V+4.5 = 59.75[MHz] 

 3

60~66 

a+1.25

V+4.5

 6

82~88 

''

''

 14

470~476 

''

''

표 2. 대한민국 아날로그 TV 주파수 할당표



3. Data conversion


 NTSC-M 방식을 이용해 비디오 스트리밍을 하기 위해서는 표준에 맞게 그 형태를 바꾸어야 한다. 

본인은 .mp4을 이용해 NTSC 방식에 맞도록 그림 2와 같이 데이터를 변환 및 인코딩 하였다. 



그림 2. 데이터 변환 및 인코딩



 앞서 NTSC-M 방식에 대해 설명한것 처럼 비디오와 오디오는 서로 다른 변조방식을 이용해서 전송되기 때문에 하나의 비디오에서 영상과 음성을 따로 분리시켜 전송해야 한다. 

따라서 비디오파일을 NTSC 방식의 영상표준(30fps)에 맞춰 프레임을 캡처해 각각의 이미지 파일로 저장해야 하고 ntsc-encoder(ntsc-encode-vid-mod.py)를 이용해 .dat 형식으로 변형해줘야 한다. 마찬가지로 음성 파일도 해당 영상 파일에서 .wav 파일 형태로 추출해야 한다. 


다음 포스팅에서 grc 플로우차트와 함께 각 변수에 대한 자세한 설명과 변수 값 설정을 통해 NTSC-M 송신 시스템 구현을 마무리 하도록 하겠다.




부록) ntsc-encode-vid-mod.py 사용 방법

링크: 윈도우 10에서 ffmpeg 사용하기

본인의 윈도우에서는 해당 파일이 파이썬으로 동작하지 않아 부득이하게 리눅스가 설치된 컴퓨터에서 사용하였으며 자세한 사용 방법은 아래와 같다.



python ntsc-encode-vid-mod.py image001.png video.dat 3000

그림 2를 통해 설명한영상 파일을 30프레임에 맞춰 캡처한 이미지 파일들을 NTSC 방식의 형태로 인코딩한 후 하나의 .dat 파일로 만드는 명령어이다. 


본인은 3천장의 캡처 이미지 파일을 갖고 있었으며 이를 하나의 video.dat 파일로 묶었는데 이때 파일들의 이름을 하나의 이름으로 통일(예: imageXXX.png)시키고 뒤에 순서대로 번호를 적어야 한다. 

번호는 image001 ~ image999, image1000, ~, image2999, image3000 이런식으로 설정하였으며 명령어의 마지막 숫자(3000)은 video.dat 파일로 묶을 전체 이미지 파일의 갯수이다. 

즉, 사용자의 목적에 따라 한장의 이미지로도 .dat 파일을 만들 수 있으며 혹은 수천장의 파일을 묶어서 .dat 파일을 생성할 수 있다. 

+ Recent posts