19

オープン ソースの DCF77 デコーダ プロジェクトをほぼ完成させました。すべては、標準 (Arduino) DCF77 ライブラリがノイズの多い信号に対して非常にうまく機能しないことに気付いたときに始まりました。特に、アンテナがコンピューターの近くにあるとき、または洗濯機が作動しているときに、デコーダーからタイムアウトを取得することができませんでした.

私の最初のアプローチは、(デジタル) 指数フィルター + トリガーを入力信号に追加することでした。

これにより状況は大幅に改善されましたが、それでもあまり良くはありませんでした。それから、デジタル信号処理に関する標準的な本を何冊か読み始め、特にクロード・エルウッド・シャノンのオリジナル作品を読み始めました。私の結論は、適切なアプローチは、(うるう秒を除いて) アプリオリに完全に知られているため、信号をまったく「デコード」しないことであるということでした。代わりに、受信したデータをローカルで合成された信号に一致させ、適切な位相を決定する方が適切です。これにより、実効帯域幅が数桁減少し、ノイズが大幅に減少します。

位相検出は、高速畳み込みの必要性を意味します。効率的な畳み込みの標準的なアプローチは、もちろん高速フーリエ変換です。ただし、Arduino / Atmega 328 に実装しています。したがって、RAM は 2k しかありません。そこで、FFT を使用した単純なアプローチの代わりに、一致するフェーズ ロック ループ フィルターを積み重ねることにしました。ここで、さまざまなプロジェクトの段階を文書化しました。

私はインターネットをかなり広範囲に検索しましたが、同様のアプローチは見つかりませんでした。それでも、同様の(そしておそらくより良い)実装があるかどうか疑問に思います。または、この種の信号再構成に関する研究が存在する場合。

私が探していないもの: シャノン限界に近づくための最適化されたコードの設計。また、DCF77 に重畳された PRNG コードに関する情報も検索していません。現在の実装は一致したフィルターの近似であるため、「一致したフィルター」に関するヒントも必要ありません。Viterbi Decoders または Trellis アプローチに関する具体的なヒントは、私が探しているものではありません。CPU と RAM の厳しい制約の問題に対処しない限りは。

私が探しているもの: DCF77 のような信号をデコードするための他の重要なアルゴリズムの説明/実装はありますか? インターネット以前の時代の本や論文でしょうか?

4

2 に答える 2

2

畳み込みを実行するためにチップ整合フィルターを使用することを検討しましたか?

http://en.wikipedia.org/wiki/Matched_filter

各チップ/ビット周期は加算減算遅延線として実装できるため、それらはほとんど簡単に実装できます (循環バッファを使用します)。

未知のシーケンス(しかし既知の周波数)の方形波(これも機能しますが、他の波形では最適ではありません)の単純なものは、次のように実装できます。

// Filter class
template <int samples_per_bit>
class matchedFilter(
   public:
      // constructor
      matchedFilter() : acc(0) {};

      // destructor
      ~matchedFilter() {};

      int filterInput(int next_sample){
        int temp;
        temp = sample_buffer.insert(nextSample);
        temp -= next_sample;
        temp -= result_buffer.insert(temp);
        return temp;
      };

   private:
     int acc;
     CircularBuffer<samples_per_bit> sample_buffer;
     CircularBuffer<samples_per_bit> result_buffer;
);

// Circular buffer
template <int length>
class CircularBuffer(
   public:
      // constructor
      CircularBuffer() : element(0) {
         buffer.fill(0);
      };
      // destructor
      ~CircularBuffer(){};

      int insert(int new_element){
        int temp;
        temp = array[element_pos];
        array[element_pos] = new_element;
        element_pos += 1;
        if (element_pos == length){
           element_pos = 0;
        };
        return temp;
      }

   private:
      std::array<int, length> buffer;
      int element_pos;
);

ご覧のとおり、リソースに関しては、これは比較的些細なことです。求めている特定の波形がある場合は、これらをカスケードしてより長い相関関係を得ることができます。

于 2013-08-25T09:48:23.003 に答える
2

Ollie B. による一致したフィルターへの参照は、私が求めていたものではありません。これについては、以前にブログで取り上げました。

しかし、今では個人的なメールで非常に良いヒントを受け取りました. Daniel Engeler による論文「DCF77 Radio-Controlled Clocks のパフォーマンス分析と受信機アーキテクチャ」があります。これは私が探している種類のものです。

Engeler の論文からさらに検索すると、次のドイツ特許DE3733966A1 - Anordnung zum Empfang stark gestoerter Signale des Senders dcf-77およびDE4219417C2 - Schmalbandempfänger für Datensignale が見つかりました。

于 2013-10-06T11:51:18.070 に答える