21
Python 과 함께 배우는 신호 해석 박섭형 이산 푸리에 변환 이산 푸리에 변환의 성질 Python과 함께 배우는 신호 해석 11 강. 이산 푸리에 변환 (4 장. 이산시간 주기 신호의 주파수 성분 분석: 이산 푸리에 급수) 박섭형 한림대학교 전자공학과 한림대학교 박섭형 Python과 함께 배우는 신호 해석 11 강. 이산 푸리에 변환 1

Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

  • Upload
    others

  • View
    11

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

Python과 함께 배우는 신호 해석

제 11 강. 이산 푸리에 변환

(제 4 장. 이산시간 주기 신호의 주파수 성분 분석: 이산 푸리에 급수)

박섭형

한림대학교 전자공학과

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 1

Page 2: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

배울 내용

이산 푸리에 변환의 기본 개념

직교 정규 기저 벡터를 이용한 실벡터의 표현

직교 정규 기저 벡터의 변경

직교 정규 기저 벡터를 이용한 복소벡터의 표현

이산 푸리에 급수

이산 푸리에 급수의 성질

이산 푸리에 변환

이산 푸리에 변환의 성질

Python을 이용한 이산 푸리에 변환 계산

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 2

Page 3: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

이산 푸리에 변환

이산시간 푸리에 급수: 이산시간 주기 신호의 한 주기에 해당하는 신호의주파수 성분을 분석할 수 있는 변환

우리가 다루게 될 대부분의 신호들은 주기 신호가 아닌 비주기 신호

이산시간 푸리에 변환이산시간 비주기 신호의 주파수 성분을 분석하기 위한 변환주파수 영역에서 연속 신호이므로 디지털 컴퓨터에서 계산을 하기 위해서는주파수 영역에서 샘플링 필요

이산 푸리에 변환이산시간 비주기 신호의 주파수 성분을 분석하기 위한 변환주파수 영역에서 이산 신호

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 3

Page 4: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

이산 푸리에 변환

0 ≤ n < N 이외의 구간에서 0인 유한길이 신호 x[n]이 있다고 가정하자.x[n]으로부터 다음과 같이 주기 신호 x̃[n]를 만들 수 있다.

x̃[n] =∞∑

p=−∞

x[n − pN]. (4.73)

예를 들어서, x[n]이 그림 4.1의 (a)와 같이 주어진 경우에 x[n]을 한 주기신호로 갖는 주기 신호는 그림 (b)와 같이 구성할 수 있다.

10 0 10 20Index n

012345

x[n]

10 0 10 20Index n

012345

x̃[n]

(a) x[n], (b) x̃[n].

그림 4.1: 유한길이 신호 x[n]과 x[n]을 한 주기 신호로 갖는 이산시간 주기 신호 x̃[n]의 예.한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 4

Page 5: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

이산 푸리에 변환

여기에서 x̃[n]의 DFS를 X̃[k]라고 하면, x[n]의 이산 푸리에 변환 (DFT)는다음과 같이 X̃[k]의 한 주기 신호로 정의한다.

정의 4.1 (이산 푸리에 변환과 역 이산 푸리에 변환)

이산 푸리에 변환(DFT: discrete Fourier transform): 길이가 N인 유한 길이이산시간 신호 x[n],n = 0, 1, · · · ,N − 1,의 이산 푸리에 변환 X[k]는 다음과 같이정의된다.

X[k] =N−1∑n=0

x[n]e−j 2πN nk, k = 0, 1, · · · ,N − 1. (4.74)

역 이산 푸리에 변환(Inverse DFT)

x[n] = 1

N

N−1∑k=0

X[k]ej 2πN kn,n = 0, 1, · · · ,N − 1. (4.75)

DFT와 IDFT의 정의 식은 앞에서 배웠던 DFS와 IDFS의 식과 동일하다.단지, 비주기 유한 길이 신호 x[n]을 주기 신호 x̃[n]의 한 주기로 간주하고주기 신호의 DFS를 구해서 한 주기 결과만을 사용하는 것이다.

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 5

Page 6: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

이산 푸리에 변환

