遊び tokidoki 仕事

数学と音楽と教育と遊び

| おしごと - きょういく - がくせい - ゼミ - イベント | すうがく - おんがく - 数理音楽 - DTM - かがく - scratch
| Art - photo - おきにー - Tips - ものもう - あれこれ | About - Top

開口端でも気柱共鳴が起こるのはなぜ?

今年の卒論ネタの一つから.
金管などいわゆる開口端の楽器はマウスピースやリードからの振動を共鳴器で拡大させて特定の周波数の音を出すように作られているわけだが,それは反射波との共鳴によってなされるとされている.しかし,普通に考えると何の壁もない開口端で,どうして反射波が発生するのだろう,という素朴な疑問が起こるものである.確かにネットで検索すると,固定端反射するとか,壁がないのだから自由端反射だとか諸説流布されている.
で,なんだか分からなくなってきたので,仕方ないから実際に波動方程式からシミュレーションしてみることにした.
それが↓.processingで久しぶりに作ってみた.


上スクリーンでは真ん中に開口端の管を置き,開始直後に管左端でパルスを発生させ,それが波動方程式に従ってどう発展していくのかをシミュレーションしている.ただし,圧力波として表現しているので管の壁では自由端反射させた(作用・反作用の法則によって).残念ながら今のところ,スクリーンが有限なために起こる境界条件が上手く設定できていなくて,本当は無いはずの反射が薄っすらとスクリーン端でも起こってしまっている.

上スクリーンを横切っている水色線はマウスの Y座標に伴って上下に移動し,下のスクリーンにその水色線で切断した波面のグラフが描かれるようにした.これで,管内での圧力波の変化がよく分かる.
そして,その結果として見えるのは,確かに開口端であってもそこで圧力波が反射していること,しかも固定端反射のように振る舞っていることが見える.


f:id:okiraku894:20201222171319p:plain

パルスの山はチューブ内を順調に進むが,開口端へ達っした途端,急激に山が谷へと変化するのが見える.固定端反射のようだ.
因みに,マウス右ドラッグでその場にパルスを加えて,さらなる波を起こすようにも作ってみた.

さて,この様子をじっと見ていると開口端で何が起こっているのか色々分かってくる.
まず,開口端へ達するとチューブの壁が消えて一気に空間が広がるので,波はチューブ内の平面波から球面波へと変化する.そのとき,より広い面積の「まだ圧力変化していない」媒質に触れることになる.チューブ内から出てきた平面波からすると,突然圧力変化を起こし辛くなってくる,ということだ.このことが壁のような働きをするのだろうと思われる.

媒質がいたるところバネのようなものだったと考えれば,チューブ内一定のバネ定数が開口端で急に大きなバネ定数に変化したということだろうか.チューブ内の柔らかいバネからチューブ外の硬いバネに波を伝えようとしているような感じだ.

そう思ってさらに検索を続けると,インピーダンスなる概念が出てきて電気回路に代替して説明していたりする.波の伝わりにくさをインピーダンスとして表現するというわけだ.

ところで元になる波動方程式

 \displaystyle
\frac{\partial^2}{\partial t^2}\phi(x,y,t)=c^2\left(\frac{\partial^2}{\partial x^2}+\frac{\partial^2}{\partial y^2}\right)\phi(x,y,t)

は,シミュレーションではもちろん差分化して解くのだけど,それは
 \displaystyle
\text{位置 $(x,y)$,時刻 $t$ での値 $\phi(x,y,t)\to$ セル $(i,j)$,時刻 $n$ での値 $p_{i,j}^n$}
と対応させ,
 \displaystyle
p_{i,j}^{n+1}-2p_{i,j}^n+p_{i,j}^{n-1}=c'^2\left(p_{i+1,j}^n+p_{i-1,j}^n+p_{i,j+1}^n+p_{i,j-1}^n-4p_{i,j}^n\right)

すなわち,漸化式
 \displaystyle
p_{i,j}^{n+1}=c'^2\left(p_{i+1,j}^n+p_{i-1,j}^n+p_{i,j+1}^n+p_{i,j-1}^n\right)+(2-4c'^2)p_{i,j}^n-p_{i,j}^{n-1}

