というかOctaveの方が向いているらしい.
まずは関数の定義.
function draw(freq,f,sec)
nn=1:(freq*sec);
tt=nn/freq;
plot(tt,f(1:(freq*sec)));
endfunction
function [f]=cliping(f)
for i=1:length(f)
if (f(i) > 1.0)
f(i)=1.0;
elseif (f(i) < -1.0)
f(i)=-1.0;
endif
endfor
endfunction
正弦波
fs=44100;
n=0:fs;
t=n/fs;
f1=440;
s=sin(2*pi*f1*t);
s=cliping(s);
draw(fs,s,0.01);
三角波
fs=44100;
n=0:fs;
t=n/fs;
f1=440;
s=t*0;
for k=0:10
s+=(-1)^k*(sin((2*k+1)*2*pi*f1*t)/(2*k+1)^2);
endfor
s=8/pi^2*s;
s=cliping(s);
draw(fs,s,0.01);
矩形波
fs=44100;
n=0:fs;
t=n/fs;
f1=440;
s=t*0;
for k=1:1000
s+=sin((2*k-1)*pi*f1*t)/(2*k-1);
endfor
s=4/pi*s;
s=cliping(s);
draw(fs,s,0.01);
ノコギリ波
fs=44100;
n=0:fs;
t=n/fs;
f1=440;
s=t*0;
for k=1:1000
s+=sin(2*pi*k*f1*t)/k;
endfor
s=2/pi*s;
s=cliping(s);
draw(fs,s,0.01);
さらにoctave-audioをインストールしてあると,下記でサウンド再生も可能.
sound(s,fs);これは素晴らしい.
各種波形の特徴を是非サウンドで感じてみて.
ちなみにMacOSX環境だと下記のエラーが表示されるかもしれない.
octave:7> sound(f1,fs);
ssh: connect to host air.local port 22: Connection refused
warning: broken pipe -- some output may be lost
sound_play_utility = ofsndplay -
そんなときはplayerの定義と,
$ vi ~/.octaverc
global sound_play_utility="~/bin/octaveplay";
$ mkdir ~/bin
$ vi ~/bin/octaveplay
#!/bin/sh
cat > ~/.octave_play.au
afplay ~/.octave_play.au
rm -f ~/.octave_play.au
$ chmod u+x ~/bin/octaveplaysound.mの96行目あたりにislocal=1;を書き込んでlocal modeを強制して.
$ sudo vi /opt/local/share/octave/packages/audio-1.1.4/sound.mこのファイルの
display=getenv("DISPLAY");これ以降に
colon = rindex(display,":");
if isempty(display) || colon==1
islocal = 1;
else
if colon, display = display(1:colon-1); endif
host=getenv("HOSTNAME");
if isempty(host),
[status, host] = system("uname -n");
## trim newline from end of hostname
if !isempty(host), host = host(1:length(host)-1); endif
endif
islocal = strcmp(tolower(host),tolower(display));
endif
islocal=1;を追加する.
これでサウンド再生ができるようになる.
0 件のコメント:
コメントを投稿