WebAudioで音響カプラよもう一度、その1
- ryunosinfx
- 2616
- 2
- 1
- 0
www7b.biglobe.ne.jp/~yumaka/think2… これによると 電話は300hz~3400hzが保証範囲か 安全係数を取って600~3100hzにするとして 窓が10.7hzなので、1窓につき突出確認用に3窓上下に取るとすると32bitまでは送れそうだな。 ただし、スピーカーとマイクの性能が付いてこれるかと言うと・・・16bitが精一杯か
2020-12-31 02:01:42候補周波数を上げると 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:36ja.wikipedia.org/wiki/%E3%83%95… FAXの手順を見ていると 一旦開始の受信後に波形の受信側にトレーニングのフェーズが存在するね。 双方向出来ない前提でやるにせよこのフェーズを入れないとダメそう。 さてどうやるか・・・発信側は受信側がどう受け取ってるか確かめるすべはない状況で・・・
2021-01-01 05:39:44まあ、ここの実装は次の統合時に考えるか。 BGMで流す方法なら自身の信号は受信できる訳だし。 しかし二回マイクとスピーカーのペアを通過した波形は信用できるのだろうか というのも周りの構造物に反射した音波が入り込むのでくぐもった音になると すると果たして欲しい周波数を識別出来るのか?
2021-01-01 05:44:53あー二回じゃない3回だわ・・・ ・スマホで発信→イヤホンスピーカー ・イヤホンスピーカー→イヤホンマイク→電話回線 ・電話回線→受話器スピーカー→イヤホンマイク ・イヤホンマイク→PC→ブラウザで解析 なので二回通過は必須であると・・・しんどいなー
2021-01-01 05:55:13これは本気で機械学習を入れたほうが良いかも知れない (※AIやってみたいだけ)
2021-01-01 16:01:38faximo.wordpress.com/2012/01/24/abo… Faxのトレーニング信号とはここで書かれているように ・難易度の高い周波数信号から送信する ・エラーの有無を答える をエラーのない所まで繰り返して通信速度を決定してるっぽい。 問題はなー双方向出来ないので、うーん バックグラウンドがマイクを使えないだろうし※要確認
2021-01-01 17:35:25走査のアルゴリズム考えないと ・時間とビット配列の2重配列 ・時系列に走査すると周期がわかる ・閾値を超える上下があった時刻を記録 ・8割で周期が観測できたら、その周期を正とする ・正とした周期で再度サンプリング ・各周波数帯で最大音量と平均音量を出して、最大音量時に1とする
2021-01-01 19:01:22qiita.com/akinori-ito/it… 周波数帯毎にピーク検出していけばいいか。 ピークが最大音量の反射による雑音を考慮して90%以内であればピークと認めて その時刻を記録してピークタイミングを計測していけばいいと。 するとピーク間時間を計測して最小の値に一番近い時間を出せばいいと。
2021-01-01 21:26:50うん。同期が取れればそこそこ正確に 1byte 50msまではなんとか成るな。160bpsと。 40msだと波形が乱れて1msサイクルのjsじゃ解像度が足りないんだよね・・・ あと発信側の時間も微妙にずれるなぁ2,3msの幅があるねぇ whileで回すループの限界か。 となると文字種を限定してやるか
2021-01-03 04:08:4330msだと波形が崩れまくってダメだな・・・ 40msが限界か・・・200bpsと。 正味6bitなので120bpsかなー、フルに使うとして 実際は誤り訂正機能を入れようと思うと 実装可能なのはハミング符号か、リードソロモンかターボか 何にせよ転送効率は1/2以下になるなぁ・・・ それでも100bps出せるかな?
2021-01-03 05:33:16380円のイヤホンマイクなので・・・うーむ。 誤り訂正まで実装して次に移るか。
2021-01-03 05:49:0120msで符号を流したときに 受信側でどれが送信側が送りたかった符号なのか識別できない。特に8bit全域を指した場合、何か分からない。 また、よく見たらサンプリング周期が5msでブレるので、 と思ったらconsole.log出すだけで1ms食って居た模様
2021-01-03 17:07:38それでも4~5msだな いろいろウェイト調整をしてみたが、 スピーカーとマイクのサボタージュが酷すぎて ハァ?今なんて言った?的なビット配列が起こっている。 さて、じゃあどうするか。 結局エラー起こってるのはその上位でなんとかするしか無いので、パリティビットと同期ビットを入れて6bitで通信か
2021-01-03 18:32:5230msでの通信が限界っぽいな。 1サンプリングに4-5mなので 30ms区間に6-7サンプルしか無くて、そこで正しい奴は誰や?をやってる感じ。 符号が変わったやつが優先で、なおかつ最初に変わったほうが優先で、かつ想定周期に近いほど優先的な ウェイトのかけ方をしている。
2021-01-03 18:44:59うーんよく見たらなんか二倍にする処理があって解除して 40msが限界っぽいなー(これでも誤りが発生する。) setTimeoutしないとUI固まるし、したらサンプリングが4-5msに一回に落ちるしで難しいのう・・・
2021-01-03 20:35:55成る程、音波と電波じゃ周波数が全然違う・・ こんな遅い世界じゃ、マイクとスピーカーが厳しすぎる
2021-01-03 21:10:24ハミング符号+パリティbitでいい感じに出来たぞ! と思ったが、theフライみたいな変なのが再生される・・・ うーん、やっぱりどんどん遅延していくなぁ・・ 発信側のタイミング管理が甘い
2021-01-04 03:17:27発信側のタイミングを計算して出すようにしたらだいぶマシになったな。 50m/4bitなので、80bpsですね・・・あーマジウンコみたいな速度じゃのう・・・
2021-01-04 03:57:15マシにはなったが難しい。多分サンプリング側も もう少しぎっちりタイミング計算したほうがいい。 一応、時間だけは地球重力環境上で通信時間内では同じだからね ここでQRコードのソースを見ながらロードソロモンの誤りチェックを導入と。 速度は半分になるから40bpsですか・・・
2021-01-04 12:13:29体感出来るハミング符号のメリットは一応あって、 送信符号Aから送信符号Bへの遷移状態ビットのサンプリングを パリティビット異常で弾いてくれる。 問題は、パリティ正常な符号の数が減る・・・ ここも連続して同じ符号でパリティ正常なものが有れば正常扱いにする工夫が必要なんだよな
2021-01-04 12:17:04で、このままだと使えないのでWebpackを召喚するか・・・ フォークしたリポジトリだけど、 package.json作ってWebpack-dev-server入れて npmでパッケージ公開してしまおう。 QRコードも同様にしてしまおう。 でないと使えない。
2021-01-04 12:25:53うーん、受信時間からの想定文字列数以外は捨てる、 スキャンタイミングをずらして 一番マトモに取れたやつを正としよう作戦は あまり芳しく無い。 結局ビット化けが誤り訂正を越えて発生する。 あと、イヤホンが2個接近していると干渉が発生して有意にエラー率が上がる。
2021-01-06 02:12:02かなりの確率でTheフライみたいな感じになるな・・・ 途中途中はあってるものの・・・このエラー率はリードソロモンの手に負えるのだろうか。 「わがはいは猫である。名前はまだ無い。」18文字 約50byteで100符号はそこそこ正確に送れるのだが・・・
2021-01-06 02:36:42代わりに40ms/4bitで100bpsにはなりそう。 リードソロモンを入れて訂正が効けばだが。
2021-01-06 02:56:02