みんな大好き Desmos Graphing Calculator の話。

グラフの色に設定できるのが、デフォルトだと6色しかないけど、簡単に増やすことができる。

開発者ツールを開いて

Calc.colors.GREY = "#999999";

とかする。GREY のところは適当でよい。

こうすると色選択するパレットに単に色が増えるので、増やた色を選択すればグラフの色を設定できる。

パレット追加した色はリロードしたりすると消えてしまうが、グラフに設定した色は保存される。

Calc.colors をダンプするとわかるが、色IDをキー・色値を値にもつオブジェクトになっている。

Calc.colors = {
BLACK: "#000000"
BLUE: "#2d70b3"
GREEN: "#388c46"
ORANGE: "#fa7e19"
PURPLE: "#6042a6"
RED: "#c74440"
};
  1. トップ
  2. tech
  3. desmos で使う色を増やす方法

↑この画像は静止画ではなく、録画のスナップショット (α7R II 2160p モードを CamLink 4K/30FPS NV12 でとりこみ)

Elgato Cam Link 4K [録画・配信用コンパクトHDMIキャプチャカード 1080p60 4K30 ビデオ会議/ホームオフィス/ゲーム配信向け OBS/Zoom/Teams連携 PC/Mac対応 - Elgato

Elgato

5.0 / 5.0

結論からいうと CamLink という HDMI → UVC 変換器 (キャプチャボードの一種) を使うのがおすすめ。カメラの HDMI 出力と繋ぎ、カメラ側は動画モードにして、HDMI INFO の設定 (HDMI に OSD を出さない) をするだけでよい。

カメラ側で HDMI 出力設定を変えて 1080p か 2160p かを選べる機種の場合は、カメラ側で設定を好みのほうに変える必要がある。デフォルトだと 4K でしかとれないので、1080p で十分なら下げたほうが負荷が低いと思う。

もっと安い HDMI USB キャプチャあるけど?

知ってるぞ! こういうのだろ!

HDMI → UVC 変換器もピンキリで、キャプチャできる解像度や、画質に差がある。しかし商品説明からは全くわからないことが多い。具体的に何が違うか

  • 解像度 2160p(4K) 1080p(Full-HD) 720p (HD)
    • 4K はパススルーだけでキャプチャできないのが大多数。
    • 1080p 対応と書いてあっても、実際の画質は 720p 相当のことがある
  • 圧縮方法 MJPEG YUY2(YUV422)
    • MJPEG はフレームごとに JPEG 圧縮する方法。扱うデータ量が大幅に減るので安い。画質は悪い
    • YUY2 は色差だけを間引いて若干圧縮する方法。USB3.0 でなければまともな fps がでない。画質は良い
  • 何かほかの要素
    • 単純な変換処理なのでは?と思っていたがどうも画質がちがうことがある

残念ながら買ってみるまで詳細なことはわからない。HDMI キャプチャについては安物を買わないほうが良い (安物を2台ほど買って失敗した人間の言っていることです)。

CamLink は以下のような仕様で、現状手に入る中では本当にベストだと思う。脳死でこれ買いましょう。

  • 2160i 30FPS: I420/NV12 - 4:2:0 interlaced
  • 1080p 60FPS: YUY2: 4:2:2

ref. https://www.reddit.com/r/ElgatoGaming/comments/a0y2c9/introducing_cam_link_4k_4k301080p60_camera/eaolvkb/

  1. トップ
  2. photo
  3. SONY αをウェブカメラとして使う
  1. トップ
  2. tech
  3. SONY αをウェブカメラとして使う

高周波リレー・同軸切替器・同軸リレーとからへんの話です。50W 通せる高周波リレーHF3シリーズを使ってみます。

TEHF3 Relay という製品を最近知った。これは DC から 3GHz までの高周波リレーだが、高周波リレーとしては大きな耐電力を謳っている。最大で 60W, 62.5VA、2.5GHz 23℃ では 50W の連続通過と書いてある。定格電圧と電流はそれぞれ 250VAC / 2A。高周波リレーは通常、小信号用であり、2W程度が定格になっていることが多いのでこれは結構珍しい。

このリレーは DigiKey でも購入することができる。しかも $12 程度と、この手のリレーとしてかなり安い部類に入る。DigiKey の RF リレーのカテゴリでは、2A までのリレーしか扱っておらず、その 2A のリレーはこのシリーズだけになっている。

2003年ぐらいからあるようで、特に新しいコンポーネントというわけではない。検索してみると実際アマチュア無線用途に使用している海外の例がヒットしたりする。

実験基板


リレー単体だと使えないので、リレーを載せるための基板を作る。再現性のため2層にして、PCB製造サービスを使うことにした。

余計なコンポーネントを乗せず、リレーとダイオードだけを乗せた基板にした。コネクタは安価な SMA のエッジコネクタ。一応伝送路はマイクロストリップライン (Coplanar Waveguide with Ground) として設計している。いまいち伝送路端の接続方法がわかっていないので適当につないでいるが正しくない気がする。

PCB 製造は PCBWay へ注文。部品は前述の通り、DigiKey で購入した。1週間せずすべてのパーツがそろった。

測定してみる

見るべき値は

  • 反射損失
  • アイソレーション (端子間の信号漏れ)
  • 通過損失

手持ちのスペアナの上限が 1.5GHz なので、そこまでしか測れない。

参考として 第一電波工業株式会社 同軸切換器 CX210N のスペックを引用する。

●価格:9,800円+税
●外形寸法:W71×H57×D42mm
●重量:440g
●周波数範囲:DC〜3000MHz●インピーダンス:50Ω
●入出力コネクター:N-J
●VSWR:1.05以下(DC〜500MHz)、1.1以下(500〜1000MHz)、1.15以下(500〜1000MHz)、1.15以下(1000〜2000MHz)、1.2以下(2000〜3000MHz)
●挿入損失:0.05dB以下(DC〜500MHz)、0.1dB以下(500〜1000MHz)、0.15dB以下(1000〜2000MHz)、0.2dB以下(2000〜3000MHz)
●アイソレーション(終端時):70dB以上(DC〜200MHz)、60dB以上(200〜1000MHz) 、55dB以上(1000〜2000MHz)、50dB以上(2000〜3000MHz)
●通過電力(SWR1.12以下時):1.5kW(DC〜30MHz)、 1kW(30〜150MHz)、500W(150〜500MHz)250W(500〜1000MHz)、150W(1000〜3000MHz)
●最大許容電力:1.5kW

反射損失


NanoVNA の結果。

コモン側の反射波、NC (Normally Closed)/NO (Normally Open) にダミーロード。(S11)

  • DC〜50MHz: -43dB (SWR 1.01)
  • 50〜500MHz: -27dB (SWR 1.09)
  • 500MHz〜900MHz: -19dB (SWR 1.25)

リレーのスペック上は 1.5GHz 以下なら最大でも1.08 程度なので基板などの影響が大きい。

挿入損失



スルーコネクタでノーマライズ後、コモンに TG (トラッキングジェネレータ)、NC (Normally Closed)/NO (Normally Open) にダミーロードをつけて、コンタクトしているほうをスペアナに入力。

  • DC〜500MHz: 0.12dB
  • 500〜1000MHz: 0.38dB
  • 1000MHz〜: 0.67dB

リレーのスペック上は 1.5GHz 以下なら、-0.15dB 未満。

アイソレーション



スルーコネクタでノーマライズ後、コモンに TG (トラッキングジェネレータ)、NC (Normally Closed)/NO (Normally Open) にダミーロードをつけて、コンタクトしてない状態でスペアナに入力。

  • DC〜200MHz: 69dB以上
  • 200〜1000MHz: 51dB以上
  • 1000MHz〜: 44dB以上

リレーのスペック上は 1.5GHz 以下なら、70dB 以上。500MHz 以下なら 80dB 以上ある。

全体の比較

メーカー製 CX210N 同軸切換器と比べると耐電力・諸特性に劣っている。ただ、耐電力以外はリレーのスペック的にはもっと良い値になるはずなので、基板設計によるところが大きそう。一方安価で電子制御可能なのが大きいメリット。

感想

長々と遠隔で切り替えられる同軸リレーについて悩んでいて、汎用パワーリレーを使ったものを作ったり、既製品の同軸切替器をモーターで回すのを試したりしていたが、これでいいんじゃないかという感じになった。

さすがに一発でうまく基板がつくれる感じではないので、気がむいたら何度か作りなおしてみる予定。

駆動

4.5V モデルが安かったので 4.5V モデルにしたため、コイルは 145Ω (28mA) 約 140mW。5V で駆動するなら追加で 18Ω、12V で駆動するなら 268Ω が必要になる。

コントローラについてはまた別途書く。

備考

G6K(U)-2F(P)-RF(-S, -T) の場合 VSWR 1.2 で 3W まで。接点容量は 1A

  1. トップ
  2. tech
  3. 50W 通せる高周波リレーHF3シリーズを使ってみる

伝送路インピーダンス50Ω 送信機出力 50W では、完全に整合していれば、50Vrms 1A になる。ただ、SWR が悪化すると (すなわち反射が増えると)、定在波が発生する。これにより最大2倍の電圧・電流が伝送路上に発生する。

信号源が整合している場合の、定在波電圧・電流を数式で確認しておく。 が定在波の最大電圧、 は定在波のピーク電圧、 が定在波の最大電流、 は反射係数。

多重反射

多重反射、つまり信号源も負荷も整合していない場合も考えてみる。

信号源側の反射係数を に、負荷側の反射係数を にする。

は起電力、単位は V。起電力を発生させた直後の初期状態で信号源端の伝送路にかかる電圧 は、伝送路インピーダンスと信号源インピーダンス(内部抵抗)に分圧されるので、

進行波が伝送路をすすみ、負荷端に辿りつくと反射係数 で反射されるので、合成すると

反射波が伝送路を戻ってきて、信号源に辿りつくと反射係数 で再度反射されるので、さらに合成すると

これが無限に繰替えされる。このように多重反射していくと以下のようになる。

上記は時系列だが、これを発生箇所ごと、つまり進行波と反射波ごとにまとめてみる。

1ずつインクリメントされる法則性が見えるので sum の形にする。

Maxima で以下を実行して sum を整理する。 が positive か negative か zero かを訊かれるので、negative と答える。これはつまり反射係数が0よりも大きく、収束することを Maxima に伝えている。

v_i * sum( (Γ_S * Γ_L)^n, n, 0, inf) +  v_i * sum(Γ_L * (Γ_S * Γ_L)^n, n, 0, inf), simpsum;

以下のように整理される。

を展開したいので、 と、 を使って だけ残るようにする。

これでほぼ十分だが、 と SWR は互いに単独で変換できるので、SWR から求める形にしてみると、

これが多重反射の定常状態の電圧 (ただし反射係数は0より大きいこと)。ちなみに起電力 は、送信機出力 からすると、分圧されるので になる。これを代入すると

となる。

ところでここで、信号源 SWR である を 1 にしてみると、

となって、多重反射がない場合の と一致する。

計算してみるとわかるけど、信号源が整合していない場合、結局発生する初期電圧 も低くなっていくため、伝送路に発生する電圧は2倍を超えないことがわかった。

備考: 反射電力はどこで消費されるか?

信号源が完全にマッチングされているなら、信号源の内部抵抗で消費される。実際は伝送路損失もあるので、伝送路損失をひいた電力が信号源内部抵抗で消費される。

もうすこし具体的には出力トランジスタの抵抗成分で消費されて熱に変わる。送信機の出力回路を考えてみると、電力増幅トランジスタがあり、トランジスタには素子ごとにある程度決まった出力インピーダンスがある。そしてそれを50Ωに整合するトランスがある。反射電力からすると、出力端子からトランスを逆方向にすすみ、電力増幅トランジスタまで辿りつくことになる。

ref

  1. トップ
  2. tech
  3. 伝送路中の定在波の最大電圧と最大電流

手元にある UVC デバイスの構成を dot で書きだして graphviz してみたのがこれ。イメージしやすいかな?

https://www.usb.org/document-library/video-class-v15-document-set

仕様読めば概念はわかりやすい書いてあるので細かく書く必要はないけど、ざっと読んだ感じを記録しておく。

Video のストリーム以外のところ、つまりカメラなどをコントロールするプロトコルを見ていく。

コントロールするインターフェイスには Video Interface Class / Video Control Subclass がついている。

UVC は「Unit」を組合せてデバイスを表現するようになっている。これは USB の仕様にある device / configuration / interface に、さらに加えて存在している。

「Unit」は動画機能の構成する基本ブロックで、1つ以上の入力と、ただ1つの出力を持つ。

「Terminal」は入力または出力いずれか1つしかない Unit の一種。

  • Input Terminal (IT)
  • Output Terminal (OT)
  • Camera Terminal (CT)
  • Processing Unit (PU)
  • Selector Unit (SU)
  • Encoding Unit
  • Extension Unit (XU)

Camera Terminal は Input Terminal の一種で、典型的な webcam は以下のような構成になる。

  • Camera Terminal → Processing Unit → Output Terminal (→ エンドポイント)

Camera Terminal には以下のような「コントロール」がついており、パラメータを操作することができる。

  • Scanning Mode (Progressive or Interlaced)
  • Auto-Exposure Mode
  • Auto-Exposure Priority
  • Exposure Time
  • Focus
  • Auto-Focus
  • Simple Focus
  • Iris
  • Pan
  • Roll
  • Tilt
  • Digital Windowing
  • Region of Interest
  • Zoom

Processing Unit は入力を処理して出力するための画像処理 Unit で、以下のようなコントロールがついている。基本的に PC 側でもできるような処理。

  • Brightness
  • Hue
  • Saturation
  • Sharpness
  • Gamma
  • Digital Multiplier (Zoom)
  • White Balance Temperature
  • White Balance Component
  • Backlight Compensation
  • Contrast
  • Gain
  • Power Line Frequency
  • Analog Video Standard
  • Analog Video Lock Status

プロトコル上、これらのコントロールは属するものが違うので、ちゃんと区別してコントロールする必要がある。

  1. トップ
  2. tech
  3. UVC (USB Video Class) のプロトコルと勘所

なんかしらないけど直接ターミナルから実行してやらないとウィンドウがでない

~/Downloads/en.stm32cubemx_v5.4.0/SetupSTM32CubeMX-5.4.0.app/Contents/MacOs/SetupSTM32CubeMX-5_4_0_macos 

このようにやると Java で書かれたウィンドウが出るようになる。なんでだろう?

  1. トップ
  2. tech
  3. macOS で SetupSTM32CubeMX-5.4.0

Chrome 80 (2020年2月予定) からは挙動が変更され、SameSite 属性がない (なにも対応していない場合) は SameSite=Lax の挙動がデフォルトになる。かなり厳しい制約が増えるので対応必須。

また、既存の挙動に戻すためには SameSite=None を指定する必要があるが、SameSite=None は Secure 属性が必須になる。

ということでいずれかが最低限必須

  • https 化 と Secure 属性
  • SameSite=Lax で問題ないサイトづくり

最低工数

  • 常時 https 化する
  • Secure 属性と SameSite=None 属性をつける

既に https 化されているなら最も手軽で追加の検証がいらない。

→ 今まで通りの挙動。CSRF 耐性は特になく、セキュリティは向上しないが不具合はでない

ちょっとは頑張れる

  • SameSite=Lax 属性をつける

→ ほぼ今まで通りだが、外部からのフォーム POST など、CSRF に繋がりそうなケースで挙動がかわり安全になる。XHR や iframe でも cross-site の場合はデフォルトでクッキーが送られなくなるので、対応のうえ全体で再度QAが必要

もっと頑張れる?

SameSite=Strict にすると、あらゆる外部サイトからのページ遷移のときにクッキーが送信されなくなる。最初に開くと必ず非ログイン状態になり、そのあと遷移するとログイン状態が復活したりする。ユーザー体験上、Strict をそのまま既存のセッションクッキーに適用するのは困難。

副作用が発生するクッキーだけを Strict クッキーに分けるような設計をすれば活用できるが、サイトのページ遷移から見なおす必要がある。

個人の見解では Strict を使うケースはないんじゃないかと思う。SameSite=Strict は銀の弾丸ではなく、アプリケーションの問題は CSRF だけではない。結局、総合的に他の施策も必要なので、SameSite=Strict している暇があったら他のことをしたほうが良さそう。

  1. トップ
  2. tech
  3. SameSite 属性結局どうすりゃいい?

接続済み SSH セッションからファイルをダウンロードする というエントリを2012年ぐらいに書いて、その中で uutransfer という、screen ウィンドウを通じて uuencode したファイルを転送して書きだすツールを紹介しました。

便利に使っていたんですが、最近 tmux に移行した ので、このツールが動かなくなって困りました。ということで書きなおして独立したレポジトリに移動しました。

  1. トップ
  2. tech
  3. uutransfer for tmux (接続済み SSH セッションからファイルをダウンロードする)


ITU-T G.227 にあるフィルタを実装して、無線機の特性試験の試験方法に登場する「疑似音声信号発生器」を WebAudio で作ってみる。

ITU-T G.227

Conventional Telephone Signal という名前の勧告。伝達関数が書いてある。600Hz ぐらいにピークのあるフィルタになっている。

ホワイトノイズをこのフィルタに通すことによって疑似音声となる。なので、この周波数特性を持つフィルタを設計する。

フィルタの設計方法

フィルタの知識がないので、試行錯誤しながら以下のようにすすめていった。

  • 周波数特性をそのままFIRフィルタにする
  • 最初から実数 FIR フィルタとして設計してみる
  • 双一次変換を使って IIR フィルタにしてみる

結論からいえば、今回の場合はアナログフィルタの伝達関数が示されているので、そこからデジタル IIR フィルタに変換するのが一番良かった (と思う)

求めるのは Jupyter Notebook 上で行なった。

周波数特性をそのままFIRフィルタにする

FIR フィルタは周波数特性がわかっていれば IFFT で作ることができる。ほぼ何も考えずに作れる。

最初は対称をつくらず IFFT して、最後に実数だけとるのを作った。

実数 FIR フィルタとして設計する

フィルタを左右対称にすればほぼ実数フィルタになるはずだが、低域の減衰が急峻すぎるせいかこれでも虚数が出てきてしまう。しかたないのでこのまま虚数を捨てて実数フィルタとして評価した。

まぁまぁうまくいくけど、かなり重くなってしまう。そして、それなりに G.227 の特性から誤差が発生して気持ちがわるい。FIR なので次数を増やせばそれだけ近似はできるが、どんどん重くなっていく。

なお FIR フィルタを WebAudio で使いたい場合は、ConvolverNode を使えば良い。

アナログフィルタを双一次変換 (bilinear transform) してIIRフィルタを得て FIR フィルタで補正する

↑補正なし↓補正

アナログフィルタ(周波数連続という意味)からデジタルフィルタ(離散という意味)をつくる方法の一つに双一次変換がある。scipy で簡単にできるので、これを試す。

今回の場合、アナログの伝達関数はわかっているので、この規格に書いてある伝達関数を双一次変換してIIRフィルタの係数を得る。つまり以下を変換してデジタルフィルタを得たい。


なぜ微妙に括弧がついてるのかわからないが、結局これは次数ごとに書きなおすと見なれた以下の形になる。ほぼ scipy.signal.freqs などが受けとる形になっている。4次。

ただ、p が なので、これを角周波数 をとる関数に変えたい。

python で上記通り係数計算して、signal.bilinear() に渡してあげると、デジタルフィルタの係数になる。ただ、双一次変換は周波数歪みが起こるので、完全にアナログフィルタの特性と一致するわけではない。

こういう場合どうするのかよくわからなかったが、次数の少ない FIR で容易に補正できそうだったため、アナログフィルタの周波数特性との差分をとって補正する FIR フィルタを追加で設計する。

IIR フィルタを WebAudio で使う場合は IIRFilterNode を使えば良い。feedForward に分子 feedBack に分母の係数を渡せば動いてくれる。

ということでできたのが冒頭にリンクしたレポジトリとなる。https://github.com/cho45/pseudo-audio-signal

  1. トップ
  2. tech
  3. ブラウザで動く擬似音声発生器 (ITU-T G.227 フィルタ)

  • Type-C コネクタ
  • 25MHz / 32.768 kHz 水晶つき
  • NRST / BOOT ボタン

裏面に WeAct と書いてあった。

何もせずそのまま USB に繋ぐとシリアルポートとして認識される。

Bus 020 Device 025: ID 0483:5740 STMicroelectronics STM32 Virtual ComPort 
00:01:10,04012019
VrefintAdc: 1.2133V
TempSensorAdc: 24.75C
FlashID:0 ERROR!

こういう出力がずっと流れている。

プログラム方法

この MCU は System Memory という領域を持っており、ブートローダーが最初から書きこまれている。詳細は AN2606

USB 経由で DFU するには、基板上の BOOT0 を押しながら、NRST を押せば良い。

Bus 020 Device 008: ID 0483:df11 STMicroelectronics STM32  BOOTLOADER  Serial

として認識される。

platformio

https://docs.platformio.org/en/latest/boards/ststm32/blackpill_f401cc.html

blackpill_f401cc というのがある。たぶんこれなので、一旦これで試す。

platformio init --board=blackpill_f401cc

残念ながら mbed framework が使えないみたいなので、一旦 arduino でいく src/main.cpp

#include "Arduino.h"

#ifndef LED_BUILTIN
#define LED_BUILTIN 13
#endif

void setup() {
	pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
	digitalWrite(LED_BUILTIN, HIGH);
	delay(500);
	digitalWrite(LED_BUILTIN, LOW);
	delay(500);
}
pio run

.pio/build/blackpill_f401cc/firmware.bin ができるので、BOOT0 を押しながら NRST を押し、USB DFU モードにする。この状態で dfu-util で書きこめる。

dfu-util -d 0483:df11 -a 0 -s 0x08000000:leave -D .pio/build/blackpill_f401cc/firmware.bin 

mbed のカスタムボード定義

とりあえず mbed のほうが好みなので mbed を使えるようにしてみる。こういうことするとハマりやすいのであまりよくないが…

403 Forbidden に従いながらカスタムボードを定義する。

platformi.ini

[env:f401cc]
platform = ststm32
board = f401cc
framework = mbed
build_flags = -I$PROJECTSRC_DIR/TARGET_F401CC

boards/f401cc.json

# https://github.com/platformio/platform-ststm32/blob/develop/boards/blackpill_f401cc.json をコピペ

custom_targets.json https://github.com/ARMmbed/mbed-os/blob/e1c3de649dd9c16d9548f73b4bbb71858af904f7/targets/targets.json#L4834 から抜き出してコピペ

{
	"F401CC": {
		"inherits": ["FAMILY_STM32"],
		"core": "Cortex-M4F",
		"default_toolchain": "GCC_ARM",
		"extra_labels_add": [
			"STM32F4",
			"STM32F401",
			"STM32F401xC",
			"STM32F401VC"
		],
		"supported_toolchains": ["GCC_ARM"],
		"device_has_add": ["MPU"],
		"device_name": "STM32F401CC"
	}
}

cp -r ~/.platformio/packages/framework-mbed/targets/TARGET_STM/TARGET_STM32F4/TARGET_STM32F401xC/TARGET_DISCO_F401VC src/TARGET_F401CC

#include "mbed.h"

DigitalOut led(PC_13);

int main() {
	for (;;) {
		led = 1;
		wait(0.2);
		led = 0;
		wait(0.2);
	}
}

これで pio run が走って .pio/build/f401cc/firmware.bin ができるはず。

time dfu-util -d 0483:df11 -a 0 -s 0x08000000:leave -D .pio/build/f401cc/firmware.bin 

で書きこみ。

  1. トップ
  2. tech
  3. STM32F401CC の安いボード

別表第35とかに出てくる「標準符号化試験信号」の生成について調べた。

擬似信号発生器は、標準符号化試験信号(ITU-T勧告O.150による9段PN符号)を発
生させる。
と書いてある。

ITU-T O.150 は n 段(stage)のシフトレジスタで構成されるテスト用の疑似乱数列について定義している。n段の符号はnビットのシフトレジスタに対応する。

具体的な生成方法は wikipedia の LFSR を読むのがわかりやすい。

9段のPN符号

「4.1 511-bit pseudo-random test pattern」となっているところが9段のもの。

「The pattern may be generated in a nine-stage shift register whose 5th and 9th stage outputs are added in a modulo-two addition stage, and the result is fed back to the input of the first stage. The pattern begins with the first ONE of 9 consecutive ONEs.」と文章で書いてある。

5th and 9th と書いてあるところが帰還多項式に対応しており、この場合

になる。また初期状態も定められており、全ビット1から初めるとしている。

JavaScript での実装

以下のような任意のビット数(ただし32ビット以下)の LFSR のコードを書いた。全ビットが0でない限りは最大周期で全ての状態が出現する。

/**
 * Linear-feedback shift register
 *
 * reg: n bits register state
 * n: Bits(n) (up to 32bits)
 * taps: feedback polynomial (eg. x^16 + x^14 + x^13 + x^11 + 1 => [16, 14, 13, 11])
 * ref. https://en.wikipedia.org/wiki/Linear-feedback_shift_register
 */
function LFSR(reg, n, taps) {
	const mask = n === 32 ? (-1>>>0) : (1 << n) - 1;
	reg &= mask;

	const bit = taps.
		map( (tap) => reg >> (n - tap) ).
		reduce( (r, i) => r ^ i ) & 1;

	return ( (reg >>> 1) | ( bit <<  (n-1) ) ) & mask;
}

const start = 511;
let lfsr = start;
let period = 0;
do {
	lfsr = LFSR(lfsr, 9, [9, 5]);
	console.log('output:', lfsr>>(9-1), 'internal:', (lfsr | (1<<9)).toString(2).slice(1));
	period++;
} while(lfsr !== start);
console.log('this feedback polynomial period:', period);
  1. トップ
  2. tech
  3. 標準符号化試験信号 PN符号 LFSR

ちょっと困ったことが起きており、一昨日からワンオ… | Fri, Oct 11. 2019 - 氾濫原 書いてからワンオペしてたがとりあえず終わった。

入院する前、調子を崩して家にいる状態だと、保育園から毎日毎日「何の病気なのか」と聞かれ続け、知らねーよ判ったら苦労しねーよと内心苛立っていたが、とりあえずそれがなくなってストレスは一つ減った。

生活品を届けにいったとき先生から説明をうける。ハッキリ原因がわからないので、安全な治療からはじめて、それがいつまでにうまくいかなかったら次はこうする、という方針を聞く。洒落ためがねをしていて頭が良さそう(医者なんだからもちろんそうなのだが、その上で)とぼーっと考えていた。

運悪く、保育園の弁当を持ってこいイベントが発生間近であり、まぁ冷凍食品のからあげを詰めたり、梨を剥いて詰めたりしてしのいだ。からあげは大変好評であった。

その間に台風19号があって避難したりして、なかなか面倒に。一人親の苦労ってのは責任が単一にかかるってのもあるよなあとか、大人が一人だけだと満足にトイレもいけないなとかいろいろ考えさせられる。子どもが5歳で良かったとか、近くに (妻方の) 親戚がいたので助かったとか思った。

台風後に子どもが発熱。幸い機嫌は良く、一日経ったら解熱して問題なかった。

病院は12歳以下の面会はお断りなので、あまり子どもをつれてお見舞いにいくという感じではない。そういえばと思ったのでテレビ電話で通話。子どもは喜んでたみたい。テクノロジー。

洗濯物は仕舞うのが面倒なので山積みにして (山になるほどではないが)、宝探しだぞと子どもに探させた。割と楽しくて一石二鳥

週があけて入院診療計画書が渡された。事前に主治医から聞いた内容が文書になった感じ。週単位の入院計画でなかなか暗い気持ちにはなる。

と思ったら翌日に、経過がよければ次の週末に退院の予定となる。一回説明するから来てくださいと言われたので (必要なの?とは思いつつ) 早退して聞きにいった。部屋で座って説明されることになって、重病なのか?と不安になったがそういうわけではなく、ものすごく丁寧な先生というだけだった。紙に図解付きで明確に説明されるので、資料作りながらプレゼンしてる感じですごいな〜と考えてた。