FFT - ๊ณ ์† ํ‘ธ๋ฆฌ์— ๋ณ€ํ™˜

๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ

  • ์ด์ œ ์Šฌ์Šฌ 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$์ผ ๋•Œ๋งŒ ์–‘์˜ ๋ฌดํ•œ๋Œ€๋กœ ๋ฐœ์‚ฐํ•˜๊ณ , ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ ์ง„๋™๋ฐœ์‚ฐํ•œ๋‹ค.
  • ์œ„์˜ ํŠน์ง•์€ ์—ฌ๋Ÿฌ ์‚ฌ์ธํŒŒ์˜ ํ•ฉ $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} ๊ถค์  ํ•ฉ: โ€”
    t = 0.000s Re=0.000 Im=0.000
    ์‹œ๊ฐ„ ๋„๋ฉ”์ธ โ€” h(t) ์™€ ๊ฒ€์‚ฌํŒŒ
    ๋ˆ„์  Re = 0.000 ๋ˆ„์  Im = 0.000 |ํ•ฉ| = 0.000

์ด์‚ฐ ํ‘ธ๋ฆฌ์— ๋ณ€ํ™˜ (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)$์˜ ๋ชจ๋“  ๊ฐ’๋“ค์€ ๋ฐœ์‚ฐํ•˜๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ ๊ทธ๋ฆฌ์ง€?

๊ทธ๋ž˜์„œ ์ˆ˜ํ•™์ ์œผ๋กœ๋Š” ๋””๋ ‰ ๋ธํƒ€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์‹ค ๋ฐ์ดํ„ฐ์—์„œ๋Š” ์‹ ํ˜ธ๊ฐ€ ์œ ํ•œํ•˜๊ฑฐ๋‚˜ / ๊ฐ์‡ ํ•˜๊ธฐ๋•Œ๋ฌธ์—, ๋ณ€ํ™˜ ๊ฒฐ๊ณผ ๋ฐœ์‚ฐํ•˜์ง€ ์•Š๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ˆ˜๋ ดํ•œ๋‹ค.

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