shingoushori's dialy

音信号処理を専ら研究していた元博士後期課程の学生によるメモ

Web Audio API で、WAVファイルに書き出してみる、再生終了後にダウンロード

これまでちまちまとWeb Audio APIで実装を試みてきました.
このあたりでWAVファイルへの書き出しに手を出してみました.

今回は、2つのファイルを同時再生し、
2つとも再生終了後に同時再生の結果をWAVファイルに書き出します.

書き出し可能になった時点で、"ダウンロード"にリンクが発生します.

怪しかったところが、再生終了のタイミングです.
onendedのタイミングで再生終了とすると、尻切れになってしまいました.
今回は乱暴に、onendedのタイミングからsetTimeoutによって遅らせました.

↓頼りきりになってしまった引用文献↓
http://qiita.com/HirokiTanaka/items/56f80844f9a32020ee3b
http://www.cyokodog.net/blog/media-capture-and-streams-web-audio-api/

Web Audio API で、the sliding Goertzel DFT filter のパラメータを弄ってみる、とりあえずNaN

前回、Web Audio API でthe sliding Goertzel DFT filterを実装し、
パラメータをいじりました.
しかし、入力された文字列によっては発散する恐れがありました.

今回は、入力された文字列に関門を設け、
想定外の数値となる場合は反映しないようにしました.

そこで一癖あったのが、NaNでした.
参考にしたページがこちら→NaNの判定について
JavaScriptの関数の癖だけでなく、主観的なNaNとプログラム上でのNaNは違うわけです.
数字でなくも文字列は、文字コードでもってNumberであり、NaNではない.
賢い関数がありそうなものですが、とりあえず単純に組んでみました.

Web Audio API で、the sliding Goertzel DFT filter のパラメータを弄ってみる、とりあえず

↓前回、the sliding Goertzel DFT filterを組みました. ↓
Web Audio API で、the sliding Goertzel DFT filter を試作 (1帯域) - shingoushori's dialy

今回は、パラメータを弄ってみました. とりあえず、です.
とりあえずポイント1: inputフォームを使う
とりあえずポイント2: 数値および数値の変更手順によっては、発散する
"ぷちっ"とノイズが出て、以後可聴な音が出なくなるわけです.
危険です. パラメータ変更に関しては、安全策を考える必要が有ります.
このサンプルをお使いになられてのトラブルについては、一切の責任を負いかねます...

 


fが中心周波数,rがdamping factor.
rについては,1以上の数値を入れると発散します.入れないでください!
fについては,DFTであるからk=f/(Fs/NDFT)が整数であるべきです.
ここで,k:周波数ビン番号,Fs:サンプリング周波数, NDFT:DFT点数です.
従って,k=round(f/(Fs/NDFT))とでもして整数化する実装が普通でしょう.
ところが,roundせずともフィルタリング自体はできているようです.
興味深い...

Web Audio API で、the sliding Goertzel DFT filter を試作 (1帯域)

Web Audio APIでのSTFTによる帯域分割がうまくいかないので,
the sliding Goertzel DFT filterに抜け道を求めました.

↓the sliding Goertzel DFT filterの素敵な文献↓
The Sliding DFT
SLIDING IS SMOOTHER THAN JUMPING

DFTの1帯域分に着目すれば,IIRフィルタで実装できるわけです.
しかも, フィルタだから毎サンプルでの算出結果が得られる.

 

とりあえず, DFT点数を1024, 着目する周波数ビン番号を20としてみました.
ただし, 負の周波数ビンとカップリングし,虚数が出ないようにしています.
さらに,発散しないように damping factor : r = 0.995で, 極を単位円から離しました.
数値は耳で聞いて設定しました.
damping factorがあるのでDFTと完全に一緒でもない.

 

今回, IIRフィルタをScriptProcessorNodeで組みました.
Web Audio APIにはIIRFilterNodeもありそうですが,私の環境では見つかりませんでした.
ScriptProcessorNodeも廃止が告知されており,
AudioWorkerNodeに置き換えられるそうで.
しかし,AudioWorkerNodeも私の環境にはまだ無い.
儚いものです...

 

最後に,ScriptProcessorNodeに引数とバッファを持たせる方法について.
JavaScriptでは, こんな感じにほいほい追加できる↓
オブジェクトを利用する
気づくまでに時間がかかり,
チャネル数を偽装して引数を渡そうとするなど,悪戦苦闘しました.

Simutransで, 建築物を弄る

