Codegate2019 - MIMO OFDM

By BPSEC | April 26, 2019

2019 코드게이트 Final - MIMO OFDM



일단 답을 알고 싶은 분들을 위한 간략풀이부터 말씀드리고 문제의 의도 및 자세한 설명을 드릴게요.

real값과 imag 값을 같은 이름끼리 더해서 complex double 형태의 데이터셋을 만들고



형태의 행렬 연산을 진행하면 데이터 bit 가 나오고

이를 이어 붙이면 ascii 값이 나옴

이 끝입니다.

뭐, 문제 상태 보셔서 아시겠지만 vntpaz를 출제한 출제자입니다.

네, 아직 퇴사안했어요. ^0^



하.. 카드값이 급한 나란놈..

무슨 이딴 문제가 있냐 라는 말이 충분히 나올 수 있는 상황이라 왜 저런 문제를 출제하게 됐고 어떤 이론 등이 들어가 있는지 말씀드릴게요

생각보다 별거 없는데 신기한 내용입니다.

물론 저만 신기할수도 있구요.

아래 설명하는 내용은 알아보기 쉽게 간략화하거나 비유해서 말하는 내용이 있습니다. 하지만 핵심은 틀리지 않으니 가볍에 이해하는 용도로 사용해주세요.

물론 수학공식 나오고 생전 처음 들어본 말이 대부분일 수 있으니 위에 풀이법을 이용해서 풀어보시고 제끼세욧!

문제 출제 시작은 말장난에서 시작됐습니다.

너 통신 전공이니까 5G 문제나 하나 내
그게 뭔 X소리에요? 아니 보안이나 컴전공 한 사람들은 머신러닝 다 꿰차고 있답니까?!



하지만 그것이 현실로 일어났습니다.

최대한 가벼운 형태로 4G, 5G의 핵심 기술에 대해서 약간의 공부를 통해 풀 수 있는 문제를 제작하자라는 취지였지만 막판에 푸신 분들 수를 보니까 암담하더군요.

죄송합니다.

자 설명 들어갑니다아.

먼저 4G와 5G는 OFDM이란 기술에서 출발합니다.

FM, AM, FSK 뭐 이런것들 많이 들어보셨잖아요.

그 중에 하납니다.

거의 대부분 기술이 그렇듯 80년대에 나온 기술인데 하드웨어 스펙이 딸려서 못쓰다가 2000년대 넘어서야 슬그머니 제품에 박아 넣기 시작합니다.

OFDM은 정말 신박해요.

보통 주파수 대역폭을 20MHz를 사용 가능하다 했을 때, 일반적으로 20Mbps라는 평균적인 공식이 성립 가능하다고 해봅시다.

1Hz에 1bit라는 공식이 성립하겠죠?

근데 저 20MHz를 40MHz처럼 사용한다면?

40Mbps라는 데이터 전송률을 가질 수 있겠죠!

바로 이 OFDM(Orthogonal Frequency Division Multiplexing)이 이를 가능하게 합니다. (실제로는 이렇게 딱딱 맞아떨어지진 않지만 느낌만 가져가세요.)



OFDM이 상용화 되기 전엔 빨간색만 보낸다던가 파란색만 보낸다던가 하는 식으로 서로간의 간섭을 최소화 했습니다.

왜냐? 이구동성 게임하고 비슷해요. 네 명이 한 단어를 한 글자씩 얘기하면 뭐라 하는지 안들리잖아요. 내가 듣고 싶은 내용을 제외하면 나머진 다 잡음, 즉 noise 잖아요. 파란색도 정상적인 신호고 빨간색도 정상적인 신혼데 파란색 입장에선 빨간색은 원래 신호 읽기 빡세게 만드는 나쁜놈일 뿐입니다.

근데 이 OFDM이 나온 다음에 어떻게 됐느냐.

무려 파란색과 빨간색을 동시에 보낼 수 있게 됩니다!



전 처음 배울 때 진짜 개신기했어요. 진짜임.

위에 그림을 보시면 왼쪽부터 빨1, 파1, 빨2, 파2 라고 튀어나온 부분에 이름을 붙이면 빨1이 가장 높은 값을 가질 때 점선을 따라 아래로 쭉 내려가보면 귀신같이 파1, 빨2, 파20이 됩니다.

마찬가지로 파1, 빨2, 파2 가 가장 높은 값을 가질 땐 나머지가 0이 되요.

