2025年10月1日更新
モク 位相計 1 kHz ~ 2 GHz の周波数で発振する入力信号に対して、最大 6 µradian の精度で位相を測定します。デジタル実装の位相ロックループアーキテクチャを使用することで、従来のロックインアンプや周波数カウンタの能力をはるかに超える優れたダイナミックレンジと精度を実現しています。フェーズメータは、クロックやその他の発振器の安定性を定量化するために使用される無次元の安定性尺度であるアラン偏差を計算し、プロットします。このガイドでは、その計算方法を説明し、オーバーラップ変数 \(tau\) 推定器を使用したアラン偏差の計算例を示します。アラン偏差と位相測定の詳細については、 現代のクロックと発振器の定量化に関するウェビナーをご覧ください。
このアプリケーションノートをダウンロードするには、 こちら.
Mokuをデモモードで試す
Mokuアプリをダウンロード →
よくある質問への回答
知識ベースをご覧ください →
Mokuユーザーとつながる
ユーザーフォーラムに参加する →
重複変数τ推定量を用いたアラン偏差
アラン偏差は安定性の尺度であり、一般的に時計やその他の発振器の安定性を定量化するために使用されます。周波数 \(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}{2tau^2}langle left( x_{n+2} – 2x_{n+1} + x_nright) rangle \)
ここで、\(x\)は時間経過に伴って測定された位相です。実際には、無限時間にわたる期待値を計算することは不可能です。有限のサンプリングレートと時間を持つハードウェアを使用する場合、この式を離散化する必要があります。Moku Phasemeterは、オーバーラップ変数\(tau\)法を使用してアラン偏差を計算します。アラン偏差は次のように定義されます。\(sigma^2_y(ntau_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\) の配列を入力として受け取ります。上記の式を使用してオーバーラップしたアラン偏差を計算し、\(ntau_0\) と \(sigma_y (n tau_0)\) を配列として返します。この関数を使用するには、NumPy および math ライブラリが必要です。#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」内の関数。アラン偏差は、対数スケールでτの関数としてプロットされます。アラン偏差のプロットは、Moku:ProとPythonスクリプト間でよく一致しました。この分析を実行するには、matplotlibとpandasライブラリが必要です。
図 2: ログに記録された位相情報に基づいて Python を使用して計算されたアラン偏差。



