REMI Lab강의 노트

Signals and Systems L07

7장 이산시간 시스템의 푸리에 해석

DFT: 회전과의 내적

샘플 NN개가 있을 때, 그 안에 어떤 속도의 회전이 얼마나 들어 있는지 어떻게 잴까? 4장에서는 신호에 들어 있는 성분을 그 성분과의 내적으로 쟀다. DFT는 같은 계산을 샘플 NN개에 쓴다.

샘플 N개와 회전 N개

DTFT는 수열을 더해 주파수가 연속인 함수를 내놓는다. 여기서 컴퓨터가 가진 것은 샘플 NN개이다. DFT는 이 기록이 한 주기(시간으로 NTsNT_s)로 반복된다고 보고 유도한다.

샘플 NN개가 되풀이된다면 그 안의 회전도 NN샘플 뒤에 처음 자리로 돌아와야 한다. 그렇지 않으면 한 주기가 끝나고 다음 주기가 시작하는 이음매에서 페이저가 갑자기 튄다. 그래서 쓸 수 있는 회전은 NN샘플 동안 정확히 정수 바퀴를 도는 회전뿐이다. NN샘플 동안 kk바퀴를 도는 회전은 샘플마다 Ωk=2πk/N\Omega_k=2\pi k/N씩 돈다. k=0,1,…,N−1k=0,1,\ldots,N-1로 서로 다른 회전이 NN개 있다(k=Nk=N은 k=0k=0과 같은 수열이다).

ek[n]=ej2πkn/N,n=0,1,…,N−1e_k[n]=e^{j2\pi kn/N},\qquad n=0,1,\ldots,N-1

eke_k는 앞 절의 ejΩne^{j\Omega n}에서 Ω\Omega를 Ωk\Omega_k로 둔 것이다. 주기 2π2\pi인 Ω\Omega 축을 NN개 점으로 나눈 것과 같다.

내적으로 재기

4장에서 복소 신호의 내적은 둘째 신호에 켤레를 붙여 곱하고 적분한 값이었다. 수열에서는 적분 대신 합을 쓴다. 입력 x[n]x[n]과 회전 ek[n]e_k[n]의 내적이 이산 푸리에 변환(discrete Fourier transform, DFT)이다.

X[k]=∑n=0N−1x[n] ek[n]‾=∑n=0N−1x[n] e−j2πkn/N\begin{aligned} X[k]&=\sum_{n=0}^{N-1}x[n]\,\overline{e_k[n]}\\ &=\sum_{n=0}^{N-1}x[n]\,e^{-j2\pi kn/N} \end{aligned}

지표가 둘이다. nn은 시간 지표, kk는 주파수 지표이고, 둘 다 0,1,…,N−10,1,\ldots,N-1이다. NN은 샘플 수이다. 켤레 때문에 지수의 부호가 음수가 되고, DFT에서 곱하는 기준 회전은 시계 방향으로 돈다.

내적이 왜 성분을 재는지는 입력이 회전 하나일 때 보인다. x[n]=em[n]x[n]=e_m[n]이면 곱은 x[n]ek[n]‾=ej2π(m−k)n/Nx[n]\overline{e_k[n]}=e^{j2\pi(m-k)n/N}이다. k=mk=m이면 곱이 모두 1이라 X[m]=NX[m]=N이다. k≠mk\ne m이면 단위원의 같은 자리를 반복해서 지날 수도 있지만 합은 0이다. 공비를 r=ej2π(m−k)/Nr=e^{j2\pi(m-k)/N}로 두면 rN=1r^N=1, r≠1r\ne1이므로 등비수열의 합은

X[k]=∑n=0N−1rn=1−rN1−r=0X[k]=\sum_{n=0}^{N-1}r^n=\frac{1-r^N}{1-r}=0

이다. 그래서 X[k]X[k]는 입력에 회전 eke_k가 얼마나 들어 있는지를 잰다. 서로 다른 두 회전의 내적이 0이라는 이 성질이 직교이다.

기록을 주기적으로 반복해서 보든 기록 밖을 0으로 두든, DFT는 같은 NN개 값만 합하므로 X[k]X[k]는 같다. 기록 밖을 0으로 둔 수열의 DTFT를 X0(Ω)X_0(\Omega)라고 하면

X0(Ωk)=∑n=0N−1x[n]e−jΩkn=∑n=0N−1x[n]e−j2πkn/N=X[k]X_0(\Omega_k)=\sum_{n=0}^{N-1}x[n]e^{-j\Omega_k n} =\sum_{n=0}^{N-1}x[n]e^{-j2\pi kn/N}=X[k]

