Google Classroom
GeoGebraGeoGebra Classroom

周波数のちがいを感じる

このワークシートはMath by Codeの一部です。 アプレット、背景、実装の順に見ていきましょう。

周波数と音の高さの関係を感じよう

1.背景

空気の振動、波が音だ。 これは、空気をつたわって音が伝わることから実感できるでしょう。 水の波は目で見えるので、わかりやすいけれど、空気の波はどうだろうか。 大きなスピーカーで音を出すと、音を作るウーファーの振動 ウチワや扇風機を動かすときの空気とぶつかる音 早く走ると空気が風となってぶつかってくる感覚 空気も水とちがって気体だからパラパラ、サクサクしているけど、ゆるーく、つながりあっているから、 空気の疎密の波が生じるというのは想像できなくもないでしょう。 <周期T×周波数f=1秒> 1秒の長さの中に 同じ波の形(繰り返しのサイクル、周期T)がザクザクつめこまれたようす を想像してみてください。 1個の波のサイクルの長さ、周期がT=1000分の1(秒)ならば、 波のサイクルの個数、サイクル数、周波数はf=1÷1000分の1=1000(個) になりますね。つまり、fはTの逆数です。反比例の関係です。 f=1/T でもあり、T=1/fでもあるね。 ただ、単位らしいものがないので、個ではなくて、波の個数という意味でHerz、Hzをつけます。 <音の波のグラフ> 単純な音(純音)は三角関数y=sin t のようにかけます。 t秒後の音の強さがyです。このyのことを振幅といいます。最大の振幅だけを振幅ということも多いです。そうすると、ふつうの三角関数の振幅は1ですね。振幅は音の強さです。 t軸のメモリが2πになったときy=0にもどります。グラフは(0,0)と(2π, 0)を通るので、 グラフの周期は2πです。 純音をy=sin (2π t) とかいてみよう。 1秒後の音がsin(2π)=0となるので、グラフが(0,0)と(1, 0)を通り、とてもきれいになりますね。 グラフでの周期は1。 少し一般化した純音は y=a sin[ 2π f (t - t0)] のようにもかけます。 こうかくと、振幅は最大が1だったものをaにできます。 sinに与える部分が2πt だったのが[ なんとかかんとか]になってます。この[ ]の中が位相です。 また、時間の変数tをf (t- t0)とすることで、t=t0のときにt=0と同じなるので、時間軸上でt0だけ 波をシフトしたことになります。位相をずらす効果があります。 もし位相のずれがないとしたら、もう少し簡単になりますね。 y=a sin[ 2π f t] です。時間の変数tがftに変わりました。t=1/fを入れると、t=1だったときのグラフになります。 tが1/f、つまりTになるたびに、y=0になるので、 グラフは(0,0)と(T,0)を通る、 周期Tのグラフができたね。fはもちろん周波数だ。 <普通の音>今、純粋な音のグラフを考えました。 では、普通の音、いろいろ混ざった音はどうなっているのだろうか? 上のアプレットを試してみてほしい。 A1,A2、A3、A4と、 サイクル数が2倍2倍に変わると、 周期は半分半分と細か刻まれる。 ギターの開放弦の1弦と6弦は同じ音名Eだけれど、オクターブが2つ分ちがう。 それだけ、震えるスピードが2倍の2倍、4倍ちがうということだね。 つまり、サイクル数、周波数が音の高さ、オクターブを表すということだね。 実際にsin(440 *2π x) とsin(220 *2π x)を聞き比べると、2πxにかけた数が2倍になると、 音のオクターブが1つ上がってますね。 倍音というのを聞いたことがあるかもしれません。 弦楽器で、ある音を弾くと、オクターブ差の音の元が震える。つまり、 周波数がちがう音がまざっているということです。 波の形でいうと、ちがう周期の波たちが重なりあって複雑な波形になるのが普通の波だということです。 波の重なりあいのやり方は次回あつかいますが、 波がまざると、単純な往復運動のような波ではなく、振幅自体が途中で小刻みに上下したり、 場合によっては、直線のようになったり、急に音量が小さくなったり、様々あり得ます。 <音のデジタル化> さて、現実の身の回りにある音は連続的な変化だから、もとはアナログです。 でも、音のデータが膨大になるのを防ぐため、 音のデータをたて、よこにぶつ切りにします。 これをサンプリングといいますね。 振幅をぶつ切りにしたのが、量子化のけた数、データサイズ(サンプル深度) 1秒間をぶつ切りにいたのが、標本化の周波数(サンプルレート)です。 だから、サンプリングというと大げさかもしれませんが、精度を決めて録音するということですね。 (例) サンプルレートが10Hzだと1秒間に10回、音の強さを測ります。 サンプル深度はたとえば、8ビットとか16ビットなどにします。 8ビットなら2^8=256段階の強さを区別でき、 16ビットなら(2^8)^2=256^2=65536段階の強さが区別できます。 サンプルレートが1kHzなら、1秒に1000回はかるので、相当本物に近い音になりますね。

サンプリングのレートと深度を感じよう

2.実装

質問:geogebraで、純音を式で与えて音を出すにはどうたらよいでしょうか。 geogebraには playsound( 関数)というコマンドがあります。 geogebraのManualのplaysoundからの引用です。 PlaySound( <関数>, <最小値>, <最大値> ) 範囲[-1,1]の時間値関数Functionによって生成されたサウンドを再生します。 時間単位は秒で、サウンドは最小値から最大値まで再生されます。 サウンドは、毎秒8000サンプルの速度で取得される8ビットサンプルによって生成されます。 440 Hz (音符 A) の純粋な正弦波トーンを 1 秒間再生するには、PlaySound(sin(440 2Pi x), 0, 1) PlaySound( <関数>, <最小値>, <最大値>, <サンプルレート>, <サンプル深度> ) 上記の関数の指定に加えて、 サンプリング方法は「サンプル深度」と「サンプルレート」で指定します。 「サンプルレート」は1秒間に取得されるサンプル数で、8000、11025、16000、22050、44100。 「サンプル深度」はサンプルのデータサイズ(ビット単位)で、8か16です。 以上のマニュアルに従って、まず関数を「数式」部分に1つずつ入力します。 たとえば、 a=Curve(u,sin(440*2 π u),u,0,1)  b=Curve(u,sin(220*2 π u),u,0,1)  c=Curve(u,sin(110*2 π u),u,0,1)  d=Curve(u,sin(55*2 π u),u,0,1)  しかし、この関数はアプレット画面のグラフィックビューに表示するためのものです。 表示のOn/Offの切り替えのためのツールを貼り付けておきます。 なれないと困ったことがあります。画面の座標軸の間隔が1:1が基本なので、 グラフがつまった帯になってしまいます。 グラフィックビュー自体を右クリックするとメニューが現れます。「x軸:y軸」というメニューが まんなかあたりに出てきます。 0から1の間が余裕で見えるようにするには、 xとyの軸の表示倍率を変えましょう。 x軸:y軸=1:100 くらいをえらぶとよいでしょう。 つまり、1:100=0.01:1ですから、x軸の0.01とy軸の1が同じくらいの大きさに調整されて 表示されるでしょう。 グラフィックビューに「ツール」のボタンToolbar Imageを押して、 画面に貼り付けます。スクリプト記述の「ボタンをおして」(OnClicked)に、 PlaySound(sin(440 2Pi x), 0, 1) とかくと、マニュアル通りに音が出ますね。 1秒間音が出ます。