ichou1のブログ

主に音声認識、時々、データ分析のことを書く

音を作る

純音(一つの正弦波だけで作られる音)を作る

1.ソース
  • ピアノ鍵盤でいうところの「ラ」の音(周波数 880Hz)
  • サンプリング周波数 : 16k(1秒間にいくつ区切るか、電話だと8k、今回は毎秒16000回サンプル)
  • 1秒間鳴らす
  • 値の範囲は「1〜255」(後ほどodコマンドで確認)
#include <stdio.h>
#include <math.h>

int main(){

	int smp_freq = 16000;
	int smp_cnt, iv;
	double freq = 880;
	double len = 1.0;
	double sec, v;

	smp_cnt = 1;
	do{
		sec = (double)smp_cnt / smp_freq;
		v = sin(2* M_PI * freq * sec);
		iv = 128 + (int)(v * 127);
		putchar(iv);
		smp_cnt++;
	}while(sec < len);
	return 0;
} /* end of main */
2.コンパイル
gcc -o prog_sin prog_sin.c -lm
3.RAWデータ(ヘッダなし)を作る
./prog_sin > 880_16k.raw
od -t u1 880_16k.raw

f:id:ichou1:20170806110719p:plain

gnuplotで出力
f:id:ichou1:20170806111729p:plain

4.WAVヘッダを付ける
sox -r 16000 -c 1 --bits 8 -e unsigned 880_16k.raw 880_16k.wav

「1〜255」なので、1Byte(unsigned char)で表現可能

5.再生
aplay 880_16k.wav

再生中の出力

再生中 WAVE '880_16k.wav' : Unsigned 8 bit, レート 16000 Hz, モノラル