아래로 쭉 내려가면 나머지애들 0을 찍잖아요.

이걸 zero crossing, 혹은 직교한다 라고 합니다.

그래서 이름에 Orthogonal이 붙는거에요.

자, 그럼 어떻게 배치를 해야 하나빼곤 다 0을 만들 수 있을까?

Fourier 선생님 들어오십니다. Taylor 선생님과 함께 대학교 1학년 꽤나 고통스럽게 만드는 그분이세요.



자, 막 시그마 나오고 무한대 생긴거 보니까 적분같기도 하고 삼각함수도 나오고 왜 저걸 다 섞어놨는지 눈물도 나고 속도 울렁거리고 막막 어지럽고, 그죠?

간단하게 설명하면 어떠한 값을 주파수 성분들의 합으로 표현 가능하다. 정도만 이해하시면 됩니다.

근데 딱봐도 프로그래밍 하기 강아지 같아 보이잖아요.

그래서 무려 “고오속” 푸리에 변환이라는 FFT(Fast Fourier Transform)가 나타납니다.



이걸 하면 X[0]에서 X[7]이(대문자) 딱! 정확하게! OFDM에서! 빨파빨파로 쓸 수 있게 만들어줍니다. 단, 2의 n승 개수의 입출력에서만. 그래도 이게 어디에요.



중간에 이상한 내용 넣어서 진짜 정말 죄송한데 OFDM는 FFT를 기반으로 시작됐다고 해도 과언이 아닙니다. 이걸 설명 안하면 #include <stdio.h> 설명 안하고 printf 사용법만 주구장창 알려주는거랑 같은거라서 그래요.

기본 원리 설명했으니 OFDM 설명 드립니다. 블록은 화살표를 따라가면서 보시면 됩니다.



Bits Stream

보내고자 하는 데이터입니다.

Modulator

데이터를 결합시키는 방식입니다. 1 0 1 0 형태가 아니라 다른 방식으로 보내는게 가능해요.



위 방식은 16QAM이라는 방식인데 4비트를 모아서 한방에 보낼 수 있는 방식이에요. 물리계층에서 데이터를 보낼 땐 1 0을 보내는 게 아니라 예를들어 –3 ~ 3 값 중 하나를 찍어서 보내면 받는 쪽에서 알아서 11, 10, 01, 00 등으로 판단하는 방식을 사용하기 때문에 대충 중간값을 보내면 알아서 비트로 변환시킵니다. 이렇게 묶인 데이터를 symbol이라고 합니다.

S/P

Sirial to Parallel의 약자로 1xN 형태의 데이터 어레이를 Nx1 형태로 바꾸는 작업을 뜻합니다. 주욱 이어져 있는 데이터를 FFT 단위별로 묶어서 한방에 보내겠다는 뜻이에요. 아 FFT는 2의 n승에 해당하는 단위만 가질 수 있습니다. 그래서 일반적으론 64, 128, 256, 512 정도의 데이터를 단위별로 묶어서 한방에 보냅니다.

IFFT

Inverse FFT라는 뜻이에요. FFT가 주파수 형태로 쪼갠다고하면 IFFT는 이걸 다시 원래 형태로 돌린다는 뜻입니다. 왜 여기에서 IFFT를 쓰는지는 뒤에서 설명드리겠습니다.

Insert Pilot Symbols

파일럿 프로그램이라고 들어보셨죠? 간보는 거잖아요. 송수신자가 서로 약속하고 보내는 신호로 채널을 겪을 때 도대체 무슨 일이 일어났나 알아보는데 사용됩니다.(채널은 뒤에 설명할게요)

P/S

Serial to Parallel 반대가 되겠죠? Parallel to Sirial입니다. 변환했으니 다시 보낼 수 있는 형태로 만들어줘야죠

Add Cyclic Prefix

신호 뒤의 일정부분을 복사해서 앞에 한 번 더 붙여주는 역할을 합니다. 채널에 대한 영향성을 최소화 하는데 사용됩니다.

Channel

채널은 무선신호의 경우 송신자가 0이라는 시간에 보낸 신호가 수신자에게 1이라는 시간에 도달해야하지만 여기저기 부딪히고 회절하고 반사되고 하면서 1.2에도 도착하고 1.5에도 도착하다보니까 신호가 주욱 늘어지는 현상을 말합니다. 그렇게 되면 자기 신호에 자기가 영향을 받아서 일반적으로 늦게 들어오는 신호들은 죄다 노이즈가 되어버립니다.

