2018/03/18
Excel分析ツールを見直す(11)
前回の続きです。今回はRとPythonでフーリエ解析を行います。データは前回のExcelのB、C列(t、y)をcsvファイルにしたものを使いました。2. R
フーリエ解析の基本的なアプローチは、Excelで行ったやり方と同じです。プログラムは以下の通りです。
x <- read.csv("FourierData.csv",header = FALSE) #Load dataFFTを実行しているのは8行目です。その結果(FFT_res.csv)は以下の通りで、Excelの結果と同じでした。
datanum <- length(x[,1]) #data number
sampintv <- 0.01 #sampling interval[sec]
funfreq <- 1/(datanum*sampintv) #fundamantal frequency
anafreq <- funfreq * seq(0,datanum-1) #analysis frequency
res <- fft(x[,1]) #FFT results
spec <- abs(fft(x[,1])) #FFT spectra
#Graph output
plot(x[1:128,1],type="l",col=2) #data plot(128data)
plot(anafreq,spec,type="l",col=2) #spectra
#File output
write.csv(res, file = "FFT_res.csv",quote = FALSE)
write.csv(cbind(anafreq,spec), file = "FFT_spec.csv",quote = FALSE)
,xまた、9行目でスペクトルを求めますが、abs関数で虚数の計算も対応できています。Excelでは虚数をabs関数で処理するとエラーを吐き、imabs関数を使わなくてはならず面倒ですが、Rでは区別がなく使えるので便利です。結果(FFT_spec.csv)は以下の通りで、これもExcelと同じでした。
1,21.3114464479788+0i
2,21.3198777521124-0.5839506913525i
3,21.3452101541248-1.1692561369683i
・・・
1022,21.3875595649728+1.7572814709631i
1023,21.3452101541249+1.1692561369683i
1024,21.3198777521126+0.5839506913526i
,anafreq,spec波形グラフとスペクトルの結果も、当然ながらExcelと同じものでした。
1,0,21.3114464479788
2,0.09765625,21.3278734470867
3,0.1953125,21.3772111473314
・・・
1022,99.70703125,21.4596305260238
1023,99.8046875,21.3772111473315
1024,99.90234375,21.327873447087


3. Python
Pythonのプログラムは、Rのプログラムをそのまま水平展開したものです。
import numpy as np11行目でFFTを実行し、12行目でスペクトルを求めています。Pythonもabs関数で虚数の計算も行ってくれます。便利ですね。FFTの結果(FFT_res.csv)は以下の通りで、Excel、Rと同じ結果です。
import matplotlib.pyplot as plt
x = np.loadtxt('FourierData.csv') #Load data
datanum = len(x) #data number
sampintv = 0.01 #sampling interval[sec]
funfreq = 1/(datanum * sampintv) #fundamantal frequency
anafreq = funfreq * np.arange(0, datanum) #analysis frequency
res = np.fft.fft(x) #FFT results
spec = abs(res) #FFT spectra
#Graph output
plt.xlim(1, 128) #data plot(128data)
plt.plot(x)
plt.show()
plt.plot(anafreq, spec) #spectra
plt.show()
#File output
np.savetxt("FFT_res.csv",res)
np.savetxt("FFT_spec.csv",np.c_[anafreq, spec])
(2.131144644797880972e+01+0.000000000000000000e+00j)スペクトルの結果(FFT_spec.csv)も同様でした。
(2.131987775211241853e+01+-5.839506913524710185e-01j)
(2.134521015412475009e+01+-1.169256136968316984e+00j)
・・・
(2.138755956497289290e+01+1.757281470963324432e+00j)
(2.134521015412481759e+01+1.169256136968219950e+00j)
(2.131987775211233327e+01+5.839506913524976639e-01j)
0.000000000000000000e+00 2.131144644797880972e+01波形グラフとスペクトルの結果も、当然ながらExcel、Rと同じものでした。
9.765625000000000000e-02 2.132787344708677679e+01
1.953125000000000000e-01 2.137721114733136574e+01
・・・
9.970703125000000000e+01 2.145963052602384735e+01
9.980468750000000000e+01 2.137721114733142613e+01
9.990234375000000000e+01 2.132787344708669153e+01


Excel、R、Pythonで「フーリエ解析」をやってみましたが、どれを使っても手間暇は変わらないように思いました。Excelは虚数の絶対値を求めるのに、abs関数ではなく、imabs関数を使わなくてはならない所が唯一面倒に思いました。