サイクルの周期を測定する
2022年6月19日
ホモダイン・ディスクリミネーター
「Discriminator」を日本語にすると「弁別器」となり、周波数の変化を振幅の変化に戻す機能のことを言う。
「Homodyne」とは、信号にそれ自身を掛け合わせることを意味し、ここでは直近の足の信号に1つ前の足の信号の「複素共役数(complex conjugate)」を掛け合わせる操作を指す。複素共役数は「虚数部の符号を逆にした複素数」のことである。
複素数 | $ z = a + bi$ |
複素共役数 | $\bar{z} = a - bi $ |
ホモダインした信号を極形式で表現すると以下のようになり、振幅の2乗と角周波数($2 \pi$ / 周期)が得られる。
$$ (pe^{j\omega t_n})(pe^{-j\omega t_{n-1}}) = p^2s^{j\omega(t_n - t_{n-i})} = p^2e^{j \omega} $$
ここに角周波数が現れるということは、2つの足から周期を計算することが可能であることを意味する。
周期を計算するコード
実際の計算は、極形式ではなく、実数部と虚数部を使って行う。
// ①
I2 := 0.2 * I2 + 0.8 * I2[1]
Q2 := 0.2 * Q2 + 0.8 * Q2[1]
// ②
Re = I2 * I2[1] + Q2 * Q2[1]
Im = I2 * Q2[1] - Q2 * I2[1]
// ③
Re := 0.2 * Re + 0.8 * Re[1]
Im := 0.2 * Im + 0.8 * Im[1]
// ④
period := Im != 0 and Re != 0 ? 2 * pi / math.atan(Im / Re) : 0
period := math.min(math.max(period, 0.67 * period[1]), 1.5 * period[1])
period := math.min(math.max(period, 6), 50)
period := 0.2 * period + 0.8 * period[1]
// ⑤
smoothPeriod := 0.33 * period + 0.67 * smoothPeriod[1]
信号と雑音の混じり合った信号($ S + N$)があったとする。この信号に自身をを掛け合わせると以下のようになる。
$$ (S +N)(S + N) = S^2 + SN + NS + N^2 $$
これら4つの積の内3つは、雑音が入り使うことができない。そのため、信号を掛け合わせる前に不要な要素を取り除く操作を行う(①)。
信号は平滑化を行った後、1つ前の足の複素共役数と掛け合わせる(②)。 実数部は2つの実数部の積と2つの虚数部の積の和として出力され、虚数部は2つのクロス乗積の差として出力される。
出力された実数部と虚数部は、周期の計算を行う前に再び平滑化する(③)。
周期は実数部と虚数部の比の逆正接(アークタンジェント)を取ることで計算できる(④)。 周期の変化率は前の周期の±50%に制限し、且つ計算する周期は足6本から足50本の範囲内とする。 そうして計算された周期を、ここでも平滑化する。
最後にプロットした時に滑らかな線となるよう「smoothPeriod 」を用意している(⑤)。