によって計算していくことになる.ただし,今回のシミュレーションでは,あまり根拠なく c'^2=1/4とした.

AIは電気羊の夢を見るか

今週,ゼミ生6名の卒論の提出がとりあえず完結した(とりあえず).
決まったタイトル一覧.

  • 「ボーッと跳んでんじゃねーよ!ー跳躍軌道と踏切動作の力学モデルー」
  • 「フェロモンは裏切らないー蟻コロニーモデルを用いた巡回セールスマン問題の解法ー」
  • 「オオハシくんには騙されないー簡易ダウトゲームの必勝戦略ー」
  • 「AIは電気羊の夢を見るか―誤差逆伝搬学習法とニューラルネットワーク―」
  • 「数のダークマター,超越数ー無理数度,リュービル数,そしてリンデマンー」
  • 「勝利の女神はあなたにハニカム?ーHEXの必勝戦略と不動点定理ー」

で,AIをネタにした卒論がこのエントリーのタイトル.
ピンとくる人はピンとくる,あの名作「ブレードランナー」の原作タイトルのパロディーだ.
アンドロイドは電気羊の夢を見るか? (ハヤカワ文庫 SF (229))

アンドロイドは電気羊の夢を見るか? (ハヤカワ文庫 SF (229))

この映画が公開された当時の80年台,確かに第2次AIブームがあった.
当然自分も惹かれた分野だったのだけど,蓋を開けてみれば,その当時のAIはひたすら人間が場合分けを尽くしてそれをプログラムするといった,子供ながらに実に不毛だと思われる作業の繰り返しだった.
主にLISPで書かれたそれらプログラムは,「未来はそっちじゃない」と,そう確信できてしまうものばかりだった.

かつて子供の私は,人工知能というもう一つの知性の誕生に有る種の希望を見出していた.
人類とは違う知性,感情から完全に独立した知性というモノへの憧憬があった.
あの当時の研究ノートには確かに記されている.
「人工知能,いや人工知性が実現した暁には,君たちからみて人類はどう見えるのか尋ねてみたい.」と.

今や,人工知能のシミュレーションを個人がフリーで行える時代だ.
Sonyが提供するNeural Network Consoleはそのいい例だ.
dl.sony.com
今回の卒論も,この環境をフルに活用したものだ.

ところで,このエントリーを書こうと思ったのは,Googleが提供する,というか,実は参加することで人工知能への学習データを提供するという企てを知ったからだった.
quickdraw.withgoogle.com
これ,面白いよ.
もう,そうとう学習が進んでいるらしく,かなり怪しい絵でも分かってくれるようになっている.
マウスで描くとかなりメチャクチャなんだけど,分かってくれる.
で,「川」が出題されたのだけど,これが意外と難しくて判定してもらえなかった.
こうして,世界中の人がゲームとして参加しているうちに,GoogleAIは賢くなっていくって塩梅だ.
うまいよな,人間をゲームに誘って学習データを集めるっていう設計が.

sin波による疑似フォルマントシミュレーション

今年の4年ゼミ生の一人は音声分析・合成をテーマにしている.
EXCEL上でちまちま作業してもらっているが,
線形予測によるフォルマント抽出がうまくいかないのか,
なかなか母音「あいうえお」すら \sin波から合成できないでいる.

手軽にBASICで母音の合成ぐらいできないものかと探したら,
高々6つ程度の倍音の重ね合わせで「あいうえお」らしい音を作っているページを見つけた.
qiita.com
本当に手軽にできそうだったので,10進BASICでサウンド生成する方法を探して作ってみた.
十進BASIC−外部プログラムの利用

でもって,音程も適当に定めて実行したのが↓

う~ん,そう思って聞けば聞こえなくもない程度.

AquesTalkつかえば,簡単なんだけどね↓

https://www.a-quest.com/index.html


以下,BASICソースと使い方.
実行すると,母音と音程の列を入力するよう聞いてくるので,
母音[aiueo]と音程[0~9]の組合せをinput.
上掲の音源では
   a3i7u9e0o2
とinputしてある.
するとソースのある場所に test.wav が生成されダイレクトにそれが再生される.
いや,その予定だったのだけど,やっているうちにダイレクト再生できなくなった.あれれ.
まぁ,生成された test.wav をクリックすれば再生できるようなので.

