2025年10月1日更新
モク 位相計 1kHz~2GHzの入力信号に対し、最大6µラジアンの精度で位相を測定します。デジタル方式の位相同期ループ(PLL)アーキテクチャを採用し、従来のロックインアンプや周波数カウンタをはるかに凌駕する優れたダイナミックレンジと精度を実現します。Phasemeterはアラン偏差を計算し、プロットします。アラン偏差は単位のない安定性の指標であり、クロックやその他の発振器の安定性を定量化するために使用されます。このガイドでは、その計算方法を説明し、オーバーラップ変数\(\tau\)推定値を用いたアラン偏差の計算例を示します。
アラン偏差と位相測定の詳細については、 現代のクロックと発振器の定量化に関するウェビナーをご覧ください。
このアプリケーションノートをダウンロードするには、 こちら.
重複変数τ推定量を用いたアラン偏差
アラン偏差は安定性の指標であり、通常は時計やその他の発振器の安定性を定量化するために使用されます。周波数\(y\)のアラン偏差\(\sigma_y\)は、観測時間\(\tau\)の関数として、次の式で計算されます。
\(\sigma^2_y(\tau) = \frac{1}{2}\langle \left( \bar{y}_{n+1} – \bar{y}_n \right) \rangle\)
あるいは、位相測定値\(x\)を用いてアラン偏差を測定することもできます。位相と周波数は相関関係にあり、位相は周波数の積分\(x = \int{y \ dt}\)であり、式は次のようになります。
\(\sigma^2_y(\tau) = \frac{1}{2\tau^2}\langle \left( x_{n+2} – 2x_{n+1} + x_n\right) \rangle \)
ここで、\(x\) は時間経過にわたって測定された位相です。実際には、無限時間にわたる期待値を計算することは不可能です。有限のサンプリングレートと時間を持つハードウェアを使用する場合、この式を離散化する必要があります。Moku Phasemeter は、オーバーラップ変数 \(\tau\) 法を用いてアラン偏差を計算します。アラン偏差は以下のように定義されます。
\(\sigma^2_y(n\tau_0, N) = \frac{1}{2n^2 t_0^2 (N-2n)} \sum^{N-2n-1}_{i=0}{ \left( x_{i+2n}-2x_{i+n}+x_i \right)^2} \)
ここで、\(\tau_0\)は位相計のサンプリング周期、\(N\)は入力時系列で取得されたデータ点の数です。\(n\)は、望ましい\(\tau \simeq n \tau_0\)を最もよく推定するサンプリング周期の整数乗数です。\(x_i\)は、 i時系列の 番目の要素。
Moku 位相計を用いたアラン偏差
この例では、1MHz信号のアラン偏差を測定しました。 Moku:Pro 位相計。信号の周波数は150 Hzで10分間測定されました。アラン偏差を表示するには、Mokuディスプレイ上部の「周波数」タブを選択し、プロットエリアで「アラン偏差」を選択します。
Moku Phasemeterは、上記のように位相情報を用いて周波数のアラン偏差のみを計算することにご注意ください。「位相」または「振幅」タブを選択しても、アラン偏差のプロットは変化しません。
図1: 位相計オン Moku:Pro 1 MHz 信号のアラン偏差を表示します。
Pythonの実装
Pythonで同じ計算を実行して位相計の精度を検証します。関数 cal_oadev 位相情報の時系列、サンプリングレート、観測時間配列 \(\tau\) を入力として受け取ります。上記の式を用いてオーバーラップアラン偏差を計算し、\(n\tau_0\) と \(\sigma_y (n \tau_0)\) を配列として返します。
この関数を使用するには、NumPy および数学ライブラリが必要です。
#Import libraries import numpy as np import math def cal_oadev(data,rate,tauArray): tau0 = 1 / rate # Calculate the sampling period dataLength = data.size # Calculate N dev = np.array([]) # Create empty array to store the output. actualTau = np.array([]) の i in tauArray: n = math.floor(i / tau0) # Calculate n given a tau value. if n == 0: n = 1 # Use minimal n if tau is less than the sampling period. currentSum = 0 # Initialize the sum の j in range(0, dataLength - 2*n): # Accumulate the sum squared currentSum += (data[j+2*n] - 2*data[j+n] + data[j])**2 # Divide by the normalization coefficient devAtThisTau = currentSum / (2*n**2 * tau0**2 * (dataLength - 2*n)) dev = np.append(dev, np.sqrt(devAtThisTau)) actualTau = np.append(actualTau, n*tau0) return actualTau, dev #Return the actual tau and overlapped Allan deviation
計算例
この例では、Mokuで以前に取得した時系列をインポートし、Pythonスクリプトを使用してアラン偏差を計算しました。すべての生データとスクリプトは以下から入手できます。 こちら.
時系列データは「data.csv」ファイルにあります。このデータは埋め込まれた データロガー 位相計の測定結果です。最初の列は測定時間(秒)、4番目の列は測定位相(サイクル)です。スクリプト「CalculateAllanDeviation.py」はExcelファイルを読み込み、 cal_oadev 「AllanFunc.py」の関数。アラン偏差は対数スケールで\(\tau\)の関数としてプロットされます。アラン偏差のプロットは、Moku:ProとPythonスクリプトでよく一致しています。
この分析を実行するには、matplotlib および pandas ライブラリが必要です。
図 2: ログに記録された位相情報に基づいて Python を使用して計算されたアラン偏差。
参考情報
[1] Land, D. V., A. P. Levick, and J. W. Hand. “The use of the Allan deviation for the measurement of the noise and drift performance of microwave radiometers.” Measurement Science and Technology 18, no. 7 (2007): 1917.
[2] Allan, David W. “Statistics of atomic frequency standards.” Proceedings of the IEEE 54.2 (1966): 221-230.
[3] Howe, D.A., Allan, D.W., and Barnes, J.A. “Properties of signal sources and measurement methods.” Proceedings of the 35th Annual Symposium on Frequency Control (1981): TN-14 – TN-60.