연습 문제 4.4주기가 N인 이산시간 주기 신호 x̃[n]의 한 주기 동안의 신호를 모아 이산시간푸리에 변환한 결과를 X[k]라고 하자. x[n], 0 ≤ n < N의 물리적인 의미는 시간영역에서 n 번째 샘플이다. X[k], 0 ≤ k < N의 물리적인 의미를 설명하라.

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 6

Page 7: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

이산 푸리에 변환의 성질: 선형성

이산 푸리에 변환은 선형 변환이며, 중첩 특성을 가진다.

F{ax1[n] + bx2[n]} = aX1[k] + bX2[k]. (4.76)

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 7

Page 8: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

시간 반전 신호의 이산 푸리에 변환의 성질

0 ≤ n < N의 범위에 존재하는 길이가 N인 신호 x[n]을 y 축에 대해서 반전신호 x[−n]는 −N < n ≤ 0의 범위에서 그 신호가 존재한다. 따라서 두신호를 동일한 범위에서 DFT하는 것은 불가능하다.

두 신호를 동일한 범위에 존재하도록 만들기 위해서 다음과 같이 정의되는순환 반전을 사용한다.

x[⟨−n⟩N] =

x[0], n = 0

x[N − n], 1 ≤ n ≤ N − 1(4.77)

순환 반전은 x[n]을 한 주기로 하는 x̃[n]을 시간 반전한 신호를 x[n]의 원래구간에 해당하는 신호만을 추출하는 연산이다.

x[n] = {x[0], x[1], x[2], · · · , x[6], x[7]}. (4.78)

x[⟨−n⟩8] = {x[0], x[7], x[6], · · · , x[2], x[1]}. (4.79)

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 8

Page 9: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

시간 반전 신호의 이산 푸리에 변환의 성질

Python에서 순환 반전 신호의 인덱스를 계산할 때는 -n % N을 사용한다.

>>> for n in range(-4,5):... print n, n%3...-4 2-3 0-2 1-1 20 01 12 23 04 1>>>

n % N의 결과는 n을 다음과 같이 표현할 때의 r과 같은 것을 알 수 있다.

n = mN + r. (4.80)

단, r은 0 ≤ r < N인 정수이다.한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 9

Page 10: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

시간 반전 신호의 이산 푸리에 변환의 성질

Python을 이용하여 유한길이 신호 x[n]을 회전 대칭 이동시킨 신호 x[⟨−n⟩8]을구하는 방법을 다음 스크립트를 통해서 살펴 보자.

import numpy as npimport matplotlib.pyplot as pltxn = np.array([1,3,5,5,5,6,7,3])n = np.arange(8)xncs = xn[ -n % 8]plt.subplot(121)plt.stem(n, xn)plt.title("$x[n]$")plt.xlabel("index $n$")plt.subplot(122)plt.stem(n, xncs)plt.title("$x([n])_8$")plt.xlabel("index $n$")plt.tight_layout()plt.show()

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 10

Page 11: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

시간 반전 신호의 이산 푸리에 변환의 성질

이 스크립트를 실행하면 다음 그래프를 얻을 수 있다. 두 그래프를 비교하면서순환 시간 반전의 결과를 이해해 보자

0 1 2 3 4 5 6 7index n

210123

x[n]

0 1 2 3 4 5 6 7index n

210123

x[⟨−n⟩

8 ]

(a) x[n], (b) x[⟨−n⟩8].

그림 4.2: 유한길이 신호 x[n]과 x[n]을 회전 대칭 이동시킨 신호 x[⟨−n⟩8]의 예.

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 11

Page 12: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

시간 반전 신호의 이산 푸리에 변환의 성질

순환 반전 신호의 DFT는 다음과 같다.

F{x[⟨−n⟩N]} = X[⟨−k⟩N]]. (4.81)

0 1 2 3 4 5 6 7index k

1012345

Real part of F{x[n]

}

0 1 2 3 4 5 6 7index k

10

5

0

5

10Imaginary part of F

{x[n]

}0 1 2 3 4 5 6 7

index k

1012345