이다. DFT 값은 이 DTFT 곡선 위의 점이다. 한편 뒤에서 구할 역 DFT(IDFT)의 기저는 ej2πk(n+N)/N=ej2πkn/Ne^{j2\pi k(n+N)/N}=e^{j2\pi kn/N}이므로, 복원식을 기록 밖까지 이어 쓰면 NN샘플마다 반복된다. 그래서 주기적으로 보는 해석도 자연스럽다.

X[k]X[k]는 n=0n=0부터 곱을 한 항씩 더해 얻는다. 입력이 실수이면 곱 p[n]=x[n]e−jθnp[n]=x[n]e^{-j\theta_n}(θn=2πkn/N\theta_n=2\pi kn/N)은 실수 곱 두 번이다. 실수부는 x[n]cos⁡θnx[n]\cos\theta_n, 허수부는 −x[n]sin⁡θn-x[n]\sin\theta_n이다. 복소평면에서 새 곱을 앞 곱의 끝에 이어 붙이면 마지막 끝점이 X[k]X[k]이다. 아래 그림의 계산 표에는 더한 샘플마다 x[n]x[n], Re p[n]p[n], Im p[n]p[n]과 두 누적합이 한 줄씩 남고, θn\theta_n이 2π2\pi 이상이면 2π2\pi의 정수배를 뺀 값(0≤θn<2π0\le\theta_n<2\pi)을 ≡ 뒤에 함께 적는다.

N = 8이고 입력은 한 주기의 코사인 x[n] = cos(2πn/8)이며, ①의 점 (n, cos θₙ, −sin θₙ)이 바닥과 뒷벽에 진 투영이 ②의 두 줄 cos θₙ(파랑)과 −sin θₙ(보라), ③의 파랑·보라 막대가 지금까지 더한 ΣRe와 ΣIm이다. ②의 세로 한 줄이 샘플 하나이고(넓은 화면에서는 x[n] 스템 옆에 샘플값을 적는다), 값은 반올림한 수로 이어서 계산하므로 정확한 값과 끝자리가 조금 다를 수 있다.

해 보기

  1. k=1k=1에서 n=3n=3까지 더한 끝점이 어디에 있는지, Re p[n]과 Im p[n]이 어떻게 쌓이는지 확인하라.
    관찰

    p[0]p[0]부터 p[3]p[3]까지 이어 붙인 끝이 실수축 위 2에 있다. p[2]=0p[2]=0이라 보이는 화살표는 세 개다. k=1k=1에서는 x[n]x[n]과 cos⁡θn\cos\theta_n이 같은 수열이라 Re p[n] =cos⁡2θn=\cos^2\theta_n은 모두 0 이상이고, Im p[n] 줄은 −0.5와 +0.5가 번갈아 나와 서로 지운다. 계산 표의 ΣRe는 1, 1.5, 1.5, 2로 쌓인다.

  2. k=2k=2에서 n=7n=7까지 모두 더하면 X[2]X[2]가 얼마인지 확인하라.
    관찰

    화살표가 직사각형을 그리며 원점으로 돌아온다. X[2]=0X[2]=0이고, 입력에 k=2k=2의 회전은 없다.

  3. k=7k=7에서 n=7n=7까지 모두 더한 화살표의 모양과 끝점을 k=1k=1과 비교하라.
    관찰

    기준이 반대 방향으로 돈다. −sin θₙ 줄의 부호가 k=1k=1일 때와 모두 반대이고 Re p[n]은 그대로라서, 화살표는 k=1k=1의 모양을 실수축에 대해 뒤집은 채 같은 끝점 4에 멈춘다. X[7]=4X[7]=4이다.

bin과 물리 주파수

X[k]X[k] 하나가 차지하는 주파수 자리를 bin(주파수 bin)이라고 한다. bin kk의 회전은 샘플마다 2πk/N2\pi k/N을 돌고, 1초에 샘플이 fsf_s개 있다. 그래서 bin kk는 물리 주파수 fk=k fs/Nf_k=k\,f_s/N(Hz)에 해당하고, 주파수 간격은 Δf=fs/N\Delta f=f_s/N이다.

k>N/2k>N/2인 bin은 음의 주파수 (k−N)fs/N(k-N)f_s/N에 해당한다. 앞 절에서 본 대로 2π−Ω2\pi-\Omega는 −Ω-\Omega와 같은 회전이기 때문이다. NN이 짝수이면 k=N/2k=N/2는 따로 본다. 이 bin에서는 +fs/2+f_s/2와 −fs/2-f_s/2가 같은 샘플을 준다.

