2012年11月2日金曜日

Octaveで波形を描画する

Octave(http://octave.sourceforge.net/)を使っても波形を描画できる.

というか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/octaveplay
sound.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 件のコメント:

コメントを投稿