高速フーリエ変換という単語に遭遇したので、軽くまとめて、その上でお絵描きする。
はじめましょうか。
- こちらのサイトをまとめる。
- 多項式乗算問題
- 複素数
- 1の原始N乗根
- N乗して初めて1になる数
-
- j=kなら、N
- それ以外なら、0
- 離散フーリエ変換
- 離散フーリエ逆変換
- これを踏まえて、全体の流れを抑える
- ここから、高速に離散フーリエ変換を行う方法が出てくる。
- ここからは、お絵描きでもする。
- こちらを参照する。
import scipy.fft
import matplotlib.pyplot as plt
import numpy as np
from numpy.random import *
seed(seed = 21)
alpha = 0.1
N = 5000
T = 1.0/600.0
w = rand(N) * alpha
x = np.linspace(0.0, N*T, N)
y = 0.1*np.sin(60.0 * 2.0*np.pi*x)+0.4*np.sin(90.0*2.0*np.pi*x)
z = 0.2*np.sin(65.0 * 2.0*np.pi*x)+0.3*np.sin(30*2.0*np.pi*x)
x_f = np.linspace(0.0, 1/(2*T), N//2)
Amp = 2.0/N * np.abs(y_f)
plt.plot(x_f, Amp[:N//2])
plt.show()
- 乱数を足してみると、超低周波数の振幅が大きくなった。
- この性質を利用すれば、低周波数をカットすれば、高周波数の部分はノイズとは考えにくいので、意味ありげな情報を抽出できる(かも)。
- 最後に、ちょっと乱数の割合をいじってみる。
- いじった結果が上の画像。
- 完全に余談だが、FFTした後、半分の長さだけ表示している。
- これは、もう半分が対称的になっている。
- 全体の長さに対して、半分。なのは、これは、データが有限だから仕方ない。
- 10個のデータ、2個ごとの周期と見えるか、8個ごとの周期と見えるか、という問題。
バイバイ!