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 FFT と Korn–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 FFT と Korn–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のマニュアルには, フィルタの解説がありました.
一般的なフィルタに見受けられますが, 地味に計算が大変です.
Web Audio API で、Multiband Sidechain Compressor を試作 (98帯域)
これまでに, マルチバンドサイドチェインコンプレッサーを,
3帯域, 10帯域で作ってきました.
ソースコード上では, 1帯域分の記述を単純にコピペしていました.
今回は, それをArrayで束ねてFor文でぶん回しました. ぶん回せました, うれしい.
帯域数を簡単に弄れるようになりましたので, 増やしてみました.
98帯域です.
1/12オクターブバンドフィルタバンクで,
最低域を55(=440*(2^-3)) Hz, 最高域を14080(=440*(2^5)) Hzとしました.
人間の可聴域をカバーさせてみました.
帯域が密接しているため, Q値を適当に12としました.
予想以上にあっさりと動いてしまってびっくりしています.
さらに帯域を12帯域ずつ増やしてみたところ,
110帯域では別のタブを操作していようとも音が途切れず,
122帯域では別のタブを操作しているときに音が途切れ,
134帯域では別のタブを操作せずとも音が途切れました.
私の環境ではこの辺りが能力の限界のようです.
ちなみに, STFTによる帯域分割も検討しました.
不甲斐ないことに, 周波数領域でゲインを操作したときにぶつぶつとノイズが発生し,
原因を突き止めきれませんでした.
こんな経緯もあり, 単純にフィルタを並列接続するだけのものが,
しかも可聴域を1/12オクターブで刻み付けるものが,
簡単に動いてしまって大いに感動しているわけです.
Web Audio API で、Multiband Sidechain Compressor を試作 (10帯域)
前回は3帯域のマルチバンドサイドチェインコンプレッサーをつくりました.
Web Audio API で、Multiband Sidechain Compressor を試作 - shingoushori's dialy
それを10帯域にしてみました.
重くなって動かないかと思いきや, 全然動きました.
どこまで帯域を細かくできるんでしょう?
各帯域の周波数の設定は, 下から,
50, 100, 200, 400, 800, 1600, 3200, 6400 ,12800 Hz + 残渣信号です.
Web Audio API で、Multiband Sidechain Compressor を試作
前回制作したサイドチェインコンプレッサー
Web Audio API で、Sidechain Compressor を試作 - shingoushori's dialy
を, マルチバンド化してみました.
帯域分割は, Web Audio API 標準のBiquadFilterNodeを用いてみました.
https://developer.mozilla.org/ja/docs/Web/API/BiquadFilterNode
今回は3帯域.
・500 Hz中心のバンドパス
・1000 Hz以上のハイパス
・残渣信号
コンプレッサーは, 上二つの帯域でのみ動くようにしました.
残渣信号を用意したのは,
帯域を抜き出すフィルタを独立して複数組み合わせて用いる場合,
再合成時に完全に元信号に戻すのが難しいからです.