2014/03/18

C言語 矩形波をつくる

矩形波

矩形波(くけいは)は、方形波、Square waveとも呼ばれている。


生成方法

基音となるサイン波に奇数倍音のサイン波を合成することで、矩形波を生成。また振幅は倍音と同じ数で割って、小さくしていく。

サイン波の合成で、矩形波をつくる

/* Square wave
 * sin波の合成による生成 
 * 32bit float RAW ヘッダなしwaveファイル出力
 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void){
  FILE *fpw;/* 書き込み用ファイルポインタ */
  float *pbuff; /* メモリのデータを指す */
  int samplingfreq = 44100;/* サンプリング周波数 */
  int sec = 10; /* 作成する波形の長さ(秒) */
  int fileSize = samplingfreq * sec; /* ファイルの大きさ */
  float a = 0.6; /* Aの値 初期振幅 */
  float note = 440;
  float step = 2 * M_PI / samplingfreq;/* 点間のステップ */
  int i;
  int j;

  /* 新規ファイル作成 */
  fpw = fopen("square_32bitF_raw.wav", "wb");
  /* 失敗時終了 */
  if (fpw == NULL) exit(EXIT_FAILURE);
  /* メモリを確保して先頭アドレスをpbuffに入れる */
  pbuff = (float*)malloc(sizeof(float) * fileSize);
  /* 失敗時終了 */
  if (pbuff == NULL) exit(EXIT_FAILURE);

  /* Square 奇数倍音の合成(15回) メモリ書き込み */
  for(i=1; i<=29; i++){
   for(j=0; j<fileSize; j++){
     if (i % 2 == 1) *(pbuff+j) += a/i * sin(i * j * step * note);
   } 
  }
  /* ファイルへ書き込み */
  fwrite(pbuff, sizeof(float), fileSize, fpw);
  /* ファイル閉じる */
  fclose(fpw);
  /* メモリ解放 */
  free(pbuff);
  return 0;
}

上記をコンパイルしてから実行すると、square_32bitF_raw.wavというファイルが同じディレクトリに作られる。注意点としてはヘッダのないwaveファイルなので、普通のミュージックプレーヤーでは再生できない。ここではRAWデータ(32bit float, Mono, Little-endian)としてAudacityで読み込んで表示させている。

サイン波を15回重ねて作った矩形波の音

下は合成回数を1から5回(9倍音)までの矩形波。はじめの1回目はサイン波だけなので合成になっていない。2回目以降から矩形波に変わっていくのが分かると思う。



C言語 ANSI C89 GCC 目次