Real part of F{x[⟨−n⟩

8 ]}

0 1 2 3 4 5 6 7index k

10

5

0

5

10Imaginary part of F

{x[⟨−n⟩

8 ]}

(a) F{x[n]}, (b) F{x[⟨−n⟩8]}.

그림 4.3: 유한길이 신호 x[n]과 x[n]을 회전 대칭 이동시킨 신호 x[⟨−n⟩8]의 DFT.한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 12

Page 13: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

시간 반전 신호의 이산 푸리에 변환의 성질

이그림에서 X[k] = F{x[n]},Xc[k] = F{x[⟨−n⟩N]}라하면, 다음과 같은 관계가성립하는 것을 볼 수 있다.

Xc[0] = X[0], Xc[1] = X[7], Xc[2] = X[6], Xc[3] = X[5],

Xc[4] = X[4], Xc[5] = X[3], Xc[6] = X[2], Xc[7] = X[1].

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 13

Page 14: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

이산 푸리에 변환의 성질: 복소 대칭

F{x∗[n]} = X∗[⟨−k⟩N]. (4.82)

만약에 x[n]이 주기가 N인 실수 주기 신호인 경우에는 다음 식이 성립한다.

X[k] = X∗[−k] = X∗[⟨−k⟩N]. (4.83)

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 14

Page 15: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

순환 이동 신호의 이산 푸리에 변환

길이가 N인 신호 x[n]이 시간 영역에서 n0 만큼 이동을 하면 이동한 신호의구간은 0 ≤ n ≤ N − 1을 벗어난다. 따라서 이 경우에도 시간 반전의 경우와같은 이유로 다음과 같이 정의되는 회전 시간 이동을 사용한다.

x[n − n0] = x[⟨n − n0⟩N]. (4.84)

Python에서 순환 이동한 배열을 구할 때는 다음 스크립트에서 보는 것과 같이두 가지 방법을 사용할 수 있다. 첫 번째는 나머지 연산자를 사용하는 방법이고,두 번째는 Numpy의 roll() 함수를 사용하는 것이다.

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 15

Page 16: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

순환 이동 신호의 이산 푸리에 변환

>>> n = np.arange(8)>>> a= 2*n>>> aarray([ 0, 2, 4, 6, 8, 10, 12, 14])>>> a[ (n-2) % 8]array([12, 14, 0, 2, 4, 6, 8, 10])>>> np.roll(a, 2)array([12, 14, 0, 2, 4, 6, 8, 10])>>> a[ (n+2) % 8]array([ 4, 6, 8, 10, 12, 14, 0, 2])>>> np.roll(a, -2)array([ 4, 6, 8, 10, 12, 14, 0, 2])>>>

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 16

Page 17: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

순환 이동 신호의 이산 푸리에 변환

순환이동 신호의 이산 푸리에 변환은 다음과 같다.

F{x[⟨n − n0⟩N]} =

N−1∑n=0

x[⟨n − n0⟩N]e−j 2πN kn (4.85)

=

n0−1∑n=0

x[⟨n − n0⟩N]e−j 2πN kn +

N−1∑n=n0

x[⟨n − n0⟩N]e−j 2πN kn

=

n0−1∑n=0

x[N − n0 + n]e−j 2πN kn +

N−1∑n=n0

x[n − n0]e−j 2πN kn.

여기에서 m = N − n0 + n이라 두면,

n0−1∑n=0

x[N − n0 + n]e−j 2πN kn =

N−1∑m=N−n0

x[m]e−j 2πN k(m+n0−N) (4.86)

이 되고, m = n − n0라 두면

N−1∑n=n0

x[n − n0]e−j 2πN kn =

N−n0−1∑m=0

x[m]e−j 2πN k(m+n0) (4.87)

이 된다.

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 17

Page 18: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

순환 이동 신호의 이산 푸리에 변환

따라서 F{x[⟨n − n0⟩N]}은 다음과 같이 쓸 수 있다.

F{x[⟨n − n0⟩N]} =

n0−1∑n=0

x[N − n0 + n]e−j 2πN kn +

N−n0−1∑m=0

