2012年11月1日木曜日

Rで波形を描画する




Rを使って色々な波形を描画しようと思う.

まずは基本パラメータを設定する.

サンプリング回数は44.1kHz,
描画する波形の周波数は440Hzとする.
作成する波形は1秒間とする.
freq=44100;
nn=1:freq;
tt=nn/freq;
f1=440;
描画用の関数とクリッピング用の関数を定義する.

draw<-function(s,sec){
freq=44100;
nn=1:(freq*sec);
tt=nn/freq;    
plot(tt,s[1:(freq*sec)],type="l",col="blue");
}
cliping<-function(s){
for(i in 1:length(s)){
           if(s[i] > 1.0 ) s[i]=1.0;
           if(s[i] < -1.0 ) s[i]=-1.0;
}
return(s);
}

これで準備は整った.

まずは正弦波を描画する.
描画する波形は0.01秒分としている.
http://en.wikipedia.org/wiki/Sine_wave
s=sin(2*pi*tt*f1);
s=cliping(s);
draw(s,0.01);
つぎは三角波.
http://en.wikipedia.org/wiki/Triangle_wave
s=tt*0;
for(k in 0:10){
s=(-1)^k*(sin((2*k+1)*2*pi*f1*tt)/(2*k+1)^2)+s;
}
s=8/pi^2*s;
s=cliping(s);
draw(s,0.01);
つぎは矩形波.
http://en.wikipedia.org/wiki/Square_wave
s=tt*0;
for(k in 1:1000){
      s=s+sin((2*k-1)*pi*f1*tt)/(2*k-1);
}
s=4/pi*s;
s=cliping(s);
draw(s,0.01);
最後はノコギリ波.

http://en.wikipedia.org/wiki/Sawtooth_wave

s=tt*0;
for(k in 1:1000){
s=s+sin(2*pi*k*f1*tt)/k;
}
s=2/pi*s;
s=cliping(s);
draw(s,0.01);

こんなことが簡単にできてしまうのだからRは面白い.





波形データは以下で書き出せる.
write(s,"wav.txt",ncolumns=1);
書き出したファイルはtxt2wavでwavファイルに変換できる.

txt2wav.cのコンパイルは
$ gcc -m32 -o txt2wav txt2wav.c 
な感じで(64bit環境の場合ね).

0 件のコメント:

コメントを投稿