2012年11月24日土曜日

SPARQL ResultをSIMILE Timeline Widgetで表示する

昔からあるツールだけど時系列データの可視化ツール「SIMILE Timeline Widget」はSPARQLによる問い合わせ結果をそのまま表示できるらしい.

さっそく試してみる.

問い合わせは先はdbpedia.org.

SPARQL endpointはhttp://dbpedia.org/sparqlを利用する.

問い合わせ文は以下のとおり.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf:<http://xmlns.com/foaf/0.1/>
PREFIX dbpprop: <http://dbpedia.org/property/>
select * where {
?s rdf:type foaf:Person .
?s rdf:type <http://dbpedia.org/class/yago/PeopleOfMuromachiPeriodJapan> .
?s rdfs:label  ?title.
filter(lang(?title)="ja").
?s rdfs:comment  ?description.
filter(lang(?description)="ja").
?s dbpprop:dateOfBirth ?start .
?s dbpprop:dateOfDeath ?end .
?s foaf:isPrimaryTopicOf ?link .
}
室町時代の日本人の生没年と解説を検索する.

Timelineの方は以下のとおり.


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Timeline demo</title>
<!--[if IE]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<script src="libs/timeline/api/timeline-api.js" type="text/javascript"></script>
<script type="text/javascript">
var tl;
function onLoad() {
var eventSource = new Timeline.DefaultEventSource();
var bandInfos = [
Timeline.createBandInfo({
eventSource: eventSource,
date: "Jun 1 1534 00:00:00",
width: "80%",
intervalUnit: Timeline.DateTime.YEAR,
intervalPixels: 10
}),
Timeline.createBandInfo({
overview: true,
eventSource: eventSource,
date: "Jun 1 1534 00:00:00",
width: "20%",
intervalUnit: Timeline.DateTime.YEAR,
intervalPixels: 200
})
];
bandInfos[1].syncWith = 0;
bandInfos[1].highlight = true;

tl = Timeline.create(document.getElementById("my-timeline"), bandInfos);
//var sparql="/lod/result01.xml";
var sparql="http://dbpedia.org/sparql?query=以降省略";
Timeline.loadXML(sparql,function(xml,url){eventSource.loadSPARQL(xml,url);});
}

var resizeTimerID = null;
function onResize() {
if (resizeTimerID == null) {
resizeTimerID = window.setTimeout(function() {
resizeTimerID = null;
tl.layout();
}, 500);
}
}
</script>
<style>
</style>
</head>
<body onload="onLoad();" onresize="onResize();">
<div id="my-timeline" style="height: 600px; width: 800px; border:1px solid #aaa"></div>
<noscript>
This page uses Javascript to show you a Timeline. Please enable Javascript in your browser to see the full page. Thank you.
</noscript>
</body>
</html>

結果波以下のとおり.

うーん.こんなことが簡単にできるなんて,





















色々と使えそう.

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;
を追加する.

これでサウンド再生ができるようになる.


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環境の場合ね).