그래서 얘를 추정하는 방법도 엄청 많고 영향을 없애주는 방법도 엄청 많아요. 상황에 따라선 얘 때문에 기껏 멀쩡한 통신 스펙 바꾸는 경우도 있습니다. 제품을 새로 만든단 얘기죠. 농담이 아니라 얘 덕분에? 때문에? 석박사 단 사람들 엄청 많아요.

DAC

Digital to Analog Convertor라고 현재 사용되는 신호들은 전기신호이기 때문에 이를 전파 신호로 바꿔주는 작업을 합니다.

ADC

Analog to Digital Convertor라고 전파 신호를 잡아서 전기 신호로 바꿔줍니다.

Remove Cyclic Prefix

채널 영향 최소화 하는데 Cyclic Prefix 가 사용되었는데 이건 그냥 복사된 내용이잖아요? 그래서 떼어내줍니다.

Serial to Parallel

들어온 신호가 1xN 형태니까 FFT를 위해 Nx1 형태로 바꿔줍니다.

FFT

얼핏 생각하면 FFT를 보낼 때 쓰고 받을 때 IFFT를 써야 할 것 같잖아요? 근데 이게 수학적으로 보면 FFT를 해서 주파수 성분으로 쪼개서 보면 채널에 대한 영향을 매우 간단하게 해결할 수 있는 방법이 되요. 그래서 IFFT를 이용해서 데이터를 전송하고 FFT를 해서 주파수 형태의 데이터를 분석하면 채널의 영향성을 없앨 수 있습니다.

Remove Pilot Symbols

얘는 채널 영향 알아본다는 거잖아요? 데이터가 아니니 과감히 버려요

P/S

우리가 원하는건 데이터 스트림이니까 다시 Serial로

Demodulator

심볼로 만들었다고 했죠? 다시 bit로 바꿔줍니다.

Bits Stream

원래 데이터를 찾아냈습니다.!

이거시 바로 OFDM!



네 그냥 휴대폰 상품 설명서 읽듯이 읽으세요. 몇 명은 열심히 보겠죠 뭐.

FFT와 Channel만 느낌만 가져가시면 됩니다.

Channel 때문에 개판되지만 FFT 덕분에 할만하다!

MIMO OFDM중 OFDM에 대한 설명이 끝났으니 이제 MIMO를 알아볼까요?

MIMO는 간단히 말해서 안테나 여러개를 이용해서 주고받는다입니다.

Multi Input Multi Output의 약자에요.

아까 OFDM을 이용해서 두 배로 보낼 수 있다고 말씀드렸죠?

근데 여기서 보내는 안테나를 더 쓰고 안테나마다 다른 데이터를 전송하면 안테나 개수만큼 더 보낼수가 있게 됩니다.

어메이징하죠?

그리고 받는 안테나 개수를 늘리면 무선으로 전송하는데 에러도 덜 나요.

안테나 한 개 쓸 때 보다 두 개를 쓰게 되면 이론상 에러가 반으로(3dB gain. log 스케일이라서 2배를 3dB gain 이라고 불러요 10log2 = 3.010. 뭐 그렇다구요) 줄어들어요.

자 그럼 쏘는 안테나도 엄청 많이 쓰고 받는 안테나도 엄청 많이 쓰면 어떻게 될까요?

데이터 전송량 확 뛰고 안정적으로 데이터를 수신할 수 있다는 결론이 나오게 되죠.

이걸 Massive MIMO라고 불러요(그냥 안테나 겁나 많이 때려박았다고 생각하시면 됩니다. 기본 64개를 쓰기 시작하면 Massive라는 말이 붙기 시작하고 5년 전에 256개까지 쓰겠다는 발표를 본 적이 있네요.)



물론 이게 5G의 전부라고 볼 순 없지만 개략적인 개념은 여기에서부터 5G가 시작된다고 보시면 됩니다.

뭐 잡소리 간략하게 붙이자면, 5G, 뭘까요?

4G까지는 최대한 간소하게 표현하자면 다음과 같습니다.

  • 1G : 무전기, 단방향 통신.
  • 2G : 전화기, 양방향 통신.
  • 3G : 휴대폰, 데이터 통신.
  • 4G : 무선 기기 전반, 꽤 빠른 데이터 통신.

자 그럼 5G는? 간단해요. 생활 전반의 개 빠른 데이터 통신입니다.

5G는 인간의 인식 속도와 데이터 전송속도의 일치화가 목표라는 개념을 본 적이 있습니다.