이 장의 X[k]X[k]는 NN으로 나누지 않은 값이다. X[0]X[0]은 샘플의 합이고 평균은 X[0]/NX[0]/N이다. 진폭 1인 복소 지수가 bin kk에 정확히 놓이면 ∣X[k]∣=N|X[k]|=N이고, 진폭 1인 코사인은 kk와 N−kN-k에 N/2N/2씩 나뉜다.

예를 들어 cos⁡(πn/8)\cos(\pi n/8)은 16개 샘플마다 되풀이된다. N=16N=16으로 한 주기를 DFT 하면 cos⁡(2π⋅1⋅n/16)\cos(2\pi\cdot1\cdot n/16)이므로 X[1]=X[15]=8X[1]=X[15]=8이고 나머지 bin은 0이다. FFT는 같은 DFT 값을 더 적은 계산으로 구하는 알고리즘이다.

실수 신호와 복소 신호

위 그림의 코사인은 bin 1에서 4를 주었는데, bin 7에서도 똑같이 4를 준다. 주파수가 하나뿐인 신호가 왜 두 bin에 서고, 복소 톤이면 어떻게 될까?

4장의 Euler 공식을 샘플에 쓰면 이유가 보인다. bin kk의 코사인은 반대로 도는 두 회전의 합이다.

cos⁡(2πkn/N)=ek[n]+eN−k[n]2\cos(2\pi kn/N)=\frac{e_k[n]+e_{N-k}[n]}{2}

eN−k[n]=e−j2πkn/Ne_{N-k}[n]=e^{-j2\pi kn/N}은 eke_k와 같은 속도로 반대 방향으로 도는 회전이다. 그래서 진폭 1인 코사인은 bin kk와 bin N−kN-k에 N/2N/2씩 선다. 복소 톤 ek[n]e_k[n]은 한 방향으로만 도는 회전 하나라서 bin kk 한 곳에만 NN이 선다. 4장('복소 지수의 회전')에서도 φ = 0일 때 f의 부호를 바꾸면 점이 반대로 돌고, 코사인 투영은 그대로인 채 사인 투영의 부호만 바뀌었다. 코사인만 보아서는 도는 방향을 알 수 없다.

입력이 실수이면 두 bin의 값은 켤레이다. bin N−kN-k의 회전은 bin kk의 회전과 같은 속도로 반대 방향으로 돌고, 실수 x[n]x[n]은 켤레를 취해도 그대로이기 때문이다.

X[N−k]=∑n=0N−1x[n] ej2πkn/N=∑n=0N−1x[n] e−j2πkn/N‾=X[k]‾\begin{aligned} X[N-k]&=\sum_{n=0}^{N-1}x[n]\,e^{j2\pi kn/N}\\ &=\overline{\sum_{n=0}^{N-1}x[n]\,e^{-j2\pi kn/N}}=\overline{X[k]} \end{aligned}

따라서 ∣X[N−k]∣=∣X[k]∣|X[N-k]|=|X[k]|이다. X[0]X[0]과 (NN이 짝수일 때) X[N/2]X[N/2]는 실수이다. 첫째 줄에서 둘째 줄로 넘어갈 때 x[n]‾=x[n]\overline{x[n]}=x[n]을 썼으므로, 입력이 복소수이면 이 대칭은 성립하지 않는다. 6장에서 연속 신호의 대칭 X(−f)=X(f)‾X(-f)=\overline{X(f)}가 허수부가 언제나 0인 신호에서만 성립한 것과 같은 이유이다.

N = 8, fₛ = 8 Hz, f = 1 Hz이고, 가로축은 bin k를 주파수 k·fₛ/N(k > N/2이면 (k − N)fₛ/N)으로 바꾼 것, 스템은 X[k]의 실수부(파랑)와 허수부(보라)이다. 그림 아래 줄은 붉은 점으로 표시한 bin 1의 값 X[1]과 그 크기, 위상이다.

해 보기

  1. 1 Hz 코사인 입력의 DFT에서 값이 서는 bin과 크기를 확인하라.
    관찰

    +1 Hz(bin 1)와 −1 Hz(bin 7)에 4씩 선다.

  2. 1 Hz 사인 입력의 DFT에서 bin 1과 bin 7의 값을 비교하라.
    관찰

    bin 1은 −j4, bin 7은 +j4로 서로 켤레이다. 크기는 둘 다 4이다.

  3. 1 Hz 복소 지수 ej2πte^{j2\pi t} 입력의 DFT에서 값이 서는 bin을 확인하고, 켤레 짝이 있는지 보라.
    관찰

    +1 Hz(bin 1)에 8 하나만 선다. 복소 입력에는 켤레 짝이 없다.