borch

튜토리얼 · 7

신호와 FFT

망에 건네지는 것은 숫자이고, 그 숫자를 어떻게 적었는가 가 일의 어려움을 거의 다 정한다. 이 튜토리얼은 신호 하나를 놓고 그 안의 주파수를 보고, 일부를 버리고, 같은 작은 모델을 두 번 — 파형으로 한 번, 스펙트럼으로 한 번 — 학습시켜 적는 방식이 만드는 차이를 잰다.

1 · 신호 안에 든 것

사인파 둘을 더한 것. fft.rfft 는 표본 64 개를 복소수 33 개로 — 주파수마다 하나씩 — 바꾸고, 각 복소수의 크기가 그 주파수가 얼마나 들어 있는지를 말한다. 실수 입력의 스펙트럼은 좌우가 겹치므로 rfft 는 거울이 아닌 절반만 남긴다. fft.fft 와의 차이는 그것뿐이다.

막대 둘, 4 주기와 11 주기에, 크기 비 2:1 — 넣은 그대로다. 여기서 학습된 것은 없다. 산수이고, 텐서가 이미 거기 있으니 GPU 에서 돈다.

2 · 거르기는 칸을 지우는 일이다

신호를 잡음에 묻고, 주파수로 보내고, 12 주기 위의 칸을 0 으로 만들고, fft.irfft 로 돌아온다. 저역 통과 필터는 그것이고 그 이상이 아니다. 깨끗한 신호에 대한 오차가 됐는지 안 됐는지를 말한다.

살아남은 잡음은 마침 12 주기 아래에 앉아 있던 몫이다. 필터는 신호와 잡음을 가르지 못한다. 주파수를 가를 뿐이고, 둘이 겹치지 않을 때만 그 둘이 같은 일이다.

3 · 같은 모델, 입력을 적는 두 방식

신호 세 갈래 — 5, 6, 7 주기 — 각각 진폭과 위상이 무작위이고 잡음이 얹힌다. 날 표본 64 개로 작은 망 하나를 학습시키고, 똑같은 망을 스펙트럼 크기 33 개로 학습시킨다. 학습 데이터 크기를 넷으로 바꿔 가면서. 두 열 사이에서 모델은 아무것도 바뀌지 않는다.

차이는 데이터가 적은 쪽 끝에 있고, 데이터가 늘면 닫힌다. 파형 모델은 밀린 사인도 같은 사인 이라는 사실을 배워야 하고, 스펙트럼 모델은 복소수의 크기가 위상을 떨구므로 그것을 공짜로 얻는다 — 그러니 변환이 사 주는 것은 정확도가 아니라 예제 이고, 예제가 충분해지면 아무것도 사 주지 않는다. 특징 공학이 하는 일의 정직한 판이고, 딥러닝이 와도 사라지지 않은 이유다. 데이터가 가장 비싼 자리에서 정확히 가장 값한다.

4 · 스펙트럼이 거짓말하는 자리

칸은 정수 주기다. 4.5 주기짜리 신호는 어느 칸에도 안 맞고, 그 힘은 이웃으로 번진다 — 스펙트럼 누설 이고, 그때 변환이 잘못된 것은 아무것도 없다. 창을 씌우면 번짐이 좁아지고, 없어지지는 않는다.

어디로 더 갈 수 있나. fft.stft 는 신호를 겹치는 토막으로 잘라 각각을 변환한다 — 스펙트로그램이 그렇게 만들어진다. 그것을 튜토리얼 4 의 합성곱 망에 넣으면 가로가 시간, 세로가 주파수인 그림을 다루는 오디오 분류가 된다. fft.fft2 는 같은 일을 이미지에 하고, 거기서 저역 통과는 조리법을 읽을 수 있는 흐리기다.