DCF77: 時報システムはどのように機能するのですか?

こんにちは、ハブです。

おそらく時計や気象観測所を購入する人の多くは、パッケージにある電波時計や原子時計のロゴを見たことがあるでしょう。 時計をテーブルの上に置くだけで、しばらくすると自動的に正確な時刻に修正されるので、非常に便利です。
DCF77: 時報システムはどのように機能するのですか?

それがどのように機能するかを理解して、Python でデコーダーを作成してみましょう。

さまざまな時刻同期システムがあります。 ヨーロッパで最も人気があるのはドイツのシステムです DCF-77, 日本には独自の制度がある JJY, アメリカには制度があります WWVB、 等々。 次に、ロシアのヨーロッパ地域および近隣諸国のいくつかの場所で受信するのに最も適切でアクセスしやすいものとして、DCF77 についての話になります(極東の住民は反対の意見を持つかもしれませんが、彼らは順番に受信することができます)そして日本の信号を分析します;)。

以下に書くのはすべてDCF77に関するものになります。

信号受信

DCF77 は、77.5 kHz の周波数で動作し、振幅変調で信号を送信する長波局です。 この 50KW 局はフランクフルトから 25 km の場所にあり、1959 年に運用を開始し、1973 年に正確な時刻に日付情報が追加されました。 77 KHz の周波数の波長は非常に長いため、アンテナ フィールドの寸法も非常に適切です (写真は Wikipedia より):
DCF77: 時報システムはどのように機能するのですか?

このようなアンテナと電源入力により、受信エリアはヨーロッパのほぼ全域、ベラルーシ、ウクライナ、ロシアの一部をカバーします。

DCF77: 時報システムはどのように機能するのですか?

誰でも信号を記録できます。 これを行うには、オンライン受信機にアクセスするだけです http://websdr.ewi.utwente.nl:8901/、そこで周波数76.5KHzとUSB変調を選択します。 次のような画像が開きます。

DCF77: 時報システムはどのように機能するのですか?

そこでダウンロードボタンを押して、数分間のフラグメントを録音します。 もちろん、77.5KHz の周波数を記録できる「本物の」受信機をお持ちの場合は、それを使用できます。

もちろん、インターネット経由で電波時計を受信して​​も、真に正確な時刻を受信することはできません。信号は遅れて送信されます。 しかし、私たちの目標は信号の構造を理解することだけであり、そのためにはインターネットの録音で十分です。 もちろん、実際には受信と復号化に特殊なデバイスが使用されますが、これについては以下で説明します。

録音を受信したので、処理を開始しましょう。

信号のデコード

Python を使用してファイルをロードし、その構造を確認してみましょう。

from scipy.io import wavfile
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np

sample_rate, data = wavfile.read("dcf_websdr_2019-03-26T20_25_34Z_76.6kHz.wav")
plt.plot(data[:100000])
plt.show()

典型的な振幅変調が見られます。
DCF77: 時報システムはどのように機能するのですか?

デコードを簡単にするために、ヒルベルト変換を使用して信号エンベロープを取得しましょう。

analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])

拡大結果:
DCF77: 時報システムはどのように機能するのですか?

ローパス フィルターを使用してノイズの放射を滑らかにし、同時に平均値を計算しましょう。これは後で解析するのに役立ちます。

b, a = signal.butter(2, 20.0/sample_rate)
zi = signal.lfilter_zi(b, a)
A, _ = signal.lfilter(b, a, A, zi=zi*A[0])
avg = (np.amax(A) + np.amin(A))/2

結果 (黄色の線): ほぼ方形波の信号であり、解析が非常に簡単です。
DCF77: 時報システムはどのように機能するのですか?

解析中

まずビットシーケンスを取得する必要があります。 信号の構造自体は非常にシンプルです。
DCF77: 時報システムはどのように機能するのですか?

パルスは 0.1 番目の間隔に分割されます。 パルス間の距離が 0.9 秒 (つまり、パルス自体の長さが 0 秒) の場合、ビット シーケンスに「0.2」を追加し、距離が 0.8 秒 (つまり、パルスの長さが 1 秒) の場合、「2」を追加します。 各分の終わりは XNUMX 秒の長さの「長い」パルスによって示され、ビット シーケンスはゼロにリセットされ、再び充填が始まります。

上記はPythonで簡単に書けます。

sig_start, sig_stop = 0, 0
pos = 0
bits_str = ""
while pos < cnt - 4:
    if A[pos] < avg and A[pos+1] > avg:
        # Signal begin
        sig_start = pos
    if A[pos] > avg and A[pos+1] < avg:
        # Signal end
        sig_stop = pos

        diff = sig_stop - sig_start
    
        if diff < 0.85*sample_rate:
            bits_str += "1"
        if diff > 0.85*sample_rate and diff < 1.25*sample_rate:
            bits_str += "0"
        if diff > 1.5*sample_rate:
            print(bits_str)
            bits_str = ""

    pos += 1

その結果、ビットのシーケンスが得られます。この例では XNUMX 秒間は次のようになります。

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

