波形を作る
このワークシートは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)