REM [疑似母音フォルマント シミュレータ]
REM Ver. 2017/12/23
REM 参考:
REM BASIC 元ネタ:http://hp.vector.co.jp/authors/VA008683/ExtProg.htm
REM               testwave.bas  十進BASICによる音声ファイル生成プログラム 
REM               chr$関数の引数として全ての1バイト整数が許される様に、オプションメニューの
REM               「互換性」「動作」で「文字列処理の単位」を「バイト」に設定して実行すること
REM フォルマント:https://qiita.com/rild/items/339c5c36f4c1ad8d4325

OPTION CHARACTER BYTE
DECLARE FUNCTION formant

INPUT  PROMPT "母音とその高さの列をどうぞ.(「あい↑う↑↑え↓お」は a3i7u9e0o2 など)":vw$
LET vwlen=LEN(vw$)
LET d=0.3  !継続時間(秒)
LET f0=220 !正弦波周波数(Hz)
LET db=-10 !生成波形の最大値(±32767を0dBとする)
LET fs=44100 !標本化周波数(Hz)
LET bps=fs*4 !1秒当りのデータ量(ステレオ16ビット量子化)
LET dsize=d*vwlen*fs*4 !オーディオデータサイズ
LET fsize=dsize+36 !ファイルサイズ(先頭8Bを除く)
LET fmtsize=16 !フォーマットサイズ
LET channel=2^17+1 !ステレオPCMデータの指定
LET reso=2^20+4 !16ビットの指定
LET a=10^(db/20)
OPEN #6 : NAME "test.wav" !ファイルを開き、この名前のファイルが
ERASE #6 !既に存在していた場合には上書きを指定
LET t0=TIME
PRINT #6 : "RIFF"; !以下、wavファイルのヘッダーを作成
CALL out4(fsize) !
PRINT #6 : "WAVEfmt "; !
CALL out4(fmtsize) !
CALL out4(channel) !
CALL out4(fs) !
CALL out4(bps) !
CALL out4(reso) !
PRINT #6 : "data"; !
CALL out4(dsize) !ここまでがヘッダー用の出力
LET al=a*32767 !左チャネル係数
LET ar=a*65535 !右チャネル係数
LET k0=f0/fs*PI*2 !引数の刻み
LET audio$="" !オーディオデータバッファを初期化
FOR vw=0 TO vwlen/2-1
   LET count=0 !カウンタをリセット
   LET vow$=vw$(vw*2+1:vw*2+1)
   LET ht=VAL(vw$(vw*2+2:vw*2+2))
   PRINT vow$,ht
   FOR i=1 TO d*fs
      LET vsin=formant(vow$,k0*(1+ht/20))
      LET lch=INT(vsin*al+0.5)
      IF lch<0 THEN LET lch=lch+65536 !負の数は補数表現
      LET rch=INT(vsin*ar+0.5)
      IF rch<0 THEN LET rch=rch+65536 !負の数は補数表現
      LET audio$=audio$&CHR$(MOD(lch,256))&CHR$(INT(lch/256))&CHR$(MOD(rch,256))&CHR$(INT(rch/256))
      LET count=count+1
      IF count=64 THEN !バッファデータが所定の長さ(64サンプル256Bがほぼ最適)に達したら
         PRINT #6 : audio$; !データをファイルに出力して
         LET audio$="" !バッファを初期化し
         LET count=0 !カウンタをリセット
      END IF 
   NEXT i
   PRINT #6 : audio$; !バッファに残ったデータを出力して
NEXT vw
CLOSE #6 !ファイルを閉じる
PRINT "elapsed time = ";TIME-t0;"seconds"

PLAYSOUND "test.wav"

SUB out4(i4) !4バイト整数の出力(little endian)
   LET j4=i4
   FOR m=0 TO 3
      PRINT #6 : CHR$(MOD(j4,256));
      LET j4=INT(j4/256)
   NEXT m
END SUB

