scilab

先週は結婚式で、名古屋まで遠征してきた。結婚式に出るなんて30年ぶりぐらいで しょうか。

結婚式と言うより結婚ショーですな。披露宴会場から教会まで、主役の人達はリムジンでお出迎え。 観客はマイクロバスで移動。

昔は、神前結婚式を親族だけでってのが多かったと思うのだけど、今は全員参加型。賛美歌まで 謳う(合唱隊付き)なんて、。日本人は宗教にはみさかいがないのね。生まれた時はお宮様、 そして753。結婚式は教会で、最後はお寺さんにお任せ。

観客がみんなデジカメ持って、群がってた。後で、新夫婦に送ってあげるんだろね。 披露宴は、媒酌人の挨拶もなく(って、そもそも、そういう面倒な人は居ない)、仲間内風。 司会も、式場のプロに任せて、極めてスムース。両人紹介も、ビデオ。着物合わせとか、ビデオの 撮影で、4度も式場に通ったとか。大変至極であります。

3D眼鏡をかけると、キャンドルの炎がハート型に見えたり、スマイルマークに見えたり、色が 変わったり、凝った嗜好が盛りだくさんでした。

最後に、新郎新婦がバルコニーから、節分の豆まき、もとえ、ばらまきとかで、祝い菓子を 撒いてました。スーパーの袋に一杯になり、1っ月ぐらいはお菓子の調達不要状態。 このばら撒きは、名古屋の結婚式の名物だそうで、面白かったよ。

帰りは折角遠出したんで、ちょいと遊んで行くかって事で、 なばなの里って所へ寄ってみた。 しだれ梅なんて初めてお目にかかりましたよ。なかなか綺麗なものだな。それからベコニア・ガーデン ってのが絶品だった。よくもまあ、あれだけ集めたもんだ。

このガーデンは入園料が2000円、この種の施設としては随分高いなと思ったら、そのうち 1000円は金券で園内で飲食するか土産を買ってねと言う、抱き合わせ商法だった。さすが、尾張 商法(正確には、三重県桑名市だけど)。

折角の名古屋なので、手羽とゆかりとお伊勢様の赤福を土産に買ってきた。赤福を食べると 結構甘いので、箸休めに、自家製の蕗味噌を添えたら、結構な時間が過ごせましたよ。

sox 再び

前回はsoxでspectrogramの動きをgdbで追おうとして失敗した。おかしいなと思って、man を調べたんだ。そしたら、あろう事かmanが文字化け。って言うか、エスケープ文字が混じって いて、読めたものじゃない。しょうがないのでググル先生のおつげを聞いたよ。

export GROFF_NO_SGR=true

FreeBSD 9.0Rになってからmanの挙動が変わったのよとの事。.bashrcに書いとけば幸せに なれるそうです。過去の過ちは、man/catNの中に残ってるんで、消去しとけとな。 (キャッシュを消せって事)

ようやく安心してmanが読めるようになった。libsox(3)を三田んだ。 そしたらどうもいろいろなエフェクト(spectrogramもその一種)は、ライブラリーに突っ込んで あるようだ。コンパイルする時もlibtoolを操ってライブラリーを作っているし。最初に予想 してた、別プロセスを走らせているってのは大外れだった訳だ。 (trussでforkが出てくるかを調べたってのは、内緒だ。)