<欲望>
筆者は, 鉄道経営シミュレーションが好きである.
Simutrans(http://japanese.simutrans.com)は, 素晴らしい.
今回は, 建築物を弄ります. 
特に, 建築物の所在地を変換するのが第一の目的です.
建築物の所在地を調整することで, 市域を調整することができます.

 

<設定いじり>
セーブデータをxmlで書き出す設定にしておく.
simutrans/config/simuconf.tab の,
saveformat = bzip2

saveformat = xml
に書き換え

 

<狙いの建築物さがし>

・座標点
xml中, 各地点のデータは, 
 <planquadrat_t> と </planquadrat_t> で括られている.
この括りが, マップの左上->右上, -> .... ->, 左下->右下 の順に並んでいそうだ.
括りを数えなければ, 座標点は探せないように見える.

・標高
<planquadrat_t> の次に来る  <id>(数字)</id>, これが標高のようだ.

・建築物であるか否か?
<planquadrat_t>の中に, <gebaeude_t> </gebaeude_t>の括りが,
建築物である印のようだ.

・建築物の種類
<gebaeude_t></gebaeude_t>の中にある, 
<![CDATA[(種類)]]>, ここに種類がありそうだ.
ここでの種類は, 市内建築物建設ツールの原名にある記述のようだ.

建築物の所在地
</gebaeude_t>の一つ前の, <i32>(数字)</i32>が該当しそう.
ここでの数字は, 都市名のxml中での掲載順-1になっていそうでした.
都市名のxml中での掲載順は,
とりあえず <![CDATA[( あたりで文字列サーチして, リストアップできます.

 

まだまだ, 謎な数字があったり不便もいいところですが,
とりあえず糸口が掴めました.

... たぶんxmlの構文もどこかに解説があるんでしょう...

論文・文献徘徊メモ 160219-1 Pease FFT / Korn–Lambiotte FFT

FFTといえば,
Cooley–Tukey FFTが一番有名で, Stockham FFTが二番であろうと思います.
工学書を覗いてみると, だいたいここ2つではないでしょうか.
Cooley–Tukeyはわかりやすいとして, Stockhamはぎょっとします.
Webサイトによっては, よくよく線を辿ってみると不完全なものもありました.

そんなわけで, Stockhamの正しそうでわかりやすい説明を探し求めてみたわけです.
すると, Stockhamよりも一見してわかりやすそうな別のFFTに出会いました.
それが, Pease FFTKorn–Lambiotte FFTでした.

 

Pease FFT が載っている文献
https://users.ece.cmu.edu/~franzf/papers/fft-enc11.pdf
http://csg.csail.mit.edu/Dataflow/talks/HoeTalk.pdf

 

Korn–Lambiotte FFT が載っている文献
https://users.ece.cmu.edu/~franzf/papers/fft-enc11.pdf
http://www.ams.org/journals/mcom/1979-33-147/S0025-5718-1979-0528051-4/S0025-5718-1979-0528051-4.pdf

 

Pease FFTKorn–Lambiotte FFT は, ステージ間での配線パターンが同じです.
美しい ...

ちなみにStockham FFT は,
入出力時の並び順がin placeであることが主眼のようです.
しかし, それよりも各ステージの回転因子を乗算する周波数ビンが
(たぶん) 同じ位置, しかも後半に固まっていることの方が, 有用で美しく思います.

Web Audio API の、BiquadFilterNodeのbandpassの周波数特性の概形

標準の BiquadFilterNode の
bandpassの周波数特性の概形を探ってみました.
98帯域のMultiband Sidechain Compressor を作れることがわかったので,
フィルタバンクの周波数特性を詰めていこうとしているわけです.

今回, WebAudioAPI の BiquadFilterNode の周波数特性をグラフにするやつ
という素敵なページに巡り会いました.
こちらのページの上で, 中心周波数から-20 dBと-40 dBになる周波数比の目安を,
手探りで簡単な整数比で捉えてみました.

Q-20 dB-40 dB
0.5 x 20 x 200
1 x 10 x 100
2 x 5 x 50
3 x 7/2 x 100/3
6 x 2 x 16
9 x 5/3 x 90/8
12 x 3/2 x 8
18 x 4/3 x 6
24 x 5/4 x 9/2
30 x 7/6 x 7/2
36 x 8/7 x 3
42 x 9/8 x 8/3
48 x 10/9 x 7/3
60   x 20/9
72   x 2

WebAudioAPIのマニュアルには, フィルタの解説がありました.
一般的なフィルタに見受けられますが, 地味に計算が大変です.