Google ClassroomGoogle 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)