gdbを起動して、すぐにライブラリーにBPを置こうとしても、ライブラリーがまだロードされて いないので、拒否される。そこで、main関数(これがむやみに長いんだな)の中の要所にBPを 置いて、途中まで走らせた後、spectrogram.cにBPを置いた。

  Breakpoint 1, main (argc=4, argv=0xbfbfe7c0) at sox.c:2688
  (gdb) continue

  Breakpoint 2, main (argc=4, argv=0xbfbfe7c0) at sox.c:2826
  (gdb) continue

  Breakpoint 3, flow (effp=0x2987a3c0, ibuf=0x29917000, obuf=0x2991f000, isamp=0
  (gdb)

ここで、BP1はmain、BP2はparse_effects、BP3は、spectrogram.c中のflowだ。 どんな具合にflowまで到達したかと言うと、

  (gdb) where
  #0  flow (effp=0x2987a3c0, ibuf=0x29917000, obuf=0x2991f000, isamp=0xbfbfe610, osamp=0xbfbfe60c) at spectrogram.c:279
  #1  0x280cb0fc in flow_effect (chain=0x298ac080, n=1) at effects.c:214
  #2  0x280cb97b in sox_flow_effects (chain=0x298ac080, callback=0x804e0c0 <update_status>, client_data=0x0) at effects.c:351
  #3  0x0804f70b in process () at sox.c:1662
  #4  0x08052be5 in main (argc=4, argv=0xbfbfe7c0) at sox.c:2863

ここまで分かれば、後は地道に追いかけるだけだな。ふぅー、長い道のりだったわい。

で、追いかけてみた。spectrogram.cの中にある、startとかflowとかにBPを張らなければ ならないんだけど、Cbreak startとかすると、BPを39個も張りましたって言ってくるのね。 libの中に同じエントリー名が多数あるんで、まとめてBPを張ってくれたみたい。面白いな。

  Breakpoint 3 at 0x280bd7e2: start. (39 locations)
  (gdb) break flow
  Breakpoint 4 at 0x280c3df2: flow. (30 locations)
  3       breakpoint     keep y   <MULTIPLE>
          breakpoint already hit 1 time
  3.1                         y     0x280bd7e2 in start at bend.c:117
  3.2                         y     0x280be836 in start at biquad.c:63
  3.3                         y     0x280bf515 in start at biquads.c:164
  3.4                         y     0x280c1b24 in start at compand.c:131
   :
  3.38                        y     0x28117602 in start at cvsd-fmt.c:46
  3.39                        y     0x28130026 in start at sndfile.c:299
  4       breakpoint     keep y   <MULTIPLE>
    :

scilab

前回、色々と信号処理の関係を調べていたら、matlabってのが出てきた。でもこいつ売り物で めちゃ高いんだよな。どのぐらい高いかと言うと、アレグロCLぐらい? アレグロCLを買えない アマチュアはSBCLを使うのが定番になってる。

そんじゃ、matlabを買えないアマチュアはどうするかと言うと、GNUのオクターブかscilabってのが 定番っぽい。Pythonはscilab系のまねをしてるのが多いので、ここは迷わず、scilabだな。触って みるか。

総本山に行って取ってくる。FreeBSDにも用意されてるけど、まあWindows版 が有ればいらないな。だって、unix系でGUI使うの面倒なんでCUIしか使わんから。Windows7は、X Windowの 代わりをさせてますだ。

何か資料がいるな。探してみたよ。そしたら、 Scilab つかいませんか とか ビギナーのための科学技術計算ソフト(Scilab)の使い方講座 とか Scilab Help(日本語) とか、 Scilabの使い方 が、引っかかってきた。

scilabでは行列が普通に出てくる。行列には縁の無い生活をしてたんで、付け刃的に 行列って結局なんなの? とか 高等学校数学C 行列 を見るはめに。。。

scilabを立ち上げて、コンソールから

-->a = [1 2; 3 4]
 a  =
 
    1.    2.  
    3.    4.  
 
-->i = inv(a)
 i  =
 
  - 2.     1.   
    1.5  - 0.5  
 
-->i * a
 ans  =
 
    1.           0.  
    2.220D-16    1.  

これ、私の初めての行列です。これから、よく使うであろう行列は

-->zeros(2,2)
 ans  =
 
    0.    0.  
    0.    0.  
 
-->ones(2,2)
 ans  =
 
    1.    1.  
    1.    1.  
 
-->eye(2,2)
 ans  =
 
    1.    0.  
    0.    1.  

0の行列、1の行列、それに対角行列とな。

-->x = [1 2 3; 4 5 6; 7 8 9]
 x  =
 
    1.    2.    3.  
    4.    5.    6.  
    7.    8.    9.  
 
-->x'
 ans  =
 
    1.    4.    7.  
    2.    5.    8.  
    3.    6.    9.  

こちらは、行と列の入れ替えだな。そんじゃ、行列の応用って事で、前にやった鶴亀算です。

鶴がx匹、亀がy匹を足すと8匹、全ての足を足すと26本。鶴と亀は何匹いるかな?

  x  +   y  = 8
 2x  +  8y  = 26

これを行列で表せば

-->A = [1 1; 2 4]
 A  =
 
    1.    1.  
    2.    4.  
 
-->B = [8; 26]
 B  =
 
    8.   
    26.  

として、A・ans = B から、ans = B / A なんだけど、行列の割り算は、Aの逆行列を掛ければ いいので、答えは、

-->inv(A) * B
 ans  =
 
    3.  
    5.  

っつう事で、亀が3匹、鶴が5匹と求まる。掛け算を逆にやっちゃうと怒られてしまうので いまいち行列は嫌いだったりします。スーパーのレジでお金をもたもた払っているおばやんには 、ケリを入れたくなります、みたいな。。。。

-->B * inv(A)
           !--error 10 
一貫性がない掛け算です。

scilabで遊ぶ

SciNotesって、エディタ画面なのね。ここにスクリプトを書いて行くんだ。そして実行も 出来るんだ。デモのソースも公開されてるんで、読んでみるかな。

Xcosって、アイコンを繋ぎ合わせてシュミレーションが出来るんだな。信号を発生させて フィルターを通してオシロで観測するとかが手軽に出来る。まるで、昔やったpdみたい。

遊んでいてdemoをやると途中で固まってしまったり、実行にはFortranとかCコンパイラー が必要って言われたりして、おいらとはちと相性が悪いみたい。ほどほどにしとくかな。

それより、 numpyを極めた方が、 遊びがいがありそうだ。

おまけ

おまけで、mplayerとsoxを使って、らじる★らじるから、録音する例を載せておきます。

[sakae@secd ~]$ mplayer -ao pcm:file=/dev/stdout -really-quiet  \
 mms://a52.l12993346051.c129933.g.lm.akamaistream.net/D/52/129933/v0001/reflector:46051 \
 | rec z.mp3

Input File     : '/dev/dsp' (ossdsp)
Channels       : 2
Sample Rate    : 48000
Precision      : 16-bit
Sample Encoding: 16-bit Signed Integer PCM

In:0.00% 00:01:17.65 [00:00:00.00] Out:3.72M [   -==|==-      ]        Clip:0
[sakae@secd ~]$ soxi z.mp3

Input File     : 'z.mp3'
Channels       : 2
Sample Rate    : 48000
Precision      : 16-bit
Duration       : 00:01:17.59 = 3724416 samples ~ 5819.4 CDDA sectors
File Size      : 1.24M
Bit Rate       : 128k
Sample Encoding: MPEG audio (layer I, II or III)