Google Classroom
GeoGebraGeoGebra Classroom

波形を作る

このワークシートはMath by Codeの一部です。 アプレット、背景、実装の順に見ていきましょう。
前回は、 音は振幅と周波数の2要素があり、 周波数を2倍、2倍にすると、音がオクターブずつあがることを体験した。 また、周波数を増やせば、周期を細かく刻むことになる。 だから、周期の最小公倍数はもとの周期と変わらないね。 今回は、純音ではなく、ミックスした音を詳しくみていこう。

ノコギリ波

矩形波

三角波

1.背景

三角関数をたし算することで、複雑な波を作ることができます。 フーリエ級数(展開)は、作りたい波が、定義区間が限定されているか、周期関数なら使えます。 フーリエ変換は、その制限がない一般の関数で使えます。 どちらも、関数を周波数成分に分解します。 フーリエ変換もラプラス変換もそうですが、 微分方程式を解きたいときに、 微分方程式を扱いやすい形に変換してから単純化し、逆変換してあげます。 だから、逆フーリエ変換、逆ラプラス変換というものがあります。 ここでは、作りたい音の波を周波数ごとの純音に分解する方法 フーリエ級数を中心に確認しよう。 前回の純音の式を思い出すと、 y=a sin[ 2π f t] です。t=1/f=Tの倍数になるたびに、sinの引数、位相が2πになるからy=0になるので、 グラフは(0,0)と(T,0)を通る、周期Tのグラフができた。fはもちろん周波数だ。 f=1/Tでもあるから、 f1(T)=a sin[ 2π t/T] ともかけるね。 さらに、整数nを位相に入れてみよう。 fn(t)=a sin[ 2π n t/T] とおくと、n=2,3,4,...とすると、周波数がfのn倍になり周期はn分の1になるけれど、 Tをただn等分するから、それらの波の周期の最小公倍数はTのままだね。 また、振幅を変えても周期とは関係ないし、sinをいっせいにcosにしても、 波がずれるだけのことで周期と関係ない。 だから、次のたされた波W1,W2,W3,W4はどれも周期はTのままになるね。 W1(t)=a sin(2π 1t/T)+b sin(2π 2t/T)+c sin(2π 3t/T)+d sin(2π 4t/T) W2(t)=a sin(2π 1t/T)+b sin(2π 3t/T)+c sin(2π 5t/T)+ d sin(2π 7t/T) W3(t)=a cos(2π 1t/T)+b cos(2π 2t/T)+c cos(2π 3t/T)+d cos(2π 4t/T) W4(t)=a cos(2π 1t/T)+b cos(2π 3t/T)+c cos(2π 5t/T)+d cos(2π 5t/T)
<ノコギリ波> ノコギリ波はすべての倍音を含み、豊かで強い音になります。いろいろな音に使われます。 特にトランペットやストリングスなどの音色に使われます。 ノコギリ波をたとえば周期2πで[ーπ、+π]の区間で、y=tとしてみよう。 y=f(x)とすると、f(-x)=-x=-f(x)だから、奇関数だ。奇関数といえば、y=sin x。 だから、y=tは奇関数fn(t)=b sin[ 2π n t/T]をたして作れそうだね。 f(t)=t, T=2πのときのフーリエ級数展開は f(t)=t=Σbn sin(2π n t/T)=Σbn sin(nt) 部分積分( ∫ uv' = [ uv] - ∫ u'v )、sinnπ=0, cos nπ=(-1)^n, cos 0= 1, sin 0 = 0 などを使い。 フーリエ係数 bn=2/T ingegral( f(t) sin 2π n t/T, t)( -π, π) = 1/π ∫t sin(nt) dt ( -π , π) = 2/π∫ t sin(nt) dt ( 0 , π) = 2/π[ t (- 1/n cos(nt))] ( 0,π) + ∫ (- 1/n cos(nt)) (0, π) = 2/π{ π (- 1)(n+1)/n - 0 } +[ (-1/n) sinnt/n ] (0,π) = 2(-1)(n+1)/n + 0 =2(-1)(n+1)/n まとめると、 f(t) = 2 Σ(-1)(n+1)/n sin(nt)
<矩形波> 矩形波はノコギリ波よりは倍音が少なく、明るく鋭い音で、リード音やゲームサウンドに使われます。 矩形波は、たとえば周期2πで[ーπ、+π]の区間で、y=-1(tが正),1(tが負)としよう。 ノコギリ波と同じ奇関数だ。[0, π]区間で作れたら奇関数だから[-π,0]でも同じ式になる。 f(t)=1, T=2πのときのフーリエ級数展開は f(t)=1=Σbn sin(2π n t/T)=Σbn sin(nt) dt sinnπ=0, cos nπ=(-1)^n, cos 0= 1, sin 0 = 0 などを使い。 フーリエ係数 bn=2/T ingegral( f(t) sin 2π n t/T, t)( 0, π) = 1/π ∫sin(nt) dt ( 0, π) = 1/π∫ sin(nt) dt ( 0 , π) = 1/π[(- 1/n cos(nt))] ( 0,π) = 1/π{ (- 1)(n+1)/n + 1/n } = (1- (-1)n)/nπ 分母はnπ、分子はnが奇数なら2,偶数なら0。 まとめると、 f(t) = Σ(1-(-1)n) /nπ sin(nt)
<三角波> 一般に、周期Tのf(t)のフーリエ級数は f(t)=a0+ Σ( an cos[ 2π n t/T ] + bn sin[ 2π n t/T] ) a0 = 1/T ∫ f(t) dt (-T/2, T/2) an = 2/T ∫ f(t) cos[ 2π n t/T ] dt ( -T/2, T/2) bn = 2/T ∫ f(t) sin[ 2π n t/T ] dt (-T/2, T/2) とされています。 (0,T/2)区間で関数f(t)を作り、f(t)を偶関数g(t)に改造する方法もあります。 いわゆる偶関数化です。T=2Lとして、(0,L)で、 f(t)=a0+Σ( an cos[ 2π n t/T ]) =a0+Σ( an cos[ π n t/L ]) a0= 1/L ∫ f(t) dt (0,L) an= 2/L ∫ f(t) cos[ πnt /L] dt (0, L) bn =2/L ∫ f(t) sin[ πnt /L] dt (0, L) もしも、L=πならば、 g(t)=a0+Σ(an cos nt)= a0 + a1cos1t + a2cos2t+ a3cos3t+ a4cos4t+.......とおきます。 a0= 1/π ∫ f(t) dt (0,π) an=2/π ∫ f(t) cos nt dt (0, π)とすると、偶関数化できる。 まず、三角波の三角形(0,0), (π/2, π/2),( π, 0)としよう。周期がπの三角形だ。 f(t) = t (0からπ/2) ;π-t (π/2, π)となるね。 g(t) = a0+ a1cos t + a2cos2t + a3cos3t + a4cos4t+............とおくとき、 a0= 1/π {∫t dt(0, π/2)+ ∫(π-t) dt(π/2, π) }= 1/π{ (π/2)2/2 +π(π-π/2)-(π2-(π/2)2)}=π/4 部分積分やsinnπ=sin0=0,cosnπ=(-1)n 、cos(nπ/2)=[0,-1,0,1]の周期などを利用する。 an =2/π {∫ t cos nt dt (0, π/2) +∫ (π-t) cos nt dt ( π ,π/2)} = 2/π{[ t(sin(nt)/n)] (0, π/2)-∫(sin(nt)/n)dt (0,π/2) +[ (π-t)(sin(nt)/n)] (π/2,π)- ∫(-(sin(nt)/n) )dt (π/2,π) } = 2/nπ{ -∫ sin(nt)dt (0, π/2) + ∫sin(nt)dt (π/2, π) } = 2/(n2π){ -[ -cos(nt) ] (0,π/2) + [-cos(nt) ] (π/2, π) } = -2/(n2π){ cos(n0)- cos(nπ/2)+ cos(nπ)-cos(nπ/2) } = -2/(n2π){ 1-2 cos(nπ/2)+ (-1)n } = 2/(n2π){ 2 cos(nπ/2)- (-1)n -1 } = 2/π{1/1(0+1-1) , 1/4(-2-1-1), 1/9 (0 +1-1), 1/16(2-1-1), 1/25(0+-1), 1/36(-2-1-1), 1/ 49(0+1-1),1/64(2-1-1),..... } =2/π{0, -4/4, 0, 0, 0, -4/36,0,0, 0, -4/100, 0,0, ........} 以上から、 g(t)=π/4- 2/π{ cos 2t + 1/32 cos 6t +1/ 52 cos 10t + ......1/ (2m+1)2 cos2(2m+1)+.......}