FUNCTION formant(v$,k)
   SELECT CASE v$
   CASE "a"
      LET formant=0.19*SIN(i*k*4)+0.09*SIN(i*k*2)+0.08*SIN(i*k*3)+0.08*SIN(i*k*5)+0.07*SIN(i*k*1)+0.07*SIN(i*k*6)
   CASE "i"
      LET formant=0.19*SIN(i*k)+0.09*SIN(i*k*2)+0.08*SIN(i*k*11)+0.08*SIN(i*k*13)+0.07*SIN(i*k*12)
   CASE "u"
      LET formant=0.19*SIN(i*k)+0.09*SIN(i*k*6)+0.08*SIN(i*k*2)+0.08*SIN(i*k*5)+0.08*SIN(i*k*4)
   CASE "e"
      LET formant=0.19*SIN(i*k)+0.09*SIN(i*k*2)+0.08*SIN(i*k*3)+0.08*SIN(i*k*11)+0.07*SIN(i*k*4)
   CASE "o"
      LET formant=0.19*SIN(i*k*4)+0.09*SIN(i*k*2)+0.08*SIN(i*k)+0.08*SIN(i*k*3)
   CASE ELSE
      LET formant=SIN(i*k)
   END SELECT
END FUNCTION
END 

Moire Amore!(1)―現象編

むか~しむかし,あるゼミ生がモアレを題材に卒論を書いたことがある.
日付を見るともう8年も前,2代目の作品だ.tokidoki.hatenablog.jp
で今年の卒論,10代目となるのだが,
錯視の数理としてちっとも数学に乗ってこないゼミを1人行ってきた.
もとはベンハムのコマを数理的なモデルを立てて
色が見える仕組みの解明を目指していたのだが,
科学実験の枠を超えて数理モデルを立てるには未だ至らず.
(まじめにやると心理物理学とか生理光学とかにはまっていくし.)www.ncsm.city.nagoya.jp
拉致があかないので,
あるときから平行してモアレ現象で何かできないか探し始めていた.
ああ,あの干渉縞のことね,それなりに数式は立てられるだろうけど,
高校数学の練習問題ぐらいなんじゃない?と思われるだろう.
だが,中には結構面白い現象があるんだってことを最近知った.
なんと格子縞は拡大レンズの役割をするのだ.
初めは身の回りの品でモアレが起こる例としての下の動画の中で,
六方格子状に穴が並んだ板を重ねて回転させると
六角格子が拡大される現象から,おや?となったことに始まる.
モアレテスト - YouTube

あれっ,ってことは拡大レンズになるのかもしれない.
他にそんな実験してないか探したところ,例えば以下の動画などどうだろう.


Moire Lens/モアレレンズ - YouTube
同じ文字が細かく並んだシートの上に,同一ピッチで穴を開けたシートを載せると
小さな文字が拡大されて浮き出てくるのだ.な~んと.

で,ぼや~っと運転しながら考えてたら意味が分かってきた.
要するにこれは「粗視化」の一種なんだ.
遠くから見るという操作は,図形の高周波成分を短周期で積分してしまうと理解できる.
でもその前に自分の手の中でも実験したくなり,早速作ってみたよBASICで.
↓はその実験動画.前半は格子を微小角回転させて文字を拡大,
後半は格子のピッチを文字のピッチより縮小させて文字を拡大している.


拡大縮小モアレ模様 - YouTube

そしてそのソース.

REM
REM [Moire de expansion]
REM Ver. 2015/12/01
REM 左ドラッグしながら上にマウスを動かすと格子ピッチが縮小される
REM ドラッグしないで上に動かすと格子が左右に微小に回転する
REM

SET WINDOW 0,1,0,1
SET TEXT font "",7
LET dt=.01

! 下地となる文字模様画像作成
INPUT  PROMPT "Character":c$
FOR x=0 TO 1 STEP dt
   FOR y=0 TO 1 STEP dt
      PLOT TEXT ,AT x,y:c$ ! 拡大したい文字
   NEXT y
NEXT x
! このBasicファイルと同じ場所に下地となる文字模様画像を保存
gsave "moire.png"

