Waveデータをこんな感じ↓でプロットするプログラム。まず、16bitのステレオ(2ch)で録った5MB(5242880byte)のデータを、以下のサイズの表に描くことを例に考えよう。 y軸(振幅方向)について 16bitのサンプリングは-32768〜32767の範囲で振幅値が表現されている。 よって表のy軸の真ん中が振幅0値となり、その上下に正負のデータをそれぞれ100pxに表すことになる。 そこで、正のデータ(最大値32767)の振幅値を100px以内に収めるために、2の9乗に縮小する計算をした。 32767÷2の9乗=63.998046875こうすれば、振幅値の32767を約64pxで図に表現できる。 ちなみに2の8乗だと 32767÷2の8乗=127.99609375 なので表からはみだしてしまう。 なので、100pxの場合は2の9乗が良いだろう。 x軸(時間方向)について x軸1000pxの範囲に全てのデータを表現するのだから、1つのピクセルにいくつのデータを表現するかを計算する。 これは全体のデータ数を、x軸のピクセル数で割のだから、 5242880byte ÷ 2ch ÷ 2byte(16bit) ÷ 1000px = 1310.72となる。 (この例のデータは、ステレオ(2ch)で1サンプルが16bitであることの考慮を忘れずに) そして、約1311個のデータを1pxに表現するため、この範囲の振幅値の最大値と最小値を求め1本の線を引く。 これを最後のデータまで繰り返し行えば波形が描ける。 |
|
この考えで(細かいことは抜きにして)プログラムにすると、こんな感じWaveCreate.cppになる。 これはそのリソースresource.hとresource.rcだ。
|