x[m]e−j 2πN k(m+n0)

=

N−1∑m=N−n0

x[m]e−j 2πN k(m+n0−N) +

N−n0−1∑m=0

x[m]e−j 2πN k(m+n0)

=

N−1∑m=N−n0

x[m]e−j 2πN k(m+n0) +

N−n0−1∑m=0

x[m]e−j 2πN k(m+n0)

=

N−1∑m=0

x[m]e−j 2πN k(m+n0)

= e−j 2πN kn0

N−1∑m=0

x[m]e−j 2πN km

= e−j 2πN kn0X[k]. (4.88)한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 18

Page 19: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

순환 이동 신호의 이산 푸리에 변환

>>> import numpy as np>>> x=np.array([-2,-1,0,1,2,3,4,5])>>> x1 = np.roll(x,2)>>> X=np.fft.fft(x)>>> Xarray([ 12.+0.j , -4.+9.65685425j, -4.+4.j ,

-4.+1.65685425j, -4.+0.j , -4.-1.65685425j,-4.-4.j , -4.-9.65685425j])

>>> np.fft.fft(x1)array([ 12.00000000+0.j, 9.65685425+4.j, 4.00000000-4.j,

-1.65685425-4.j, -4.00000000+0.j, -1.65685425+4.j,4.00000000+4.j, 9.65685425-4.j])

>>> w = np.exp(-1j*2*np.pi/8)**(2*np.arange(8))>>> w*Xarray([ 12.00000000 +0.00000000e+00j, 9.65685425 +4.00000000e+00j,

4.00000000 -4.00000000e+00j, -1.65685425 -4.00000000e+00j,-4.00000000 -3.55271368e-15j, -1.65685425 +4.00000000e+00j,4.00000000 +4.00000000e+00j, 9.65685425 -4.00000000e+00j])

>>>

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 19

Page 20: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

순환 콘볼루션의 이산 푸리에 변환

길이가 각각 N1과 N2인 두 신호 h[n]과 x[n]의 선형 콘볼루션의 길이는N1 + N2 − 1이 된다. N = max(N1,N2)라 하고, 콘볼루션 계산 과정에서 모든산호를 [0,N − 1] 구간으로 제한하고 신호의 이동을 순환 이동으로 제한하면, 그결과는 다음과 같은 순환 콘볼루션 (circular convolution)으로 표현된다.

y[n] =N−1∑m=0

h[⟨n − m⟩N]x[m]. (4.89)

그러면 y[n]의 이산 푸리에 변환 Y[k]는 다음과 같다.

Y[k] =N−1∑n=0

(N−1∑m=0

h[⟨n − m⟩N]x[m]

)e−j 2πN kn

=

N−1∑m=0

x[m]

(N−1∑n=0

h[⟨n − m⟩N]e−j 2πN kn

)

=

N−1∑m=0

x[m]e−j 2πN kmH[k] (4.90)

= X[k]H[k]

= H[k]X[k].

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 20

Page 21: Python과 함께 배우는 신호 해석 - 제 11 강. 이산 푸리에 변환 (제 4 …contents.kocw.net/KOCW/document/2014/Hallym/parkseophyeng/11.pdf · Python 과함께 배우는신호

Python과 함께배우는 신호해석

박섭형

이산 푸리에변환

이산 푸리에변환의 성질

이산 푸리에 변환의 Parseval 정리

N−1∑n=0

|x[n]|2 =

N−1∑n=0

x∗[n]x[n]

=

N−1∑n=0

(1

N

N−1∑k=0

x[k]ej 2πN kn

)∗

x[n]

=

N−1∑n=0

(1

N

N−1∑k=0

x∗[k]e−j 2πN kn

)x[n] (4.91)

=1

N

N−1∑k=0

x∗[k](N−1∑

n=0

x[n]e−j 2πN kn

)

=1

N

N−1∑k=0

x∗[k]x[k]

=1

N

N−1∑k=0

|x[k]|2.

한림대학교 박섭형 Python과 함께 배우는 신호 해석 제 11 강. 이산 푸리에 변환 21