예를 들어, ‘동영상을 보고싶다’라고 생각을 하고 조작하면 무선 데이터를 이용해 동영상이 시작되는 거죠. 인식하고 조작하는 순간 엄청 좋은 스펙의 PC에서 저장되어있는 동영상을 재생하듯. 바로. 버퍼링 이딴거 있으면 안돼요.

그냥 무선으로 데이터 쓰는데 SSD 쓰듯이 쓰는게 목표입니다. 그럼 어째야겠어요. 빨라야겠죠. 말도 안될정도로.

그래서 기가망이니 뭐니 하는 얘기가 매우 중요하게 됩니다.

잡소리 그만하고 다시 문제 풀이로 돌아오겠습니다.

문제 이름은 MIMO OFDM이었습니다.

앞서 MIMO와 OFDM 개념에 대해 말씀드렸는데요.

MIMO 방식으로 OFDM 통신을 하는걸 MIMO OFDM이라는 겁니다.

뭐 말 돌리기네요.

문제 이름은 MIMO OFDM, 설명으로는 “What did I send you?” 라고 했습니다.

그럼 문제로 제시된 파일 이름들을 좀 볼게요.



이상한거 많죠?

근데 원래 내려던 파일 목록은 이래요



근데 이렇게 내면 절대 못풀거래서 딱! 반으로! Double? Half!(네 이것도 저에요)

여튼 파일 이름들을 뜯어서 설명해 드릴게요

real : real number

imag : imaginary number

estemated : 추정된

channel : 채널

frequency : 주파수

received : 수신된

data : 데이터

그래서 위에서부터 쭉 알아들을 수 있는 말로 바꿔서 설명드리면

추정된 채널11에 대한 주파수 성분의 허수 부분

추정된 채널12에 대한 주파수 성분의 허수 부분

추정된 채널21에 대한 주파수 성분의 허수 부분

추정된 채널22에 대한 주파수 성분의 허수 부분

수신된 데이터1에 대한 주파수 성분의 허수 부분

수신된 데이터2에 대한 주파수 성분의 허수 부분

추정된 채널11에 대한 주파수 성분의 실수 부분

추정된 채널12에 대한 주파수 성분의 실수 부분

추정된 채널21에 대한 주파수 성분의 실수 부분

추정된 채널22에 대한 주파수 성분의 실수 부분

수신된 데이터1에 대한 주파수 성분의 실수 부분

수신된 데이터2에 대한 주파수 성분의 실수 부분



여전히 설명이 거지같죠?



저기 빨간색으로 나온 부분의 데이터를 저장한 겁니다.

왜 저부분의 데이터를 이용해서 문제를 냈냐면

OFDM에서 MIMO를 사용할 때 티나게 바뀌게 되는 부분이 저 부분이기 때문이에요

이후에 제가 힌트를 하나 드렸어요

2X2 MIMO receiver data

위의 키워드로 구글링을 하면 이미지 탭에



요래 생긴것들이 쭈욱 나와요

자 유추를 해보자구요

문제 파일중에 channel11에서 channel22가 있었죠? 그림에서 보면 H11~H22로 있네요

설명에 뭘 보냈냐고 물어봤고 문제 파일중에 received_data가 있죠?

그럼 어떤 형태를 만들 수 있을거 같지 않아요?

맨 처음 보여드렸던 행렬식과 유사한 행렬식입니다.



행렬 계산을 생각하시면 이해가 빠르실거에요

조금 자세히 설명을 드리면 Tx1 즉, 안테나 1에서 보내는 신호는 Ch11을 타고 Rx1로 들어갑니다. 마찬가지로 Tx2 신호는 Ch12를 타고 Rx1으로 들어가겠죠.

Rx2도 마찬가지입니다.

자 그렇다면 “What did I send you?” 우리가 보낸 Tx1, Tx2는 어떻게 구하면 될까요?

역행렬을 사용하시면 됩니다.



우리는 지금 Rx1, Rx2, Ch11~Ch22에 대한 성분을 모두 알고있어요

그럼 저 계산을 하면 Tx1과 Tx2를 알 수 있게 되겠죠

계산해볼게요.

사용하게 될 프로그램은 GNU octave라는 프로그램입니다.

수학적 계산에 매우 탁월한 성능을 지니고 있어요(실은 그냥 제가 손에 익어요..)

GNU octave가 아니더라도 본인이 손에 더 맞으시는 프로그램이 있으시면

