C言語を表現した画像

あらゆる音のなかで最も単純なものとして位置づけられているのがsin波(サイン波)の音です。
サウンドプログラミングの基本として、波形と周波数特性という2つの視点からsin波の特徴について勉強してみましょう。

サイン波とは、三角関数の1つであるsin関数によって定義される波形です。
下記のように、山と谷がなめらかに周期的に繰り返すのがsin波の特徴になっています。

sin波の画像

標本化周波数をfs>とすると、ディジタル信号のサイン波は、下記のように時間nを変数とする関数として定義できます。

s(n) = a sin(2πf0n/fs) (0≦n≦N-1)

ここで、aはsin波の振幅を表しており、この大小によって「音の大きさ」は変化します。
また、f0はsin波の周波数を表しており、この大小によって音の高さは変化します。
なお、Nは音の長さを表しています。

C言語でsin波を出力するには、math.hに定義されているsin関数を利用するのが便利です。

下記にC言語でサイン波を作り出すサンプルコードを掲載します。


#include
#include
#include #include “wave.h”

int main(void)
{
  MONO_PCM pcm;
  int n;
  double a, f0;
  
  pcm.fs = 44100; /* 標本化周波数 */
  pcm.bits = 16; /* 量子化精度 */
  pcm.length = pcm.fs * 1; /* 音データの長さ */
  pcm.s = calloc(pcm.length, sizeof(double)); /* 音データ */
  
  a = 0.1; /* 振幅 */
  f0 = 500.0; /* 周波数 */
  
  /* サイン波 */
  for (n = 0; n < pcm.length; n++)   {     pcm.s[n] = a * sin(2.0 * M_PI * f0 * n / pcm.fs);   }      wave_write_16bit_mono(&pcm, "ex2_1.wave");      free(pcm.s);      return 0; }



上記のサンプルコードでは、fsを44.1kHz、aを0.1、f0を500Hz、Nを44100としてサイン波を生成するプログラムになっています。
標本化周期は標本化周波数の逆数として定義されるため、このサイン波の音の長さは1秒(=1/44100Hz × 44100)になります。

このプログラムを実行するとwaveファイルが生成されます。
このwaveファイルを再生すると、コンピュータのスピーカーからピーという笛のような音が聞こえて来ますが、これがサイン波の音です。

サイン関数と聞くと、高校の数学でさんざん苦労させられたことを思い出す方も多いかもしれません。
しかし、難しそうなイメージとは裏腹に、実はサイン波の音はあらゆる音のなかで最も単純なものとして位置づけられています。
サイン波について勉強することはサウンドプログラミングの基本といえるでしょう。