ところで、興味深いことに、信号には「第 XNUMX 層」のデータもあります。 ビット シーケンスも次を使用してエンコードされます。 位相変調。 理論的には、これにより、信号が弱まった場合でも、より堅牢なデコードが提供されるはずです。

最後のステップは、実際のデータを取得することです。 ビットは 59 秒に XNUMX 回送信されるため、合計 XNUMX ビットがあり、そこにかなり多くの情報がエンコードされます。
DCF77: 時報システムはどのように機能するのですか?

ビットの説明は次のとおりです。 ウィキペディア、彼らはとても好奇心が強いです。 最初の 15 ビットは使用されませんが、警報システムや民間防衛に使用する計画がありました。 ビット A1 は、時計が次の 2 時間で夏時間に変更されることを示します。 ビット AXNUMX は、追加の うるう秒、地球の自転に応じて時間を調整するために使用されることがあります。 残りのビットは、時間、分、秒、日付をエンコードします。

DCF77: 時報システムはどのように機能するのですか?

自分で実験したい人のために、デコードコードがスポイラーの下に記載されています。
ソースコード

def decode(bits):
    if bits[0] != '0' or bits[20] != '1':
        return
    
    minutes, hours, day_of_month, weekday, month, year = map(convert_block,
                                                             (bits[21:28], bits[29:35], bits[36:42], bits[42:45],
                                                              bits[45:50], bits[50:58]))
    days = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
    print('{dow}, {dom:02}.{mon:02}.{y}, {h:02}:{m:02}'.format(h=hours, m=minutes, dow=days[weekday],
                                                               dom=day_of_month, mon=month, y=year))


def convert_ones(bits):
    return sum(2**i for i, bit in enumerate(bits) if bit == '1')


def convert_tens(bits):
    return 10*convert_ones(bits)


def right_parity(bits, parity_bit):
    num_of_ones = sum(int(bit) for bit in bits)
    return num_of_ones % 2 == int(parity_bit)


def convert_block(bits, parity=False):
    if parity and not right_parity(bits[:-1], bits[-1]):
        return -1
    
    ones = bits[:4]
    tens = bits[4:]
    return convert_tens(tens) + convert_ones(ones)

プログラムを実行すると、次のような出力が表示されます。

0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42

実は、それだけが魔法なのです。 このようなシステムの利点は、デコードが非常に簡単で、最も単純なマイクロコントローラーでもデコードできることです。 単純にパルスの長さを数えて 60 ビットを蓄積し、各分の終わりに正確な時刻を取得します。 他の時刻同期方法 (たとえば、GPS、あるいはインターネットなど) と比較すると、このような無線同期は事実上電力を必要としません。たとえば、通常の家庭用気象観測所は、単 2 電池 XNUMX 本で約 XNUMX 年間動作します。 そのため、壁掛け時計やストリートステーションウォッチはもちろん、腕時計にも電波同期が施されています。

DCF の利便性とシンプルさは、DIY 愛好家も魅了します。 わずか 10 ~ 20 ドルで、Arduino やその他のコントローラーに接続できる既製の受信機と TTL 出力を備えた既製のアンテナ モジュールを購入できます。
DCF77: 時報システムはどのように機能するのですか?

すでにArduino用に書かれています 既製のライブラリ。 ただし、マイクロコントローラーで何をしても、最終的には時計か気象観測所のどちらかになることはすでに知られています。 このようなデバイスを使用すると、受付エリアにいる限り、正確な時刻を取得するのは非常に簡単です。 「Atomic Clock」という文字を時計に貼り付けると同時に、デバイスが実際に原子時計を使用して同期していることを全員に説明できます。

希望者は、無線同期機能を備えた新しいメカニズムをインストールして、古い祖母の時計をアップグレードすることもできます。

DCF77: 時報システムはどのように機能するのですか?

eBay で「Radio Controlled Movement」というキーワードを使用して見つけることができます。

最後に、ここまで読んだ人のためのライフハックです。 たとえ次の数千キロメートル以内に無線信号送信機が 77 つも存在しないとしても、そのような信号を自分で生成することは難しくありません。 Google Playに「DCF77エミュレータ」というヘッドフォンに信号を出力するプログラムがあります。 著者によると、ヘッドフォンのワイヤーを時計に巻きつけると信号を拾ってくれるそうです(普通のヘッドフォンは9KHzの信号を出さないので、その仕組みは興味深いのですが、受信はおそらく高調波によるものだと思われます)。 Android 77 では、このプログラムは私にとってはまったく機能しませんでした。単に音が聞こえませんでした (あるいは、聞こえなかったのかもしれません。結局のところ、32KHz です:)。しかし、もしかしたら誰かがもっと幸運をもたらすかもしれません。 ただし、同じ Arduino または ESPXNUMX で簡単に作成できる本格的な DCF 信号発生器を自作する人もいます。

DCF77: 時報システムはどのように機能するのですか?
(ソース sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

まとめ

DCF システムは非常にシンプルで便利であることがわかりました。 シンプルで安価な受信機を使えば、いつでもどこでも、もちろん受信エリアでも正確な時刻を知ることができます。 デジタル化とモノのインターネットが普及したにもかかわらず、このようなシンプルなソリューションは長期間にわたって求められ続けるようです。

出所: habr.com

コメントを追加します