chakokuのブログ(rev4)
背景:FFTを理解すべく式の展開を追いかけてきた 課題:式の展開は薄く理解したとしても、そもそも式が何を表しているのか分からず(特にフーリエ変換の式) 取り組み:数理演算ライブラリ(sympy)を使って、グラフ描画や微積の式展開を行いながら、フーリエ級数やフーリエ展開において何をやっているのか理解する 詳細: フーリエ変換解説本の冒頭によくある、「いろんな波形はsin/cosの重ね合わせで作りだせる」という説明をPythonコードで再確認 cosの重ね合わせでパルス波形ができることを体感する 使った式
f(x)=cos(x) + cos(2*x) + cos(3*x) + cos(4*x) + cos(5*x)描画した結果 青色のグラフがf(x)(パルス波) Pythonコード
#!/usr/bin/python3 import sympy import spb x = sympy.Symbol('x') cos1 = sympy.cos(x) cos2 = sympy.cos(x*2) cos3 = sympy.cos(x*3) cos4 = sympy.cos(x*4) cos5 = sympy.cos(x*5) cos_sigma = cos1 + cos2 + cos3 + cos4 + cos5 print(cos_sigma) plt = spb.plot(cos_sigma, cos1, cos2, cos3, cos4, cos5, (x, -sympy.pi * 2, sympy.pi * 2), show=False, legend=False ) plt.save('cos_sigma.png')矩形波を作ってみる
f(x)=(4*sin(x) + 4*sin(3*x)/3 + 4*sin(5*x)/5 + 4*sin(7*x)/7 + 4*sin(9*x)/9 + 4*sin(11*x)/11)/pi描画した結果 青色のグラフがf(x)(矩形波) Pythonコード
#!/usr/bin/python3 import sympy import spb x = sympy.Symbol('x') sin1 = sympy.sin(x) sin3 = sympy.sin(x*3) /3 sin5 = sympy.sin(x*5) /5 sin7 = sympy.sin(x*7) /7 sin9 = sympy.sin(x*9) /9 sin11 = sympy.sin(x*11) /11 sin_sigma = (sin1 + sin3 + sin5 + sin7 + sin9 + sin11) * 4 / sympy.pi print(sin_sigma) plt = spb.plot(sin_sigma, sin1, sin3, sin5, sin7, sin9, sin11, (x, -sympy.pi * 2, sympy.pi * 2), show=False, legend=False ) plt.save('sin_sig_sq.png')のこぎり波 生成された波形 青色のグラフがf(x)(のこぎり波) Pythonコード
#!/usr/bin/python3 import sympy import spb x = sympy.Symbol('x') sin1 = sympy.sin(x) sin2 = - sympy.sin(x*2) / 2 sin3 = sympy.sin(x*3) / 3 sin4 = - sympy.sin(x*4) / 4 sin5 = sympy.sin(x*5) / 5 sin6 = - sympy.sin(x*6) / 6 sin7 = sympy.sin(x*7) / 7 sin_sigma = (sin1 + sin2 + sin3 + sin4 + sin5 + sin6 + sin7) * 2 print(sin_sigma) plt = spb.plot(sin_sigma, sin1, sin2, sin3, sin4, sin5, sin6, sin7, (x, -sympy.pi * 2, sympy.pi * 2), show=False, legend=False ) plt.save('sin_saw.png')ついでに面積も出してフーリエ級数展開の係数を試算してみる。範囲が(-pi , pi)の場合の、のこぎり波の面積は0
>>> sympy.integrate(sin_sigma, (x,-sympy.pi, sympy.pi)) 0sin(x)と掛け算した場合の面積は?? 2piだった(合ってるのかどうか検算必要だが・・) だからのこぎり波にsin(x)は含まれると
>>> sympy.integrate(sin_sigma * sympy.sin(x), (x ,-sympy.pi, sympy.pi)) 2*picos(x)と掛け合わせると、、0だから、cos(x)は含まれない
>>> sympy.integrate(sin_sigma * sympy.cos(x), (x ,-sympy.pi, sympy.pi)) 0sin(2x)はどうか。マイナスの成分がふくまれると*1
>>> sympy.integrate(sin_sigma * sympy.sin(x*2), (x ,-sympy.pi, sympy.pi)) -pi■補足 フーリエ変換まではなんとか式の展開を追いかけられた*2けど、離散フーリエ変換のところで行き止まってしまった。DFT理解のために解説本を購入。この本は音響学の立場からFFTを解説しており、単に数式の証明にとどまらず、波形サンプルが多く含まれる。波形の合成・解析や数式の証明の過程をプログラムで再確認しながら再度勉強したい。
ディジタルフーリエ解析 1 基礎編 (1) [音響入門シリーズ] (音響入門シリーズ B 1)
Amazon■参考URL Sympyの参考資料 SymPy による数式処理とグラフ作成 - 弘前大学 Home Sweet Home SymPyの使い方 — ごちきか 正規直交基底と離散フーリエ変換の数学的基礎- 応用線形代数講義 No.3 -,講師:新井仁之.数理科学オープンレクチャーズ. - YouTube https://qiita.com/TumoiYorozu/items/5855d75a47ef2c7e62c8
*1:係数を求めるにはpi?で割り算必要だったか?
*2:理解度は浅いが