sin波

デスクトップからscilabを起動する

以下コマンドを実行する。

t=0:1/44100:2;

これで、44100サンプル/秒で2秒間のサンプルのサンプリング時間のリストが作成された。

このtを使い、以下のコマンドを実行すると、2秒間分の440Hzのsin波ができる。

x=sin(2*%pi*440*t);

次に以下コマンドで、4410サンプルだけこのsin波をプロットしてみよう。

plot2d(t(1:4410),x(1:4410));

ここでplot2dを使用した。plot2dの最初の引数はx座標を、2番目の引数はy座標を指定する。ここではそれぞれ4410サンプル分の数列が指定されている。

このplot2dを実行すると以下のグラフが表示される。

サンプリング周波数

サンプリング周波数とは、1秒間のサンプルの数である。

44100サンプル/秒であれば、毎秒44100サンプルになる。

4410サンプルは何秒に相当するだろうか。

グラフに表示されている範囲は0から0.1秒の間になっている。毎秒44100サンプルの中の4410サンプルであるから、 4410/44100=0.1秒となる。

この関係を式であらわすと、サンプリングレート fs, サンプル数 N の場合、Nサンプルに相当する時間は、

N/fs

となる。

またsin関数なので-1から1の間で振動している。440Hzなので0.01秒の間には4.4回の波があるはずであるが、だいたい4回よりちょっと多い。

グラフ中でまずルーペの+印(赤丸の部分)をクリックしてから、マウスで下の図のように範囲を指定すると、その部分が拡大される。

マウスで範囲を指定する。

その範囲が拡大される。

拡大された図を見ると、0.01秒までに確かに4回と少しの周期があることがわかる。

確認できたら、このウインドウを一旦閉じる。

以下のように、最初から220サンプルだけをプロットするコマンドを実行すれば、拡大をしなくても最初から一部だけが拡大してプロットできる。

clf;
plot2d(t(1:220),x(1:220));

ここで、clfは、前のプロット画面を消すコマンドである。

このグラフを見ると、1周期はだいたい0.0023秒だ。グラフから読み取った周期から周波数を計算してみよう。周波数=1/周期だから、1/0.0023 は434であるが、これはだいたい440になり、たしかに440Hzのsin波ができている。

このウインドウは閉じないでそのまま表示しておく。

次に以下のようにxを0.5倍すると、振幅を半分にすることができる。

y=x * 0.5;

最初のyとxの220サンプルをプロットしてみよう。

clf;
plot2d(t(1:220),[x(1:220);y(1:220)]');

確かに、さきほどプロットした振幅1のsin波の上に、振幅0.5のsin波がプロットされている。

flameflag=8を使うと、プロットの上に別のプロットを重ね描きすることができる。

cos波形を重ねてプロットしてみよう。

a=cos(2*%pi*440*t);
plot2d((1:220),a(1:220),frameflag=8);

するとこのようなグラフになる。

練習問題

自分で答えを考えてから答えを見よう

時々繰り返し練習しよう

1. 880Hzのsin波を作成しなさい

2. 振幅 1/10の440Hzのsin波を作成しなさい

3. 最初の 100サンプルをプロットしなさい