평행이동 대칭: 왜 하필 사인과 코사인인가

주파수 응답: 필터가 물결마다 몇 배 하나

이어폰 상자에는 「20 Hz ~ 20 kHz」 같은 숫자가 적혀 있고, 카메라 렌즈 평가에는 가는 줄무늬를 얼마나 살리는지 그린 곡선이 붙는다. 둘 다 「어떤 주파수의 물결을 몇 배로 내보내나」를 적은 것이다. 필터는 물결마다 고윳값을 곱했지만, 지금까지는 고리 위의 물결 번호 k만 보았다. 칸 수와 상관없이, 합성곱 커널의 숫자 몇 개만 보고 어떤 주파수의 물결이 살아남는지 한눈에 읽을 수는 없을까?

역사: 헬름홀츠의 공명기

같은 높이의 음을 바이올린과 플루트로 내면 소리가 다르다. 헬름홀츠(Hermann von Helmholtz)는 1863년 『음악 이론의 생리학적 기초로서의 음 감각론』에서 두 악기의 소리 차이를 배음(기본 음의 정수배 주파수로 떠는 물결)들의 세기 차이로 설명했다. 그런데 이 설명을 시험하려면 한 음 안에 섞인 약한 배음을 귀로 하나씩 가려 들어야 했다. 그는 그 일이 이전에는 잘 훈련된 음악가의 귀로 애써 주의를 기울여야만 가능했고, 많은 물리학자와 음악가조차 끝내 해내지 못했다고 적었다(이 대목과 아래 공명기 대목은 1877년 독일어 4판을 옮긴 엘리스의 영어 번역판에서 옮겼고, 1863년 초판의 문장과는 대조하지 않았다).

헬름홀츠가 내놓은 도구는 공명기였다. 유리나 금속으로 만든 속이 빈 공이나 관에 구멍이 둘 있는데, 하나는 날카로운 테두리로 소리를 받고, 다른 하나는 깔때기 꼴로 귀에 꽂는다. 그는 귀에 꽂는 쪽에 녹인 봉랍을 바르고, 손가락을 데지 않을 만큼 식었을 때 귀 입구에 눌러 모양을 떴다고 적었다. 한쪽 귀를 막고 다른 귀에 공명기를 대면 주변의 소리는 대부분 크게 줄어드는데, 공명기의 고유한 음이 울리면 그 음이 「귀 안으로 아주 세차게 울려 들어온다」. 그래서 음악에 귀가 없는 사람도 많은 소리 가운데서 약한 음 하나를 골라 들을 수 있었고, 바람 소리나 마차 바퀴 소리, 물 튀는 소리에서도 그 음이 들려왔다고 한다. 공이 클수록 낮은 음에 울렸으므로, 크기를 차례로 맞춘 공명기 한 벌이 한 음 안의 배음들을 하나씩 짚는 도구가 되었다. 공명기 하나는 한 주파수의 물결만 크게 키우는 필터였다.

1870년의 헬름홀츠 공명기 한 벌(글래스고 헌터리언 박물관). 꼭지를 귀에 꽂는다. 공이 클수록 낮은 음에 울린다. 사진: Stephencdickson, Wikimedia Commons, CC BY-SA 4.0
1870년의 헬름홀츠 공명기 한 벌(글래스고 헌터리언 박물관). 꼭지를 귀에 꽂는다. 공이 클수록 낮은 음에 울린다. 사진: Stephencdickson, Wikimedia Commons, CC BY-SA 4.0

흐림에 물결을 넣어 보기

칸 16개 고리에 cos 물결을 넣고 흐림(¼, ½, ¼)을 걸어 보자. 고리를 두 번 도는 물결(k = 2, 한 칸에 45°씩 돈다)은 모양 그대로 높이만 0.854배가 되고, 여섯 번 도는 물결(k = 6, 한 칸에 135°)은 0.146배가 된다. cos 물결은 반대로 도는 두 화살표 eiωn과 e−iωn의 평균이고, 대칭인 흐림 합성곱 커널은 두 화살표에 같은 실수를 곱하므로 cos 물결도 그 실수배로 커지거나 작아진다.