! 画面のピッチに合わせて変更のこと(BASIC画面801×801では 6 が丁度良い).
SET LINE width 6
pause
DO
   mouse poll mx,my,left,right
   SET DRAW mode hidden
   CLEAR
   gload "moire.png"
   IF left=1 THEN
      LET e=1+my/10
      LET sx=mx/100
      FOR x=0 TO e STEP dt*e
         PLOT LINES: x+sx,0; x+sx,1
      NEXT x
      FOR y=0 TO e STEP dt*e
         PLOT LINES: 0,y+sx; 1,y+sx
      NEXT y
   ELSE
      LET sy=my/100
      LET sx=SIN((mx-.5)*PI/10)
      FOR x=0 TO 1 STEP dt
         PLOT LINES: x+sy,0; x+sy+sx,1
      NEXT x
      FOR y=0 TO 1 STEP dt
         PLOT LINES: 0,y; 1,y-sx
      NEXT y
   END IF
   SET DRAW mode explicit
   WAIT DELAY .1
LOOP UNTIL right=1
END

さて,これをどうやって数式で理解するか.それは次回に.

f:id:okiraku894:20151202123949p:plain:w400

閑(しず)かな知性

電気で生きる微生物を初めて特定 | 理化学研究所
なんだろう,相変わらず生き物は想像外の姿を見せるね.
もちろん,その生き物に電気プラグがついてるって話じゃないよ.

むしろ,電気プラグがついてそうなのはこっち.
Boston Dynamics All Prototypes - YouTube
こちらの進化,異常に速い.
そして前にもふれたけど,この企業,Googleに買収された.
そしてGoogleは人工知能関連企業も買い集めている.
もはやSkyNetだね.

ターミネーター (日本語吹替完全版) スチールブック仕様 [Blu-ray]

ターミネーター (日本語吹替完全版) スチールブック仕様 [Blu-ray]

それにしても,植物ですら何か意志を持って進化しているように思えるときがある.
本当に自然淘汰だけで説明できるのか,つい疑ってしまう.
例えば,実の中に種が何個あるか何らかの方法で判断している木があるのだと.↓原論文.
http://www.jstor.org/stable/full/10.1086/675063
なんでもその果実の種にハエが卵を産み付けると,
種が複数個そこにあるなら産み付けられた種だけ成長を止めることで
ハエの幼虫を死なせ残りの種を確保する,ってだけでなく,
もしその果実に種が一個しかないならたとえ卵を産み付けられていても
成長を止めないのだそうだ.
というのも,一個しかないときに成長を止めたら種が何も残らなくなってしまう,
それならたとえわずかであれ,卵が孵らない可能性に賭けて
そのまま種を育てる,ということらしい.
こんな風に果実の種の個数を植物が把握しているだけでなく,
その状態に応じて「判断」を変えているということなんだ.

虫に葉っぱを齧られるとその齧る振動を感じてその葉っぱに苦い成分を出す,
という植物があるという話を何かで読んだが,
あの一見静かな植物たちが,こんな風に実に巧妙な戦略で生き延びている.
なんだろう,「植物知」という形の知性ってものがあるように思う.
あるいは時間軸方向にうんと長い尺度を取って見えてくる「知性」が
あるんじゃないだろうか.

こういった生物学関係で面白いネタを紹介してくれるページを
結構前に見つけたので紹介.

たとえば(これは教科学のネタに使えないかと探していて見つけたのだけど)
葉っぱが黄金比角で生える仕組み.これはよく黄金比が自然界にもあるんだよ,
って形で数学読み物に引き合いに出されるのだけど,
その理屈だったら別に黄金比でなくとも無理数なら何でもいいじゃん,
って自分はよく突っ込んでた.
同じように数学者の説明に納得していない著者が,
生物学者の視点からきちんと議論してみたというお話.
第14回:全ての植物をフィボナッチの呪いから救い出す

あと,こんなハチャメチャなページもあった.やりすぎでしょ.
生命科学研究の大御所はアートに昇華したか?

何しろ人間は愚かだから,人知を超えたものをすぐに忘れる.
だから10万年先の子孫に平気で負の遺産を残せるのだよね.
ま,その話は別の機会に.

波紋と螺旋とフィボナッチ: 数理の眼鏡でみえてくる生命の形の神秘

波紋と螺旋とフィボナッチ: 数理の眼鏡でみえてくる生命の形の神秘