WebAudioで音響カプラよもう一度、その1

やあ (´・ω・`) ようこそ、セルフまとめへ。 このテキーラはサービスだから、まず飲んで落ち着いて欲しい。 うん、「また」なんだ。済まない。 仏の顔もって言うしね、謝って許してもらおうとも思っていない。 でも、このまとめタイトルを見たとき、君は、きっと言葉では言い表せない 「ときめき」みたいなものを感じてくれたと思う。 殺伐とした世の中で、そういう気持ちを忘れないで欲しい 続きを読む
1
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

www7b.biglobe.ne.jp/~yumaka/think2… これによると 電話は300hz~3400hzが保証範囲か 安全係数を取って600~3100hzにするとして 窓が10.7hzなので、1窓につき突出確認用に3窓上下に取るとすると32bitまでは送れそうだな。 ただし、スピーカーとマイクの性能が付いてこれるかと言うと・・・16bitが精一杯か

2020-12-31 02:01:42
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

候補周波数を上げると 600 682.36 764.73 858.87 964.76 1082.43 1211.86 1353.06 1506.03 1670.76 1847.26 2035.53 2235.56 2447.36 2670.92 2906.25 といったところか。あまり上の周波数は使えない気がしなくもないが、テストだと700hz以下も結構欠損するんよね。

2020-12-31 19:12:36
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

ja.wikipedia.org/wiki/%E3%83%95… FAXの手順を見ていると 一旦開始の受信後に波形の受信側にトレーニングのフェーズが存在するね。 双方向出来ない前提でやるにせよこのフェーズを入れないとダメそう。 さてどうやるか・・・発信側は受信側がどう受け取ってるか確かめるすべはない状況で・・・

2021-01-01 05:39:44
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

まあ、ここの実装は次の統合時に考えるか。 BGMで流す方法なら自身の信号は受信できる訳だし。 しかし二回マイクとスピーカーのペアを通過した波形は信用できるのだろうか というのも周りの構造物に反射した音波が入り込むのでくぐもった音になると すると果たして欲しい周波数を識別出来るのか?

2021-01-01 05:44:53
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

あー二回じゃない3回だわ・・・ ・スマホで発信→イヤホンスピーカー ・イヤホンスピーカー→イヤホンマイク→電話回線 ・電話回線→受話器スピーカー→イヤホンマイク ・イヤホンマイク→PC→ブラウザで解析 なので二回通過は必須であると・・・しんどいなー

2021-01-01 05:55:13
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

これは本気で機械学習を入れたほうが良いかも知れない (※AIやってみたいだけ)

2021-01-01 16:01:38
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

faximo.wordpress.com/2012/01/24/abo… Faxのトレーニング信号とはここで書かれているように ・難易度の高い周波数信号から送信する ・エラーの有無を答える をエラーのない所まで繰り返して通信速度を決定してるっぽい。 問題はなー双方向出来ないので、うーん バックグラウンドがマイクを使えないだろうし※要確認

2021-01-01 17:35:25
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

走査のアルゴリズム考えないと ・時間とビット配列の2重配列 ・時系列に走査すると周期がわかる ・閾値を超える上下があった時刻を記録 ・8割で周期が観測できたら、その周期を正とする ・正とした周期で再度サンプリング ・各周波数帯で最大音量と平均音量を出して、最大音量時に1とする

2021-01-01 19:01:22
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

qiita.com/akinori-ito/it… 周波数帯毎にピーク検出していけばいいか。 ピークが最大音量の反射による雑音を考慮して90%以内であればピークと認めて その時刻を記録してピークタイミングを計測していけばいいと。 するとピーク間時間を計測して最小の値に一番近い時間を出せばいいと。

2021-01-01 21:26:50
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

うん。同期が取れればそこそこ正確に 1byte 50msまではなんとか成るな。160bpsと。 40msだと波形が乱れて1msサイクルのjsじゃ解像度が足りないんだよね・・・ あと発信側の時間も微妙にずれるなぁ2,3msの幅があるねぇ whileで回すループの限界か。 となると文字種を限定してやるか

2021-01-03 04:08:43
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

30msだと波形が崩れまくってダメだな・・・ 40msが限界か・・・200bpsと。 正味6bitなので120bpsかなー、フルに使うとして 実際は誤り訂正機能を入れようと思うと 実装可能なのはハミング符号か、リードソロモンかターボか 何にせよ転送効率は1/2以下になるなぁ・・・ それでも100bps出せるかな?

2021-01-03 05:33:16
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

380円のイヤホンマイクなので・・・うーむ。 誤り訂正まで実装して次に移るか。

2021-01-03 05:49:01
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

20msで符号を流したときに 受信側でどれが送信側が送りたかった符号なのか識別できない。特に8bit全域を指した場合、何か分からない。 また、よく見たらサンプリング周期が5msでブレるので、 と思ったらconsole.log出すだけで1ms食って居た模様

2021-01-03 17:07:38
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

それでも4~5msだな いろいろウェイト調整をしてみたが、 スピーカーとマイクのサボタージュが酷すぎて ハァ?今なんて言った?的なビット配列が起こっている。 さて、じゃあどうするか。 結局エラー起こってるのはその上位でなんとかするしか無いので、パリティビットと同期ビットを入れて6bitで通信か

2021-01-03 18:32:52
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

30msでの通信が限界っぽいな。 1サンプリングに4-5mなので 30ms区間に6-7サンプルしか無くて、そこで正しい奴は誰や?をやってる感じ。 符号が変わったやつが優先で、なおかつ最初に変わったほうが優先で、かつ想定周期に近いほど優先的な ウェイトのかけ方をしている。

2021-01-03 18:44:59
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

うーんよく見たらなんか二倍にする処理があって解除して 40msが限界っぽいなー(これでも誤りが発生する。) setTimeoutしないとUI固まるし、したらサンプリングが4-5msに一回に落ちるしで難しいのう・・・

2021-01-03 20:35:55
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

成る程、音波と電波じゃ周波数が全然違う・・ こんな遅い世界じゃ、マイクとスピーカーが厳しすぎる

2021-01-03 21:10:24
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

ハミング符号+パリティbitでいい感じに出来たぞ! と思ったが、theフライみたいな変なのが再生される・・・ うーん、やっぱりどんどん遅延していくなぁ・・ 発信側のタイミング管理が甘い

2021-01-04 03:17:27
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

発信側のタイミングを計算して出すようにしたらだいぶマシになったな。 50m/4bitなので、80bpsですね・・・あーマジウンコみたいな速度じゃのう・・・

2021-01-04 03:57:15
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

マシにはなったが難しい。多分サンプリング側も もう少しぎっちりタイミング計算したほうがいい。 一応、時間だけは地球重力環境上で通信時間内では同じだからね ここでQRコードのソースを見ながらロードソロモンの誤りチェックを導入と。 速度は半分になるから40bpsですか・・・

2021-01-04 12:13:29
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

体感出来るハミング符号のメリットは一応あって、 送信符号Aから送信符号Bへの遷移状態ビットのサンプリングを パリティビット異常で弾いてくれる。 問題は、パリティ正常な符号の数が減る・・・ ここも連続して同じ符号でパリティ正常なものが有れば正常扱いにする工夫が必要なんだよな

2021-01-04 12:17:04
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

で、このままだと使えないのでWebpackを召喚するか・・・ フォークしたリポジトリだけど、 package.json作ってWebpack-dev-server入れて npmでパッケージ公開してしまおう。 QRコードも同様にしてしまおう。 でないと使えない。

2021-01-04 12:25:53
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

うーん、受信時間からの想定文字列数以外は捨てる、 スキャンタイミングをずらして 一番マトモに取れたやつを正としよう作戦は あまり芳しく無い。 結局ビット化けが誤り訂正を越えて発生する。 あと、イヤホンが2個接近していると干渉が発生して有意にエラー率が上がる。

2021-01-06 02:12:02
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

かなりの確率でTheフライみたいな感じになるな・・・ 途中途中はあってるものの・・・このエラー率はリードソロモンの手に負えるのだろうか。 「わがはいは猫である。名前はまだ無い。」18文字 約50byteで100符号はそこそこ正確に送れるのだが・・・

2021-01-06 02:36:42
汝、翼を与える@ばってん先に翼ばくれんね イベント・・(parody) @ryunosinfx

代わりに40ms/4bitで100bpsにはなりそう。 リードソロモンを入れて訂正が効けばだが。

2021-01-06 02:56:02