칸 16개 고리에서 물결 k = 2 와 k = 6 을 흐림(¼, ½, ¼)에 넣은 것. 보라 점은 입력, 초록 막대는 흐린 뒤(s4_freqresp.py, figs.py)
칸 16개 고리에서 물결 k = 2 와 k = 6 을 흐림(¼, ½, ¼)에 넣은 것. 보라 점은 입력, 초록 막대는 흐린 뒤(s4_freqresp.py, figs.py)

이 배율은 칸 수와 상관없이 한 칸에 도는 각도만으로 정해진다. 합성곱 커널 (¼, ½, ¼)에 한 칸에 각도 ω(오메가)씩 도는 화살표를 넣으면, 출력은 입력 화살표에 ¼ eiω + ½ + ¼ e−iω = ½ + ½ cos ω를 곱한 것이다. ω = 0°이면 1, 45°이면 0.854, 90°이면 0.5, 135°이면 0.146, 180°이면 0이다. 일반적으로 쓰면 다음과 같다.

H(ω)=∑mh[m] e−iωm,cos⁡(ωn)  ⟼  ∣H(ω)∣ cos⁡ ⁣(ωn+arg⁡H(ω))\textcolor{#4c5d80}{H}(\textcolor{#0078e1}{\omega}) = \sum_{\textcolor{#a67a63}{m}} \textcolor{#4c5d80}{h}[\textcolor{#a67a63}{m}]\, e^{-i\textcolor{#0078e1}{\omega}\textcolor{#a67a63}{m}}, \qquad \cos(\textcolor{#0078e1}{\omega}\textcolor{#a67a63}{n}) \;\longmapsto\; |\textcolor{#4c5d80}{H}(\textcolor{#0078e1}{\omega})|\,\cos\!\big(\textcolor{#0078e1}{\omega}\textcolor{#a67a63}{n} + \arg \textcolor{#4c5d80}{H}(\textcolor{#0078e1}{\omega})\big)
H(ω)주파수 응답: 한 칸에 ω 씩 도는 물결에 곱해지는 복소수ω오메가: 물결이 한 칸에 도는 각도 (고리 위 물결 k 이면 2πk/N)h[m]거리 m 의 이웃에 곱하는 합성곱 커널 무게 (실수)∣H∣, arg⁡H물결의 높이 배율, 물결이 밀리는 각도n, m칸 번호, 거리\begin{array}{ll} \textcolor{#4c5d80}{H}(\textcolor{#0078e1}{\omega}) & \text{주파수 응답: 한 칸에 } \omega \text{ 씩 도는 물결에 곱해지는 복소수} \\ \textcolor{#0078e1}{\omega} & \text{오메가: 물결이 한 칸에 도는 각도 (고리 위 물결 } k \text{ 이면 } 2\pi k/N\text{)} \\ \textcolor{#4c5d80}{h}[\textcolor{#a67a63}{m}] & \text{거리 } m \text{ 의 이웃에 곱하는 합성곱 커널 무게 (실수)} \\ |\textcolor{#4c5d80}{H}|,\ \arg \textcolor{#4c5d80}{H} & \text{물결의 높이 배율, 물결이 밀리는 각도} \\ \textcolor{#a67a63}{n},\ \textcolor{#a67a63}{m} & \text{칸 번호, 거리} \end{array}

필터가 한 칸에 각도 ω씩 도는 물결에 곱하는 복소수 H(ω)를 주파수 응답 (필터가 물결마다 곱하는 배율 / frequency response)이라 한다. 고리 위의 고윳값 H[k]는 이 곡선을 ω = 2πk/N 자리에서 읽은 값이다. 크기 |H|는 물결을 몇 배로 키우는지, 각도 arg H는 물결을 얼마나 미는지 알려 준다.

곡선을 그려 보면 필터의 성격이 한눈에 보인다. 흐림은 ω = 0에서 1이고 180°로 갈수록 0으로 내려가므로 느린 물결만 남긴다. 차분 (1, −1)은 |H| = 2|sin(ω/2)|로 거꾸로 평탄한 신호를 지우고 칸마다 뒤집히는 물결을 두 배로 키운다. 헬름홀츠의 공명기를 칸으로 흉내 내면, 한쪽으로만 이어지는 합성곱 커널 h[m] = 0.9m cos(2πm/8)(m = 0 … 39)처럼 「한 번 두드리면 주기 8칸으로 울리다 잦아드는 응답」이 된다. 이 합성곱 커널의 |H|는 ω = 45.3°(주기 7.95칸)에서 5.21로 솟고, 꼭대기의 절반을 넘는 폭은 35.5°에서 56.8°까지다. 합성곱 커널을 m = 0 … 399로 길게 이어 두고 견주면, 0.9일 때 꼭대기 5.29·폭 21.0°이고, 0.97로 바꿔 더 오래 울리게 하면 꼭대기는 16.9로 높아지고 폭은 6.0°로 좁아진다. 오래 울리는 공명기일수록 더 좁은 주파수 대역만 골라 키운다.

주파수 응답 |H(ω)|. 왼쪽: 흐림(¼, ½, ¼), 점은 물결 k = 2, 6 (칸 16)의 배율. 가운데: 차분(1, −1). 오른쪽: 주기 8칸으로 울리다 잦아드는 공명기 흉내 합성곱 커널(s4_freqresp.py, figs.py)
주파수 응답 |H(ω)|. 왼쪽: 흐림(¼, ½, ¼), 점은 물결 k = 2, 6 (칸 16)의 배율. 가운데: 차분(1, −1). 오른쪽: 주기 8칸으로 울리다 잦아드는 공명기 흉내 합성곱 커널(s4_freqresp.py, figs.py)
직접 움직여 보기물결 하나를 넣으면새 창에서 열기 ↗

ML에서: 위너 필터는 물결마다 곱하는 배율이다

노이즈 섞인 신호에서 원래 신호를 가장 잘 짐작하는 문제를 생각하자. 신호의 통계가 자리를 옮겨도 같고 노이즈도 그렇다면, 제곱 오차를 가장 작게 하는 선형 디노이징 연산은 그 자체로 선형 시불변 필터이고, 물결마다 곱하는 배율은 신호와 노이즈의 세기만으로 정해진다. 위너 필터다.

H(k)=P(k)P(k)+σ2\textcolor{#4c5d80}{H}(\textcolor{#0078e1}{k}) = \frac{\textcolor{#a000c8}{P}(\textcolor{#0078e1}{k})}{\textcolor{#a000c8}{P}(\textcolor{#0078e1}{k}) + \textcolor{#1f6066}{\sigma}^2}
H(k)물결 k 에 곱하는 복원 배율 (위너 필터의 주파수 응답)P(k)원래 신호의 물결 k 세기 (파워 스펙트럼)σ2시그마 제곱: 노이즈의 세기 (물결마다 같다)\begin{array}{ll} \textcolor{#4c5d80}{H}(\textcolor{#0078e1}{k}) & \text{물결 } k \text{ 에 곱하는 복원 배율 (위너 필터의 주파수 응답)} \\ \textcolor{#a000c8}{P}(\textcolor{#0078e1}{k}) & \text{원래 신호의 물결 } k \text{ 세기 (파워 스펙트럼)} \\ \textcolor{#1f6066}{\sigma}^2 & \text{시그마 제곱: 노이즈의 세기 (물결마다 같다)} \end{array}

신호 세기가 굵은 무늬일수록 큰 P(k) = 100/k²이고 노이즈 세기가 σ² = 1이면, 배율은 k = 1에서 0.990, k = 5에서 0.8, k = 10에서 0.5, k = 20에서 0.2다. 신호가 노이즈보다 센 물결은 살리고 약한 물결은 지운다. 결국 대칭이 축(물결)을 고르고, 데이터의 파워 스펙트럼이 축마다의 배율을 고른다. 디퓨전 모델의 디노이저(노이즈 섞인 그림을 받아 원래 그림을 짐작하는 신경망)는 이보다 훨씬 복잡한 비선형 함수지만, 그림 분포를 정규분포로 근사하면 이 배율이 가장 좋은 디노이저가 된다.

문제 10. 손뼉 한 번으로 방 알기

작은 방에서 손뼉을 한 번 치면 지금 크기 1의 소리, 0.1초 뒤 크기 0.5의 메아리가 들린다(그 뒤는 무시한다). 칸 하나를 0.01초로 잡으면 이 방의 칸 하나 응답은 「칸 0 에 1, 칸 10 에 0.5」다. (가) 이 방에서 주기 0.1초인 음을 부르면 크기가 몇 배로 들리는가? (나) 주기 0.2초인 음은? (다) 주기 0.4초인 음은? 이 방에서 크게 울리는 음과 죽는 음의 규칙을 말하라. (위젯 4의 「문제 10 불러오기」로 확인해 보자.)

김민준 M01
김민준

메아리가 더해지니까 어느 음이든 1.5배겠죠. 1 + 0.5요.

선생님 T01
선생님

주기 0.2초인 음에서, 0.1초 전 소리는 지금 소리와 비교해 어떤 상태죠?

김민준 M04
김민준

반 주기 전이니까 뒤집혀 있어요. 메아리가 지금 소리를 깎아서 1 − 0.5 = 0.5배네요. 주기 0.1초는 딱 한 주기 전이라 같은 모양이 더해져서 1.5배고요. 어느 음이든 같은 게 아니었어요.

이서연 S01
이서연

(다)는 0.1초가 4분의 1 주기라 메아리가 90° 어긋나. 화살표로 보면 1과 0.5i의 합이니까 크기가 √(1 + 0.25) = 1.118배야.

선생님 T01
선생님

세 음을 나란히 놓고 보면, 어떤 음이 1.5배가 되죠?

이서연 S07
이서연

0.1초 전이 딱 한 주기의 정수배인 음이요. 주파수 응답으로 쓰면 |1 + 0.5 e−iω·10|이고, ω × 10칸이 360°의 배수인 음, 주기가 0.1초, 0.05초, …처럼 0.1초를 정수로 나눈 음이 1.5배예요.

김민준 M01
김민준

그 사이에 반 바퀴 어긋나는 음은 0.5배고요.

선생님 T13
선생님

그래요. 손뼉 한 번의 응답이 모든 음의 운명을 정했어요. 칸 하나 응답이 연산 전체를 정한다는 걸 귀로 들은 거예요.

김민준 M07
김민준

화장실에서 노래하면 어떤 음만 유난히 웅웅 울리던 게 이거였네요. 그 음이 화장실의 공명기였어요.

문제 11. 두 칸 평균은 물결을 민다

칸 16개 고리에서 두 칸 평균 y[n] = ½ x[n] + ½ x[n−1] 을 본다. (가) 주파수 응답 H(ω) 를 구하고, |H| 가 cos(ω/2) 임을 보여라. (나) 물결 k = 4 (한 칸에 90°) 를 넣으면 출력은 어떻게 되는가? 높이와 밀린 양을 구하라. (다) 마찬가지로 이웃을 평균 내는 대칭 합성곱 커널 (¼, ½, ¼) 에서는 물결이 밀리는가? 왜 그런가? (위젯 4의 「문제 11 불러오기」로 확인해 보자.)

이서연 S01
이서연

(가)는 H(ω) = ½ + ½ e−iω야. 크기가 cos가 되려면 eiω/2와 e−iω/2가 짝지어 나와야 할 것 같은데… e−iω/2를 묶어 내 볼게. 그러면 e−iω/2 × ½(eiω/2 + e−iω/2) = e−iω/2 cos(ω/2)라서 |H| = cos(ω/2), 각도는 −ω/2야.

김민준 M01
김민준

(나)는 cos(π/4) = 0.7071배요. 출력은 (0.5, 0.5, −0.5, −0.5, 0.5, 0.5, …)예요. 입력 (1, 0, −1, 0, 1, …)보다 작아지고 모양이… 계단처럼 됐는데요. 물결이 깨진 거 아니에요?

선생님 T01
선생님

0.7071 cos(90° × (n − ½))를 칸마다 계산해 봐요.

김민준 M05
김민준

n = 0이면 0.7071 × cos(−45°) = 0.5, n = 1이면 0.7071 × cos(45°) = 0.5, n = 2면 −0.5… 똑같아요. 깨진 게 아니라 반 칸 밀린 물결을 칸에서 잰 거였어요. 각도 −45°가 반 칸 늦어짐이고요.

이서연 S01
이서연

다른 물결도 반 칸일까? k = 2에서 해 보면 각도 −22.5°, 늦어짐 0.5칸이야. 같네.

김민준 M03
김민준

왜 늘 반 칸이야?

이서연 S07
이서연

두 칸의 한가운데가 칸 n − ½니까, 평균이 칸 n − ½ 의 값을 내놓는 거야.

선생님 T01
선생님

(다)의 (¼, ½, ¼)는요?

이서연 S01
이서연

자기 자리를 가운데로 양쪽이 같으니까 H = ½ + ½ cos ω가 실수예요. k = 4에서 0.5, 각도 0이라 밀리지 않아요.

선생님 T13
선생님

그래요. 합성곱 커널이 자기 자리를 중심으로 좌우 대칭이면 주파수 응답이 실수라서 물결을 밀지 않아요. 한쪽으로 치우친 합성곱 커널은 그 치우친 만큼 물결을 늦춰요.

이서연 S11
이서연

수업에서 우함수(좌우 대칭인 함수)의 푸리에 변환은 실수라고 외웠는데, 그게 「밀지 않는다」는 뜻이었어.

문제 12. 노이즈가 커질수록 남는 물결

신호 세기 P(k) = 100/k² (k = 1, 2, …, 64) 에 세기 σ² 의 노이즈가 섞였다. 위너 배율 P/(P + σ²) 로 복원한다. (가) σ² = 0.25, 4, 100 일 때 배율이 ½ 이상인 물결은 k 가 얼마까지인가? (나) σ² = 4 에서 k = 1 과 k = 10 의 배율은? (다) 칸 128개 고리에서 흐림(¼, ½, ¼)으로 노이즈를 줄인다면, 배율 ½ 이상인 물결 수는 σ² 에 따라 어떻게 바뀌는가? 디퓨전 모델이 노이즈 크기마다 다른 복원을 배워야 하는 이유와 이어서 말하라.

김민준 M01
김민준

배율이 ½이 되는 건 P = σ²일 때니까, 100/k² = σ²에서 k = √(100/σ²)요. σ² = 0.25면 k ≤ 20, 4면 k ≤ 5, 100이면 k = 1 하나요.

이서연 S01
이서연

(나)는 σ² = 4에서 k = 1이 0.9615, k = 10이 0.2000이야. 노이즈가 커지면 굵은 무늬 몇 개만 믿을 만해서 나머지는 거의 지워.

선생님 T01
선생님

(다)의 흐림은요?

김민준 M04
김민준

흐림 배율 ½ + ½ cos(2πk/128)이 ½ 이상인 건 k ≤ 32, 서른두 개요. 그런데 σ²가 식에 아예 없어요. 노이즈가 작든 크든 똑같이 서른두 개를 남겨요.

이서연 S08
이서연

그러면 노이즈가 작을 때는 살려도 될 k = 33 이상의 무늬까지 깎고, 노이즈가 클 때는 지워야 할 k = 6 … 32의 노이즈를 남겨.

선생님 T01
선생님

(가)에서 구한 경계와 견줘 보면요?

이서연 S01
이서연

가장 좋은 배율은 노이즈 크기에 따라 경계가 k = 20에서 5, 1로 움직이니까, 필터 하나로는 모든 노이즈 크기를 맞출 수 없어요.

선생님 T13
선생님

그래요. 그래서 디퓨전 모델의 디노이저는 노이즈 크기를 입력으로 받아요. 노이즈가 클 때는 굵은 무늬만, 작아질수록 가는 무늬까지 살리는 복원을 한 신경망 안에서 바꿔 가며 해야 하거든요.

김민준 M11
김민준

흐릿한 시험지 사진을 받을 때 글씨가 크면 다 읽고, 많이 흐리면 제목만 읽는 것처럼요. 흐린 정도를 알아야 어디까지 믿을지 정하죠.