とうとう冬休みがやってきた.28日まで授業があって新年4日から…やっけ?
まあ,来年のことは話さないとして(というか,冬休みの長さについて再確認もしたくないので),
細かい日付はおいておこう.
ともかく,クリスマスを過ぎて授業があり,新年も早くから授業がある.
これは異常事態で,今年なぜこういうことになっているのかはわからないけれども,
かなりの先生方がぼやくレベルに,珍しいことらしい.
京大やのにこんなに勤勉に授業やるなんて,という意見と,
京大やから別に定められた冬休みの長さとか関係ないやん,という意見があるが
(そして先生方ももう人来ないだろうなというか来なくていいよという雰囲気出しまくっておられるが),
その冬休みが,今日始まった.
とりあえずするべきなのは,年賀状を始めとする新年への準備,
そして1月提出のレポートをやっておくこと.
あとは,仏語をしたい.ついでに線形代数も.
仏語はひと通りの時制と法をやったので,あとは単語の知識をががっと増やすと
読むに当たってのストレスがずいぶん減るはず.
まずは Le petit prince かな.夏ごろから不真面目に英語版と並行しつつ眺めてるんだけれど,
精読,あるいは仏語版だけで読むようなことをしたい.
仏語の活用表作って眺めて,英語の何が対応するのかな,ということを考えてたら,
古英語の勉強をしたくなるのだけれども,これについては別記事にまとめたほうがあとから読みやすかろう.
周りの友人がどんどん帰省していく.僕は京都で新年を迎えることになるけれども,
京都から学生がどんどん全国に散って行ってるんやろな,というのを想像するとどこか楽しい.
住処が故郷になって,友達には「高校の」と但し書きがつくようになって,
日常が懐かしさにすり替わる瞬間は,誰も見ることができないのだろう.
しかしまさか大学に入ってこんなに冬休みが短くなるとは思わなかったよ!!!
2学期制やから冬休みはないもんや,と思ってた時期もあったけど.
Waterman の黒もなかなか色が冴えてていい.
Wednesday, 28 December 2011
Tuesday, 27 December 2011
scilab analysing .wav #5
先だってのプログラムに,バグがあったらしい.
.sce の最初に global 変数を宣言したのだが,どうもそれを使う際にも(つまり各関数で値を入れるときにも)
global である旨宣言する必要があるらしく,
wavreader のはじめに
もともと入れてたのだが,これ抜いてもいけるんじゃね,とおもって書き換え,
コンパイルする前なのを忘れてそれをここに上げてしまった,というのが実情.
キーボード叩いてると手が冷える.PCもピアノも同じ.そんな季節である.
.sce の最初に global 変数を宣言したのだが,どうもそれを使う際にも(つまり各関数で値を入れるときにも)
global である旨宣言する必要があるらしく,
wavreader のはじめに
global sound1 fs time pow;wavjudger の始めにはglobal judge;wavcutter の初めに
globaol syllable;が必要.
もともと入れてたのだが,これ抜いてもいけるんじゃね,とおもって書き換え,
コンパイルする前なのを忘れてそれをここに上げてしまった,というのが実情.
キーボード叩いてると手が冷える.PCもピアノも同じ.そんな季節である.
untitled
本来ならレポートを書かなくてはならないところなのだけれど,
先程から30分ほど, 雨音を聴きながら,手を眺めてぼうっとしてる.
何をするわけでもなく呼吸と時間の流れだけを眺めてた.
いやだからどうってこともないけど
でもこういうの好き.そらそうか,多分誰でもそうなんだろう.
噤むべきでないときに噤んでしまった口はそのうち喋り出す.
眠いんですわ,要するに.
それでも,昨日と今日は(日付的には一日ずれるけど) いい日.
先程から30分ほど, 雨音を聴きながら,手を眺めてぼうっとしてる.
何をするわけでもなく呼吸と時間の流れだけを眺めてた.
いやだからどうってこともないけど
でもこういうの好き.そらそうか,多分誰でもそうなんだろう.
噤むべきでないときに噤んでしまった口はそのうち喋り出す.
眠いんですわ,要するに.
それでも,昨日と今日は(日付的には一日ずれるけど) いい日.
Sunday, 25 December 2011
Merry Christmas !
そうだ,皆さん, メリークリスマス.
Although it's been said, many times, many ways ....
Merry Christmas to you.
Although it's been said, many times, many ways ....
Merry Christmas to you.
あなたと話したいことが,山ほどある.むしろ話を聞きたい.
scilab analysing .wav #4
この前の関数に手を加え,区切られた音ごとにデータを取り出すところまで伸ばした.
取り出されたデータはそれぞれ別にウィンドウ開いて波形が表示される(スキップも可能).
ただこれ全部一つの行列に収めたから,
音として区切られた部分の中で一番長いの以外は最後に0が意味なく並んだ部分ができる.
これも後で切りたいなぁ.
ついでに重要変数を global 化して,関数実行の後も使えるように.
さらに global 化したことによって,手順ごとに別の関数に分けることができるようになったので,
それも行った.また,「近傍」の長さを秒数で指定することもできるようにした.だいぶ良い感じ.
これが実際音を区切ったりするのに最終的に使えるかは別にして,
やってて楽しいし,少なくとも幾許かの練習にはなった.
あとは,取り出した音の分析とかをやりたいところですね.
今回のメモとしては,
ちなみに,切れたやつを
取り出されたデータはそれぞれ別にウィンドウ開いて波形が表示される(スキップも可能).
ただこれ全部一つの行列に収めたから,
音として区切られた部分の中で一番長いの以外は最後に0が意味なく並んだ部分ができる.
これも後で切りたいなぁ.
ついでに重要変数を global 化して,関数実行の後も使えるように.
さらに global 化したことによって,手順ごとに別の関数に分けることができるようになったので,
それも行った.また,「近傍」の長さを秒数で指定することもできるようにした.だいぶ良い感じ.
これが実際音を区切ったりするのに最終的に使えるかは別にして,
やってて楽しいし,少なくとも幾許かの練習にはなった.
あとは,取り出した音の分析とかをやりたいところですね.
今回のメモとしては,
- global a b c d; で global 変数 a,b,c,dを宣言できる.
- scf(i); で i 番目のグラフィックウィンドウで描画.
- global の宣言は関数外でしないと無効(?)
//________________________________________________________scf(i) 使った for 文の所で, グラフィックウィンドウが次々開くのはなかなか壮観である.
//25th December 2011.copyright mutsuteru
//(the author of the blog,http://lesguillemets.blogspot.com/ ,
//and the one who is tweeting @exumbra_insolem)
//all rights reserved.
//Published for personal use only.
//Sharing any outcome using this program or programs based on this
//without explicit permission from the author is prohibited.
//Well, I love this kind of statement.. lol
//___________________________________________________________
//
// README:
// the global variables are as follows:
// i) defined in function wavreader
// sound1 : the .wav file, read by wavread command.
// fs : the sampling rate of the .wav file.
// pow : = sound1^2 .
// ii) defined in function wavjudger
// judge : a vector.
// its components correspond to those of sound1.
// 0 for silence, nonzero for sound.
// iii) defined in function wavcutter
// syllable: records each 'syllable'.
//____________________________________________________________
global sound1 fs time pow judge syllable;
function wavreader
a=input("INPUT 1 TO clf, OTHER VALUE TO CONTINUE WITHOUT clf")
if a==1 then clf;
end
[sound1,fs,nbits] = wavread(input("FILE?"));
time=length(sound1)/fs;
printf("sampling rate = %d",fs);
printf("the length of the file in second = %f",time);
if size(sound1,"r")==2 then..
sound2=sound1(2,:);
sound1=sound1(1,:);//for stereo sound
end
disp("NOW PLOTTING THE WAV FILE....");
plot2d(sound1);//this program fill handle sound1 only.
disp("CALCULATING THE 2ND POWER OF THE .WAV...")
pow=sound1^2;
disp("OK.END OF FUNCTION.")
endfunction
//_______________________________________
function wavjudger
//this function judges the sound+ areas.
//requires sound1, fs, time, pow as global variables.
//those are defined in function wavreader.
//defines judge as a global variable.
a=input("INPUT 1 TO CONTINUE(DEFAULT), 2 TO clf THEN CONTINUE ..
3 TO clf, plot sound1 AND CONTINUE");
select a,
case 2 then clf;
case 3 then..
clf;
disp("PLOTTING sound1....")
plot2d(sound1);
end
printf("NOW WE NEED THE DEFINITION OF <NEIGHBOUR>.\n..
SELECT THE WAY TO SPECIFY.\n..
INPUT 1 TO SPECIFY BY TIME.\n..
INPUT 2 TO SPECIFY BY THE RATIO TO THE WHOLE .WAV.");
while %T,..
a=input("INPUT?")
select a,
case 1 then..
printf("THE SAMPLING RATE IS %d\n",fs);
printf("THE LENGTH OF THE FILE IS %f sec\n",time);
s=input("INPUT THE TIME (IN SEC) WIDTH OF NEIGHBOUR.")
chop=fs*s;
break;
case 2 then..
printf("THE SAMPLING RATE IS %d\n",fs);
printf("THE LENGTH OF THE FILE IS %f sec\n",time);
n=input("HOW MANY CUTS? PLEASE INPUT.")
chop=length(pow)/n;
break;
else..
disp("UNEXPECTED VALUE.PLEASE INPUT AGAIN.")
end
end
threshold=input("THE THRESHOLD?")
judge=zeros(pow);
showjudge=max(sound1);
disp("NOW JUDGING....PLEASE WAIT....");
for i=1:length(pow)
if..
mean(pow(max(i-chop/2,1):min(i+chop/2,length(pow))))..
>threshold..
then judge(1,i)=showjudge;
end
end
disp("FINISHED. NOW PLOTTING.....")
plot2d(judge);
disp("OK. END OF FUNCTION.");
endfunction
//____________________________________________________
function wavcutter
//requires sound1, judge as global variables.
//produces syllable as a global variable.
cuten=[0,judge];
cutpoint=[];
disp("NOW FINDING THE CUTPOINT....")
for i=2:length(cuten)
if cuten(1,i-1)==0 & cuten(1,i)~=0 then..
cutpoint($+1,1)=i-1;
elseif cuten(1,i-1)~=0 & cuten(1,i)==0 then..
cutpoint($,2)=i-1;
end
end
if cutpoint($,2)==0 then cutpoint($,2)=length(judge);
end
disp(cutpoint);
disp("NOW CONTINUE. I WILL GET THE DATA FOR YOU.")
disp("THE DATA WILL BE COLLECTED IN VARIABLE syllable.")
a=input("OK? IF NOT, INPUT 0.")
if a==0 then return;
end
disp("OK.PRODUCING syllable....");
syllable=[];
for i=1:size(cutpoint,"r")
syllable($+1,1:1+(cutpoint(i,2)-cutpoint(i,1)))..
=sound1(cutpoint(i,1):cutpoint(i,2));
end
disp("NOW PLOT EACH SYLLABLE. OK ? ");
a=input("INPUT 0 TO RETURN.");
if a==0 then return;
end
for i=1:size(syllable,"r")
scf(i);
plot2d(syllable(i,:));
end
disp("END OF FUNCTION.")
endfunction
function wavreadjudgecut
wavreader;
a=input("INPUT 1 to CONTINUE");
if a~=1 then return;
end
wavjudger;
a=input("INPUT 1 TO CONTINUE.");
if a~=1 then return;
end
wavcutter;
endfunction
ちなみに,切れたやつを
playsnd(syllable(i,:),fs)で再生していくと,割合母音に対応して切れてて楽しかった.
Saturday, 24 December 2011
scilab: analysing .wav files #3
続きとして,「有音と判定された部分を取り出す」ことを試みる.
取り敢えず, さっきの judge の値が 0 かそうでないかを手がかりにして,
切れ目を別の変数 cutpoint に記録してみる.
そこからデータを切り出すのはまた次の段階として.
この時, judge の最初,或いは最後が有音判定されてるとめんどくさい.
ここでは judge の最初に 0 を足したベクトル cuten を作ってそれを使い,
最後は別個に対処する(最後の if 文).
以下の部分は,直前の投稿 の最後の endfunction を切り取ったものに繋いで動かす.
実用的には, judge, sound1 とかをグローバル変数として定義し,
判定部,と,それを切り出す部分は別関数にするのが使いやすいだろうが,
グローバル変数を扱うのは初めてなので,一旦同じ関数に入れ込むことにしよう.
では,以下ソース.利用上の規約(笑)は前のと一緒でお願いします.
出力とグラフ見比べると,正しく動作しているようだ.
取り敢えず, さっきの judge の値が 0 かそうでないかを手がかりにして,
切れ目を別の変数 cutpoint に記録してみる.
そこからデータを切り出すのはまた次の段階として.
この時, judge の最初,或いは最後が有音判定されてるとめんどくさい.
ここでは judge の最初に 0 を足したベクトル cuten を作ってそれを使い,
最後は別個に対処する(最後の if 文).
以下の部分は,直前の投稿 の最後の endfunction を切り取ったものに繋いで動かす.
実用的には, judge, sound1 とかをグローバル変数として定義し,
判定部,と,それを切り出す部分は別関数にするのが使いやすいだろうが,
グローバル変数を扱うのは初めてなので,一旦同じ関数に入れ込むことにしよう.
では,以下ソース.利用上の規約(笑)は前のと一緒でお願いします.
a=input("INPUT 1 TO CONTINUE, OTHER VALUE TO RETURN")途中アホなことを(cutpoint の最初を切ってみたり)して debug に苦労したけど,
if a~=1 then return;
end
cuten=[0,judge];
cutpoint=[];
for i=2:length(cuten)
if cuten(1,i-1)==0 & cuten(1,i)~=0 then..
cutpoint($+1,1)=i-1;
elseif cuten(1,i-1)~=0 & cuten(1,i)==0 then..
cutpoint($,2)=i-1;
end
end
if cutpoint($,2)==0 then cutpoint($,2)=length(judge);
end
disp(cutpoint);
endfunction
出力とグラフ見比べると,正しく動作しているようだ.
Friday, 23 December 2011
scilab: analysing .wav #2
scilab でちょっと前にやった,(主に声の録音を想定して).wav から有声部を判定するのを,
もうちょっと整備して一つの関数の形にした.主な変更点は
今回前と同じファイルでやってみたらこんな感じ.まあ当然結果は似たようになる.
この場合閾値は0.001ならいい感じ, 0.01 は大きすぎるみたい.
二乗してるのも効いてるだろう.
次は
for 文よりは行列で計算する方が 10~100 倍とか速いらしい (source はこちら <pdf> ) ので,
その点について特に色々考えたい.
<追記:16:19 ,閾値の適切な値の例示を修正(それぞれ 0.1 倍),さらにプログラムの一部変更.
具体的には15行目 付近.変更点にもその内容を追加.
ステレオ,モノラル両方に対応できるプログラムにした.>
もうちょっと整備して一つの関数の形にした.主な変更点は
- 関数の形にした.
- 読み込む音声ファイルを入力して選べるように改善.
- ステレオ・モノラル両方に対応
- プログラム実行の進捗状況を逐次報告するように変更.
- 閾値,音声ファイルの何分の一を「近傍」とするかを入力して指定するように変更.
- 変数名を幾つか変更.
- サンプリングレートを最初に表示する機能を追加.
function reader流石に,色分けも何も無いと読みにくくて仕方がないが.
//23rd December 2011.copyright mutsuteru
//(the author of the blog,http://lesguillemets.blogspot.com/ ,
//and the one who is tweeting @exumbra_insolem)
//all rights reserved.
//Published for personal use only.
//Sharing any outcome using this program or programs based on this
//without explicit permission from the author is prohibited.
//Well, I love this kind of statement.. lol
a=input("INPUT 1 TO clf, OTHER VALUE TO CONTINUE WITHOUT clf")
if a==1 then clf;
end
[sound1,fs,nbits] = wavread(input("FILE?"));
printf("sampling rate = %d",fs);
if size(sound1,"r")==2 then..
sound2=sound1(2,:);
sound1=sound1(1,:);//for stereo sound
end
disp("NOW PLOTTING THE WAV FILE....");
plot2d(sound1);//this program fill handle sound1 only.
a=input("INPUT 1 TO CONTINUE, OTHER VALUE TO RETURN");
if a~=1 then return;
end
disp("CALCULATING THE 2ND POWER OF THE .WAV...")
pow=sound1^2;
disp("OK.")
n=input("HOW MANY SLICES?")
threshold=input("THE THRESHOLD?")
chop=length(pow)/n;
judge=zeros(pow);
showjudge=max(sound1);
disp("NOW JUDGEING....PLEASE WAIT....");
for i=1:length(pow)
if..
mean(pow(max(i-chop/2,1):min(i+chop/2,length(pow))))..
>threshold..
then judge(1,i)=showjudge;
end
end
disp("FINISHED. NOW PLOTTING.....")
plot2d(judge);
endfunction
今回前と同じファイルでやってみたらこんな感じ.まあ当然結果は似たようになる.
この場合閾値は0.001ならいい感じ, 0.01 は大きすぎるみたい.
二乗してるのも効いてるだろう.
次は
- このアルゴリズムの根本的改善,
- 発声部と判断したところだけを抽出して新たな .wav を作るアルゴリズムの制作,
- 音の大きさ以外のところからの分析の方法 (fourier 変換とか使える)の策定
for 文よりは行列で計算する方が 10~100 倍とか速いらしい (source はこちら <pdf> ) ので,
その点について特に色々考えたい.
<追記:16:19 ,閾値の適切な値の例示を修正(それぞれ 0.1 倍),さらにプログラムの一部変更.
具体的には15行目 付近.変更点にもその内容を追加.
ステレオ,モノラル両方に対応できるプログラムにした.>
Thursday, 22 December 2011
untitled
今日は冬至,ということでゆず湯に入った.
柚子というのはなんとも,喜ばしい色をしているものである.
とか思いながら,お風呂に浮かんだ柚子をくるくる回しながら遊んでたら
何か面白いことを思いついた………のだけれども忘れてしまった.
最近キーボード打つときに薬指の使用頻度が以前よりだいぶ上がってる気がする.
体調には気をつけて.体調崩してる人は,早く治りますように.
メモ書きを名乗ってると一日に何回も投稿→数日空白 とかもしやすくてよろしい.
柚子というのはなんとも,喜ばしい色をしているものである.
とか思いながら,お風呂に浮かんだ柚子をくるくる回しながら遊んでたら
何か面白いことを思いついた………のだけれども忘れてしまった.
最近キーボード打つときに薬指の使用頻度が以前よりだいぶ上がってる気がする.
体調には気をつけて.体調崩してる人は,早く治りますように.
メモ書きを名乗ってると一日に何回も投稿→数日空白 とかもしやすくてよろしい.
ymmathnote.sty
微積,といえば,(行列たくさん扱う線形代数と違って)微積の授業は比較的 TeX 化しやすいため,
授業と平行して,ノートを TeX で 取ることがしばしばある.
無論この時は結構早く打つのが必要なので, 省入力のためだけのスタイルファイルを用意してる.
現時点の version 保存の意味を兼ねてここにあげてみよう.
ここを見ている人が使うのは自由(というか,気に入ったらどしどし使ってやってください)ですが,
利用者が作ったものとして更に配布したりするのはやめてください.
以下,ymmathnote.sty
基本的には競合して不便,という事にはならないはず.
軽く解説すると,
定理を述べる際に,ひと通りの条件を左詰め複数行で書くのを,
今はだいたい array とか使ってやってるんだが,それをもう少し整備したまとまりある命令とか,
カウンタ勉強して自前の定理環境とか,まあ他にも色々.
結構 LaTeX は長期的に「はまってる」っていっていいんじゃないか,と思っている.
授業と平行して,ノートを TeX で 取ることがしばしばある.
無論この時は結構早く打つのが必要なので, 省入力のためだけのスタイルファイルを用意してる.
現時点の version 保存の意味を兼ねてここにあげてみよう.
ここを見ている人が使うのは自由(というか,気に入ったらどしどし使ってやってください)ですが,
利用者が作ったものとして更に配布したりするのはやめてください.
以下,ymmathnote.sty
全部,ここで使うパッケージと LaTeX 標準の命令と被らないように作ってあるから,
\usepackage{amsmath,amssymb,type1cm,bm}
\newcommand{\pdif}[2]{\frac{\partial{#1}}{\partial{#2}}}\newcommand{\dpdif}[2]{\dfrac{\partial{#1}}{\partial{#2}}}
\newcommand{\bite}{\begin{itemize}}\newcommand{\eite}{\end{itemize}}\newcommand{\under}[1]{\begin{itemize}\item {#1}\end{itemize}}\newcommand{\bien}{\begin{itemize}}\newcommand{\enen}{\end{itemize}}\newcommand{\brac}[1]{\left({#1}\right)}\newcommand{\bbrac}[1]{\bigl({#1}\bigr)}\newcommand{\Bbrac}[1]{\Bigl({#1}\Bigr)}\newcommand{\abs}[1]{\left|{#1}\right|}
基本的には競合して不便,という事にはならないはず.
軽く解説すると,
- まず amsmath, amssymb, type1cm, bm(数式中\bm{hoge}で太字.) を使う.
- \pdif{a}{b}で a の b での偏微分∂a/∂b (partial differentiation), \dpdif はその\displayle 版.
- \bite, \eite は \begin{itemize}, \end{itemize}の省入力.
- \under は itemize 環境の縮約版. \begin と\end と\item までセットにしてる.{}の中に複数 \itemをいれこむことで普通の itemize 環境としても使えるけどソースが見難くなるから非推奨
- \bien, \enen は \begin{enumerate}, \end{enumerate}の省入力.それじゃあ been やんか,って言うたらだめです.\bite に引きずられましたごめんなさい(( \beenが defined かどうか確かめるのが面倒なので,と,\bien というのを打つのに慣れたので一旦はこのままで.
- \brac{hoge} で\right,\left つかって大きさが調節される小括弧 (bracket)で囲む.
- \bbrac, \Bbrac はそれぞれ,小括弧を \bigl と \bigr,\Bigl と \Bigr で大きさ変えたもの.時々\left, \right では思った大きさにならないことがあるのでそういう時に.
- \abs{hoge} は絶対値(absolute value).これも \left, \right での大きさ調整込み.
と,まあこんなもん.
授業の回に応じて, \bm{x}とか,f(x,y,z) とかを出力する命令を別個に作ると
(ソース作る姿勢としてはアウトかもしれないけど),さらにはかどります.
ここにあるのは,様々な範囲で使えて,かつ実績がある人らばかりで,
実際にノート取ってる時は臨時で色んな命令が登場します.ここにいるのはそのレギュラーという感じ.
\bite,\eite,\bien,\enen は他の教科のノート取りにも汎用性が高く,気に入ってる命令たちである.
もとは,\int とその後の数式までの間を詰める \Int (\int \!\! )とかあったりしたのだが,
それはずいぶん慣れて,後に続く式の形,とか,定積分なら上下に何がついてるか,とかによって
\! の数を変えるようになってきた(し,\! うつ速度も上がってきた)ので外した.
好みにもよるけど,不定積分なら \! 2個か3個,
定積分は付いてるものの大きさによるがだいたい4~5 ,くらいがバランスいい気がする.
特に定積分でのスペース調整はこだわりどころ.
dx とかの前には \, 入れてちょっと区切りを作るのも忘れないようにしたいですね(以下数分略
あとスタイルファイルとして追加したいのは,例えば itemize 環境の中で直接別行立て数式打つときに
\item \[ \int_1^a f(x)\,dx\]とかやると・と数式の間に垂直方向に隙間が空くので,それの調整含めた\item 系統とか,
定理を述べる際に,ひと通りの条件を左詰め複数行で書くのを,
今はだいたい array とか使ってやってるんだが,それをもう少し整備したまとまりある命令とか,
カウンタ勉強して自前の定理環境とか,まあ他にも色々.
結構 LaTeX は長期的に「はまってる」っていっていいんじゃないか,と思っている.
Subscribe to:
Posts (Atom)