矩形波
矩形波(くけいは)は、方形波、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 目次