도라에몽주머니

[ML] 푸리에 변환(Fourier Transform) 이란? 본문

Study/ML

[ML] 푸리에 변환(Fourier Transform) 이란?

에몽쓰 2024. 9. 17. 17:25

이번 안건에서 푸리에 변환과 관련한 내용을 접하게 되어, 다음에 또 푸리에 변환을 활용하게 될 때 참고로 사용하기 위해 정리해두고자 한다. 수학적인 증명방법이나 풀이보다는 왜 푸리에 변환이라는 것을 사용하고, 파이썬으로는 어떻게 활용 가능한가를 중점적으로 글을 작성할 예정이다.

 

푸리에 변환(Fourier Transform)

: 푸리에 변환이란 데이터 해석 기법 중 하나로, 일반적인 시간 범위의 데이터를 주파수 범위의 데이터로 변환하는 알고리즘이다.

(좌) Time Domain / (우) Frequency Domain

 

목적

푸리에 변환의 목적은 시계열 데이터를 주파수 데이터로 변경하는 것이다. 이렇게 얘기해도 그래서 왜 시계열에서 주파수로 바꾸는건데? 라고 생각할 것이다. (나도 그랬으니까...)

푸리에 변환의 가장 큰 목적은 데이터 압축에 있다고 생각한다. 시계열데이터를 생각해보면 시간이 흐름에 따라 점점 데이터가 쌓여갈 것이다. 데이터 양이 늘어나면 처리속도도 비례해서 느려지기 때문에, 이러한 푸리에 변환을 사용해 데이터를 압축하는 것이다.

데이터를 압축하게 되면 해당 데이터에 대한 특징을 이해할 수 있고, 해당 데이터가 어떻게 구성되어 있는지를 이해할 수 있을 것이다.

더보기

아래와 같이 공부 계획에 대한 데이터가 있다고 가정해보자. 이 데이터는 7일간의 공부 계획에 관한 데이터이고, 국어, 수학, 영어, 과학 4가지의 과목을 공부해야 한다.

데이터를 잘 보면 패턴을 가진 것을 알 수 있다. 수학은 매일 공부하고 영어는 격일로, 국어는 3일에 한번, 과학은 4일에 1번 공부한다. 이에 따라 새로 데이터를 정리해보면 아래와 같다.

처음 작성한 데이터와 새로 작성한 데이터가 의미하는 바는 같다. 결국 1일차에는 전부 공부하고, 2일차에는 수학만 공부하고... 와 같은 의미의 데이터이다. 그러면 왜 굳이 위의 표처럼 데이터를 변환했을까?

 

지금은 7일차까지의 공부계획밖에 없지만 만약 100일간의 공부계획, 1년간의 공부계획, 100년간의 공부계획을 세운다고 생각해보자. 처음 작성한 방식으로 데이터를 작성해나간다면 1년간의 공부계획만 하더라도 꽤나 많은 양의 데이터가 되버릴 것이다.

하지만, 새로 작성한 데이터의 경우에는 100일이든, 1년이든, 100년이든, 1000년이든 상관없이 4개의 데이터만으로 표현이 가능하다. (= 공부 주기에 대한 데이터를 새로 작성할 필요가 없다.) 이를 통해, 정보량이 상당히 줄어든 것을 알 수 있다.

 

주기는 주파수의 역수이므로, 결국 데이터를 주파수에 대해 작성함으로써 상당한 양의 정보를 압축하여 표시할 수 있게 된 것이다.

 

출처: https://renelemon.tistory.com/75

 

푸리에 급수(Fourier Series)

: 복잡한 주기함수나 주기 신호를 단순한 사인파(sin) 나 코사인파(cos) 의 합으로 나타내는 것

  • 단순한 파동의 합으로 나타내기 때문에 함수 내부의 특징을 추출할 수 있음
  • 복잡한 주기함수를 단순한 삼각함수들의 합으로 나타낼 수 있음
  • 삼각함수는 지수함수의 한 종류이므로 지수함수의 합으로도 나타낼 수 있음

 

https://news.samsungdisplay.com/19688

 

푸리에 변환(Fourier Transform) 과 푸리에 급수(Fourier Series) 의 차이

  • 푸리에 급수(Fourier Series) : 주기함수(주기신호) 에서만 활용 가능. 비주기함수에서는 활용할 수 없다.
  • 푸리에 변환 (Fourier Transform) : 비주기함수(비주기신호) 를 주기가 무한대인 주기함수라고 가정해 푸리에 급수를 활용할 수 있도록 하는 방법

 

이산 푸리에 변환(DFT, Discrete Fourier Transform)

: 연속적인 시간 범위로 푸리에 변환을 하는 것과는 다르게, N개의 유한한(이산적인) 푸리에 변환을 수행하는 것. 시간 범위에서 특정 너비만큼의 값들을 샘플링해서 푸리에 변환을 수행함.

https://infograph.tistory.com/323

샘플링(Sampling)

: 연속신호에서 이산신호로 변환하는 프로세스

 

처리량과 시간복잡도

O(N²) 의 시간복잡도를 가지기 때문에, 처리에 꽤나 시간이 걸린다. 지금은 컴퓨터 성능이 많이 좋아져서 이산 푸리에 변환으로 푸리에 변환을 해도 시간이 그렇게까지는 안걸린다고 한다,,

시간복잡도 그래프

 

고속 푸리에 변환(FFT, Fast Fourier Transform)

: 이산 푸리에 변환의 한 종류로서, 시간복잡도 문제를 해결하기 위해 고안해낸 방법이다. 샘플링 중, 필요한 신호만을 뽑아 연산하는 방법이다.

왼쪽과 같은 그래프를 오른쪽처럼 변환하는 것

처리량과 시간복잡도

O(NlogN) 의 시간복잡도를 가지고 있어, 이산 푸리에 변환과 비교해보면 상당히 속도가 빨라졌다는 것을 알 수 있다.

https://brunch.co.kr/@eungseok/17

 

 


 

이번에는 푸리에 변환의 정의, 목적, 종류 등에 관해 간단하게 적어보았다. 다음 글에서는 간단한 파이썬 예제로 어떻게 푸리에 변환을 구하는지 작성해보려 한다.