2.実装

質問:geogebraでノコギリ波、矩形波、三角波を表示させ、音を出すにはどうしたらよいでしょうか。 もとになる波のリストを作ります。 波の合成はΣではなく、sum(リスト)でよいでしょう。 その合計関数 wa(x)=sum(リスト)を playsound(wa, 0,2)として、 ボタンのスクリプト記述の「クリックして」に貼り付ければ2秒間wa関数の音が鳴る でしょう。 PlaySound(sin(440 2Pi x), 0, 1)とすると、A4の音が出ます。 ノコギリ波です。 スライダーを2つ用意しましょう。 n=slider(1,5,1) frq= slider(1,5,1) として、 f=220 frqとすることで、fは220の倍数になる。 fは1倍から5倍まであげられる。 一方で、無限に倍音をたすこをはできないので、nは1倍音から5倍音までたせるようにした。 para=Sequence(n) というparaという名の倍数リストをzip関数で代入しよう。 sn=Zip((1/m) sin(m f*2 π x) (-1)^(m+1),m,para) n=1のときは、para={1} sn=1/1 sin [1 220 frq *2πx] ですから、frq=2にすると、A4の音になります。 frq=2のままn =2 にすると、n=1のときの純音A4にA5の音波を負に反転して加えた音になります。 このように、n個の純音の1/n倍にして弱めながらも、たしひきした波形、ノコギリ形の音を出します。 wa(x)=Sum(sn) とすることで、純音の倍音の和で合成したノコギリ波になるね。 ・矩形波です。 一方で、mが奇数の倍音、m=2p+1にしてたせばよいでしょう。 para=Sequence(2 p+1,p,0,n) というparaという名の倍数リストをzip関数で代入しよう。 sqar=Zip((1)/(m)) sin(m f*2 π x),m,para ) で、n個の純音関数で、xを含むからsnの1個1個がxを秒とするときの波形を表す。 wa(x)=Sum(sqar) 三角波です。 一方で、mが奇数の倍音、m=2p+1にしてたせばよいでしょう。 para=Sequence(2 p+1,p,0,n) というparaという名の倍数リストをzip関数で代入しよう。 tri=Zip(-((2)/(π))*((1)/(m^(2))) cos(m f*2 π x),m,para) で、n個の純音関数で、xを含むからsnの1個1個がxを秒とするときの波形を表す。 wa(x)=((π)/(4))+Sum(tri)