라인 바이 라인으로 설명할테니까 맞춰서 사용하시면 됩니다.



뭐 다들 아시다시피 데이터를 읽어들이는 부분입니다.

파일 이름과 동일하게 읽어들이고 double로 저장했습니다.



사용하기 위한 형태로 변환합니다.

통신에서 사용되는 데이터는 대부분 complex double 형태를 취하고 있습니다.

그래서 문제 파일이 imag와 real 값이 나눠져 있었던 거에요

두 개를 바로 데이터로 저장하고 읽는 방법은 서로 약속이 되지 않는 한 힘들더라구요

그래서 real 값과 imag 값을 따로 저장했습니다.

그리고 읽어들인 값은 imag값엔 j 즉, imaginary number i를 곱한 뒤 real값과 더해서 데이터를 만들어냈습니다! 와우!

이렇게 생성된 데이터들은 256의 길이를 가지고 있습니다.

FFT 설명할 때 사이즈가 2의 n승이라고 말씀드렸죠? 2의 8승 되겠습니다.

역행렬 연산을 해봅시다.



네 끝났습니다.

먼저 연산된 데이터가 들어갈 data1과 data2를 생성하고 한땀한땀 만들어봤습니다.

아 참고로 실수 행렬과 복소수 행렬의 역행렬은 약간의 차이가 있으니까 따로 구현하실 분들은 참고하세요

여기에선 GNU octave에서 제공하는 inv라는 역행렬 함수를 사용했습니다.

저렇게 하면 data1과 data2가 어떻게 나오냐면



이렇게 나옵니다.

뭔가 되게 이상한 값이 나온거 같죠?

근데 앞에 실수말고 뒤에 허수는 e-16같은게 붙어있잖아요

10의 –16승이라는 값입니다. 거의 없다고 보시면 되요

FFT와 IFFT를 하다보니까 파편 정도가 남았다고 생각하시면 됩니다.

그럼 실수값만 보게되면 1, -1만 반복되고 있잖아요

데이터를 추출할 수 있게 되었습니다.



근데 또 보니까 119에서 138은 값이 없네요

다른 언어로 프로그래밍 하실 때 주의하셔야 하는 부분은 GNU Octave에서는 행렬의 시작 index가 0이 아닌 1입니다.

그래서 만약 다른 언어로 보실 땐 118에서 137 위치에 값이 비어있을거에요

그럼 저길 빼고 데이터를 가져오면 되겠네요

1을 1로, -1을 0으로 매칭해볼게요.



로지컬 값으로 출력되긴 하는데 가장 일반적으로 데이터를 비트로 바꾸는 방법입니다.

아까 위에 허수값이 있었죠? 그걸 날리기위해 데이터에서 실수값만 취하는 real() 함수를 이용했습니다.

1은 0보다 크니까 1로 –1은 0보다 작으니까 0으로 출력됩니다.

이 값을 우리가 볼 수 있는 값으로 바꿔볼게요

먼저 re_data의 1~118부분과 138~256 부분을 떼어서 길게 이어붙이고

이 비트들을 ascii 값으로 바꿔주는 과정입니다.



저렇게 하면



와 같은 59개의 ascii 값을 획득할 수 있게 됩니다.

그래서 flag는

This_technology_is_the_basic_technoloy_of_5G_communication.

이 되겠습니다.

옆의 팀이 하는 말을 듣고 치팅할 까봐 일부러 방지 장치로 오타는 개뿔

오타 있는지는 지금 write up 쓰다 알았네요… 죄송합니다.



technology로 할지 technique으로 할지 고민하다가 그만…

여튼 문제를 통해 보여드리고 싶었던 내용은 여러 안테나를 이용해 동시에 주고받아도 수신자가 이를 구분할 수 있다는 점이었습니다.

물론 OFDM 데이터 프레임 구조 변경에서부터 여러 디테일이 포함되어야 하지만 기본적인 개념은 문제에서 보여드린바와 같습니다.

실제로 안테나가 많아질수록 역행렬 연산의 구현복잡도가 매우 올라가기 때문에 의사 역행렬(Pseudo inverse) 등의 기법을 사용하기도 하고 기상천외한 방법을 사용하기도 하지만 2X2는 손으로도 푸는게 가능하잖아요.

음.. 급 마무리긴 한데 지금까지 Codegate 2019 Final MIMO OFDM write up 이었습니다.



comments powered by Disqus