๐ ์์ธ ์ ๋ฆฌ
- ์ด์ ์ฌ์ฌ FFT๋ฅผ ์ดํดํ ๋๊ฐ ๋๊ฒ ๊ฐ๋ค. ์ ๋ฆฌํด๋ณด์.
ํธ๋ฆฌ์ ๋ณํ
- ์ฌ๋ฌ ์ฌ์ธํ / ์ฝ์ฌ์ธํ๊ฐ ๋ํด์ง ํจ์ $h(t)$๊ฐ ์๋ค.
- ์ผ๋จ ๋จผ์ ์ฌ์ธํ๋ง ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
- ์ฐ๋ฆฌ๋ ์ด ํจ์ $h(t)$์์ ์ด๋ค ์ฃผํ์๋ฅผ ๊ฐ์ง ์ฑ๋ถ๋ค์ด ์๋์ง ๊ฒ์ฌํ๊ณ ์ถ๋ค.
- ๋ ์ฝ๊ฒ, ๋จผ์ ์ฌ์ธํ ํ๋์ ๋ํด์ ์๊ฐํด๋ณด์.
- ํจ์ $f(x) = \sin{ax}$๊ฐ ์๋ค.
- ์ฐ๋ฆฌ๋ $a$๋ฅผ ๋ชจ๋ฅธ๋ค๊ณ ๊ฐ์ ํ์.
- ์ด๋ป๊ฒ ํ๋ฉด ์ด $a$๋ฅผ ์์๋ผ ์ ์์๊น?
- ์์์ ์ฌ์ธํ $g(x) = \sin{bx}$๋ฅผ ๊ณฑํด๋ณด์.
- ์ผ๊ฐํจ์์ ๊ณฑ์ ์ ๋ฆฌ์ ์ํด
- $f(x)g(x) = \sin{ax}\sin{bx} = \frac{\cos{((a-b)x)} - \cos{((a+b)x)}}{2}$
- ์์ ๊ฐ์ด ๋ํ๋ผ ์ ์๋ค.
- ์ด๋ฅผ ์์ ๋ฌดํ๋๋ถํฐ ์์ ๋ฌดํ๋๊น์ง ์ ๋ถํ๋ฉด, ์ฃผ๊ธฐํจ์์ ํน์ฑ์ ์ด์ฉํด์ $a, b$๊ฐ ๊ฐ์์ง ๋ค๋ฅธ์ง ์์๋ผ ์ ์๋ค.
- $a, b$๋ ์ฃผํ์๊ธฐ์ $a, b > 0$์ด ๋ณด์ฅ๋๋ค.
- $a = b$์ผ ๋๋ง ์์ ๋ฌดํ๋๋ก ๋ฐ์ฐํ๊ณ , ๊ทธ ์ธ์ ๊ฒฝ์ฐ ์ง๋๋ฐ์ฐํ๋ค.
- ํจ์ $f(x) = \sin{ax}$๊ฐ ์๋ค.
- ์์ ํน์ง์ ์ฌ๋ฌ ์ฌ์ธํ์ ํฉ $h(t)$์ ๋ํด์๋ ๊ฐ๋จํ๊ฒ ์ฑ๋ฆฝํ๋ค.
- ์ฝ์ฌ์ธ ํ๊ฐ ์์ฌ์๋ค๋ฉด ์ฝ์ฌ์ธํ๋ฅผ ๊ณฑํด์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ํํด์ฃผ๋ฉด ๋๊ฒ ๋ค.
- ์ด ๋, ์ค์ผ๋ฌ ๊ณต์ $e^{ix} = \cos{x} + i\sin{x}$์ ์ด์ฉํด์ ์ค์๋ถ / ํ์๋ถ๋ก ๋๋ ์ ๋ ์ฝ๊ฒ ๊ณ์ฐํ ์๋ ์๋ค.
- ์ด๋ฅผ ์์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- $$\hat{h}(x) = \int_{-\infty}^{\infty}{h(t)e^{-2\pi itx}dt}$$
- ์ด๋ ์ ํธ -> ์ฃผํ์๋ก์ ๋ณํ์ผ๋ก ํด์ํ๋ฉด ๋๋ค.
- ๋ฐ๋๋ก ์ฃผํ์ -> ์ ํธ์ ๋ณํ๋ ๊ฐ๋ฅํ๋ค.
- $$h(t) = \int_{-\infty}^{\infty}{\hat{h}(x)e^{2\pi itx}dx}$$
- ์ด๋ฅผ ํธ๋ฆฌ์ ์ญ๋ณํ์ด๋ผ๊ณ ํ์.
- ์ฌ๊ธฐ์ ๊ฐ๊ณ ๋์๋ณด์. ์ดํดํ ๋ ํด๋ก๋๊ฐ ๋ง๋ค์ด์คฌ๋ค.
โ ์๊ฐ ๋๋ฉ์ธ โ h(t)
์ค์ ๋ฐ์ดํฐ (์ํ๋ง๋ ์ด์ฐ ๊ฐ๋ค)
โก ์ฃผํ์ ๋๋ฉ์ธ โ |X[k]| (DFT ๊ฒฐ๊ณผ)
๊ฐ ์ฃผํ์ ์ฑ๋ถ์ ํฌ๊ธฐ. ์คํ์ดํฌ๊ฐ ์๋ ๊ณณ = ํด๋น ์ฃผํ์ ์กด์ฌ
- ๋ณต์ํ๋ฉด์์์ ์ดํด๋ ๊ฐ๋ฅํ๋ค. ์ฃผํ์๊ฐ ๋ค๋ฅด๋ค๋ฉด ์์๋์ด ์์ด์ง๋ค.
ํธ๋ฆฌ์ ๋ณํ โ ๋ณต์ํ๋ฉด ์๊ฐํ
h(t) = sin(2ฯยทf_signalยทt) | ๊ฒ์ฌ ์ฃผํ์ x ๋ฅผ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ ๋ถ๊ฐ์ด ์ด๋ป๊ฒ ๋ฌ๋ผ์ง๋์ง ํ์ธ
์ ํธ ์ฃผํ์ f = ๊ฒ์ฌ ์ฃผํ์ x = ์๋๋ณต์ํ๋ฉด โ h(t)ยทe^{โ2ฯitx} ๊ถค์ ํฉ: โ์๊ฐ ๋๋ฉ์ธ โ h(t) ์ ๊ฒ์ฌํ
์ด์ฐ ํธ๋ฆฌ์ ๋ณํ (DFT)
- ํ์ค์์ ์ป์ ์ ์๋ ๋ฐ์ดํฐ๋ ์ด์ฐ์ ์ด๋ค.
- ๋ฌผ๋ก ๋ผํ๋ผ์ค ๋ณํ๋ง๋ฅ ์ํ์ ์ผ๋ก ๋ณํํด์ ๊ณ์ฐํ๋ ํ ํฌ๋์ ์ผ๋ก ์ฐ๋ ค๋ฉด ๊ทธ๋ฅ ์ฐ๋ฉด ๋๋ค.
- ์ฌ์ธํ๋ฅผ ๋ง์ด ์ธ๊ฑฐ๊ฐ์ ์์ ๋ฐ์ดํฐ๋ก ์๊ฐํด๋ณด๋ฉด, ๊ฒฐ๊ตญ ์๋ฆฌ๋ฅผ ๋ฐ์๋๋, ์ ์ฅํ ๋๋ ์ด์ฐ์ ์ผ๋ก ์ ์ฅํ ์ ๋ฐ์ ์๋ค.
- ๋ฐ๋ผ์ ์ด์ฐ ๋ฐ์ดํฐ์ ๋ํด์๋ ํธ๋ฆฌ์ ๋ณํ์ ์ ์ํด๋ณด์.
- ๊ทธ๋ฌ๋ฉด ์ ๋ถ๊ฐ ๋์ ์๊ทธ๋ง ๊ฐ์ผ๋ก ํํํ ์ ์๊ฒ ๋ค.
- $$X[k] = \sum_{n=0}^{N-1}x[n]\exp\left(-i\frac{2\pi kn}{N}\right) = \sum_{n = 0}^{N - 1}{x[n] \omega^{kn}} \,\,\,\, โ(\omega = \exp\left(-i\dfrac{2\pi}{N}\right))$$
| ์ฐ์ | ์ด์ฐ |
|---|---|
| $t$ | $n/N$ |
| $h(t)$ | $x[n]$ |
| $x$ (์ฃผํ์) | $k$ |
| $dt$ | $1/N$ |
| $e^{-2\pi i t x}$ | $\omega^{kn}$ |
- ์์ ๊ฐ์ด ๋์๋๊ฒ ์๊ฐํ๋ฉด ๋๋ค.
- $\omega$๋ ๋จ์๊ทผ์ด๋ผ๊ณ ํ๋ค.
- ์ด๋ $\omega^N = 1$์ด๋ฏ๋ก, $0 \leq k < N$ ์ธ $k$์ ๋ํด์๋ง ์ ์๋ฏธํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋ผ ์ ์๋ค.
- ๋ฐ๋ผ์ DFT์์๋ ์ต๋ $N$๊ฐ์ ์ฃผํ์์ ๋ํด์๋ง ๊ฒ์ฆํ ์ ์๋ค.
- ์ฌ๊ธฐ์๋ ๋ฌผ๋ก ์ญ๋ณํ์ ์ ์ํ ์ ์๋ค. $$x[n] = \frac{1}{N}\sum_{k=0}^{N-1}X[k]\omega^{-kn}$$
๊ณ ์ ํธ๋ฆฌ์ ๋ณํ
- ์์ ํธ๋ฆฌ์ ๋ณํ์ ๊ณ์ฐํ๋๋ฐ, ์ด $N$๊ฐ์ ์ฃผํ์์ ๋ํด $N$๊ฐ ์ ํธ์ํฉ์ ๊ตฌํ๋๊น $O(N^2)$์ ์๊ฐ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฐ๋ค.
- ์ฌ๊ธฐ์ ๊ด์ฐฐ์ ์กฐ๊ธ ํด๋ณด์.
- 8๊ฐ์ ๋ฐ์ดํฐ $x_0, x_1, x_2, \cdots, x_7$์ด ์๋ค๊ณ ํด๋ณด์.
- ์ด๋ $x_n, x_{n+4}$์ ๊ณฑํด์ง๋ ๊ณ์๋ฅผ ๋น๊ตํ๋ฉด $\exp{(-i\pi k)}$ ๋งํผ์ ์ฐจ์ด๊ฐ ๋๋ค.
- $k$๊ฐ ํ์์ผ๋๋ $-1$, ์ง์์ผ๋๋ $1$์ด๋ค.
- ์ด๋ฅผ ์ด์ฉํด์ DFT์ ์์ ์ง์ํญ๊ณผ ํ์ํญ์ผ๋ก ๋๋ ์ ๋ค์๊ณผ ๊ฐ์ด ์ธ ์ ์๋ค. โ $$\begin{align} โX[k] &= \sum_{n=0}^{N-1} x[n]\exp\left(-i\frac{2\pi kn}{N}\right) \\ โ&= \sum_{n=0}^{N/2-1} x[2n]\exp\left(-i\frac{2\pi k(2n)}{N}\right) + \sum_{n=0}^{N/2-1} x[2n+1]\exp\left(-i\frac{2\pi k(2n+1)}{N}\right) \\ โ&= \sum_{n=0}^{N/2-1} x[2n]\exp\left(-i\frac{2\pi kn}{N/2}\right) + \exp\left(-i\frac{2\pi k}{N}\right)\sum_{n=0}^{N/2-1} x[2n+1]\exp\left(-i\frac{2\pi kn}{N/2}\right) \\ โ&= E[k] + \exp\left(-i\frac{2\pi k}{N}\right)O[k] \\ โ&= E[k] + \omega^kO[k] โ\end{align}$$ โ- ๊ด์ฐฐ โ- ์ ์์ ์ง์ํญ / ํ์ํญ ๋ถ๋ถ์ $N/2$ ํฌ๊ธฐ์ DFT์ ๊ฐ๋ค. โ- ์ด ์์ $k < N/2$ ์ ๋ํด์๋ง ์ ์๋์ง๋ง, $k \geq N/2$์ ๋ํด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์์ ์ฐพ์๋ค. $$\begin{align} X[k+N/2] &= \sum_{n=0}^{N-1} x[n]\exp\left(-i\frac{2\pi (k+N/2)n}{N}\right) \\ &= \sum_{n=0}^{N-1} x[n]\exp\left(-i\frac{2\pi kn}{N}\right)\exp(-i\pi n) \\ &= E[k] - \omega^k O[k] \end{align}$$ โ- ๋ฐ๋ผ์ ๋ถํ ์ ๋ณต์ ์ด์ฉํด์ $O(N\log{N})$ ์๊ฐ์ ์ฐ์ฐ์ ์ํํ ์ ์๊ฒ ๋ค. โ- ์ด๋ฅผ ๊ณ ์ ํธ๋ฆฌ์ ๋ณํ, FFT๋ผ ํ์.
ํฉ์ฑ๊ณฑ
- ๊ทผ๋ฐ ์ ์ํ ์น๋๊ฐ์๊ฑธ ์๋ฐฐ์ ๋?
- DFT๋ฅผ ํตํด ํฉ์ฑ๊ณฑ์, ํฉ์ฑ๊ณฑ์ผ๋ก ๋คํญ์์ ๊ณฑ์ ์, ๋คํญ์์ ๊ณฑ์ ์ผ๋ก ๋ ์์ ๊ณฑ์ ์ ํ ์ ์๋ค๊ณ ํ๋ค.
- ๋ค์๊ณผ ๊ฐ์ ํจ์๊ฐ ์๋ค๊ณ ํ์.
- $f(x) = a_{N-1}x^{N-1} + a_{N-2}x^{N-2} + \cdots + a_1x + a_0$
- ์ฌ๊ธฐ์, $x = \omega^k$๋ฅผ ๋์ ํ๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ DFT์ ๊ฐ๋ค!
- ์ด๋ฅผ ์ด์ฉํด์ ๋ ๋คํญ์ $f, g$์ ๋ํ DFT๋ก ์๋ก์ด ํจ์ $h$์ ๋ํ DFT ๊ฒฐ๊ณผ๊ฐ์ ๊ตฌํ๊ณ , ์ด๋ฅผ ์ญ๋ณํํด์ $h$๋ฅผ ์ฐพ์๋ผ ์ ์๊ฒ ๋ค.
- ์ด๊ฑธ ์ฝ๋๋ก ์ฎ๊ธฐ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
using cd = complex<double>;
const double PI = acos(-1);
vector<cd> fft(vector<cd> a){
int N = a.size();
if(N == 1) return a;
vector<cd> even(N/2), odd(N/2);
rep(i, 0, N/2){
even[i] = a[2*i];
odd[i] = a[2*i+1];
}
even = fft(even);
odd = fft(odd);
vector<cd> ret(N);
rep(k, 0, N/2){
cd t = polar(1.0, -2*PI*k/N) * odd[k];
ret[k] = even[k] + t;
ret[k+N/2] = even[k] - t;
}
return ret;
}
vector<cd> ifft(vector<cd> a){
int N = a.size();
if(N == 1) return a;
vector<cd> even(N/2), odd(N/2);
rep(i, 0, N/2){
even[i] = a[2*i];
odd[i] = a[2*i+1];
}
even = ifft(even);
odd = ifft(odd);
vector<cd> ret(N);
rep(k, 0, N/2){
cd t = polar(1.0, 2*PI*k/N) * odd[k];
ret[k] = even[k] + t;
ret[k+N/2] = even[k] - t;
}
return ret;
}
- ifft๋ฅผ ์ฌ์ฉํ ๋ ๋ง์ง๋ง์ a์ ๊ธธ์ด๋ก ๋๋ ์ค์ผ ํจ์ ์ฃผ์ํ์.
- ์ฌ์ค์ ๊ตฌ์กฐ๊ฐ ๋๊ฐ์์, bool inv๊ฐ์๊ฑธ๋ก ์ต์ ํํ๋๊ฒ ๋ ์ข์๊ฑฐ๊ฐ๋ค
์ต์ ํ
- ํ์ง๋ง ์ด๋ ๊ฒ ์ฌ๊ทํจ์๋ก ์๋ก ๋ฐฐ์ด์ ๋ง๋ค๋ฉด์ ์งํํ๋ฉด, ๋๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ ๋ง์ด ๋จน๋๋ค.
- ์ธ์ ํ ์์๋ค ๋ผ๋ฆฌ๋ง ์ฐ์ฐํ ์ ์๊ฒ, ๋ฐฐ์ด์ ์ฌ๋ฐฐ์นํ์.
- $[0, 4, 2, 6, 1, 5, 3, 7]$๊ณผ ๊ฐ์ ๋ชจ์์ด๋ฉด ์ข๊ฒ ๋ค.
- ์ด๋ ๋นํธ๋ฅผ ์ข์ฐ๋ก ๋ค์ง๋ ๊ฒ์ผ๋ก ์ํ ๊ฐ๋ฅํ๋ค.
- ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ณ์ฐํ ์ ์๊ณ , polar ๊ทน์ขํ์ ์์ฒด๋ ๋ฏธ๋ฆฌ ๊ณ์ฐํด๋ฌ์ ์ฐ๋ฉด $NlogN$๋ฒ์์ $N/2$๋ฒ์ผ๋ก ์ค์ผ ์ ์๊ฒ ๋ค.
namespace FFT{
void fft(vector<cd> &a, bool inv = false){
int N = a.size();
assert(N > 0 && (N & (N-1)) == 0); // N์ 2์ ๊ฑฐ๋ญ์ ๊ณฑ์ด์ด์ผ ํจ
// ๋นํธ ๋ค์ง๊ธฐ
for(int i = 1, j = 0; i < N; i++){
int bit = N >> 1;
for(; j & bit; bit >>= 1) j ^= bit;
j ^= bit;
if(i < j) swap(a[i], a[j]);
}
// ๋จ์๊ทผ ๋ฏธ๋ฆฌ ๊ณ์ฐ
double ang = 2 * acos(-1) / N * (inv ? 1 : -1);
vector<cd> w(N/2); // ๋จ์๊ทผ
rep(i, 0, N/2) w[i] = cd(cos(ang*i), sin(ang*i));
// Cooley-Tukey FFT
for(int len = 2; len <= N; len <<= 1){
int step = N / len;
for(int i = 0; i < N; i += len){
rep(j, 0, len>>1){
cd even = a[i+j], odd = a[i+j+(len>>1)] * w[j*step];
a[i+j] = even + odd;
a[i+j+(len>>1)] = even - odd;
}
}
}
// ์ญ FFT์ธ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๋ฅผ N์ผ๋ก ๋๋
if(inv) rep(i, 0, N) a[i] /= N;
}
}
- 1067๋ฒ ๋ฌธ์ ๊ธฐ์ค 608ms -> 92ms๋ก, 6.6๋ฐฐ ๊ฐ๊น์ด ์ค์ด๋ค์๋ค!
โ์ง๋ฌธ ์ฌํญ
์ฃผํ์์ $2\pi$๋ฅผ ๋ฃ๋ ์ด์์ฃผํ์ $f$ -> 1์ด์ ๋ช๋ฒ ์ง๋ํ๋๊ฐ ๊ทธ๋ฅ $\sin{ft}$๋ผ๊ณ ์ฐ๋ฉด $t = 1$์ผ๋ ๊น์ง $f$๋ฒ ์ง๋ํ์ง ์๋๋ค (์ฃผ๊ธฐ๊ฐ $2\pi$๋๊น) ๋ฐ๋ผ์ $2\pi$๋ฅผ ๊ณฑํด์ค์ ๊ฐ์ฃผํ์๋ก ๋ณํํด์ค๋ค.
$h(x)$์ ๋ชจ๋ ๊ฐ๋ค์ ๋ฐ์ฐํ๋๋ฐ, ์ด๋ป๊ฒ ๊ทธ๋ฆฌ์ง?๊ทธ๋์ ์ํ์ ์ผ๋ก๋ ๋๋ ๋ธํ ํจ์๋ฅผ ์ด์ฉํ๋ค. ํ์ง๋ง ํ์ค ๋ฐ์ดํฐ์์๋ ์ ํธ๊ฐ ์ ํํ๊ฑฐ๋ / ๊ฐ์ ํ๊ธฐ๋๋ฌธ์, ๋ณํ ๊ฒฐ๊ณผ ๋ฐ์ฐํ์ง ์๊ณ ์์ฐ์ค๋ฝ๊ฒ ์๋ ดํ๋ค.