DCF77 décodeur vs bruyant signal

j'ai presque terminé mon projet de décodeur libre DCF77. Tout a commencé quand j'ai remarqué que les bibliothèques standard (Arduino) DCF77 fonctionnent très mal sur les signaux bruyants. En particulier, je n'ai jamais été en mesure d'obtenir le temps hors des décodeurs lorsque l'antenne était proche de l'ordinateur ou lorsque ma machine à laver était en cours d'exécution.

ma première approche a été d'ajouter un filtre (numérique) exponentiel + trigger au signal entrant.

bien que cela améliore la situation de manière significative, il n'était pas encore très bonne. Puis j'ai commencé à lire quelques livres standards sur le traitement de signal numérique et surtout les œuvres originales de Claude Elwood Shannon. Ma conclusion était que la bonne approche serait de ne pas "décoder" le signal du tout parce qu'il est (sauf pour les secondes intercalaires) complètement connu a priori. Au lieu de cela, il serait plus approprié de faire correspondre les données reçues à un signal synthétisé localement et de déterminer simplement la phase appropriée. Cela permettrait à son tour de réduire la bande passante effective de quelques ordres de grandeur et donc réduire le bruit de manière significative.

la détection de Phase implique la nécessité d'une convolution rapide. L'approche standard pour une convolution efficace est bien sûr la Transformée de Fourier rapide. Toutefois, je suis mise en œuvre pour L'Arduino / Atmega 328. Je n'ai donc que 2K RAM. Donc au lieu de l'approche simple avec FFT, j'ai commencé à empiler des filtres de boucle verrouillée phase appariée. J'ai documenté les différentes étapes du projet ici:

  • premier essai: filtre exponentiel
  • Démarrer de la meilleure apprach: verrouillage de phase du signal / secondes les tiques
  • verrouillage de Phase à l'minutes
  • décodage des données des minutes et des heures
  • décodage du signal entier
  • Ajout d'une horloge locale pour traiter la perte de signal
  • en utilisant le local signal synthétisé pour une réacquisition de verrouillage plus rapide après une perte de signal

j'ai effectué de nombreuses recherches sur internet et je n'ai trouvé aucune approche semblable. Je me demande encore s'il y a des implémentations similaires (et peut-être meilleures). Ou s'il existe des recherches sur ce genre de reconstruction du signal.

ce que je ne cherche pas: concevoir des codes optimisés pour se rapprocher de la limite de Shannon. Je ne cherche pas non plus d'information sur le code de PRNG superposé DCF77. Je n'ai pas non plus besoin de conseils sur les "filtres appariés" car mon implémentation actuelle est une approximation d'un filtre apparié. Je ne cherche pas à trouver des conseils précis sur les décodeurs Viterbi ou les approches treillis - à moins qu'ils ne traitent de la question des contraintes de CPU et de RAM.

ce que je cherche: y a-t-il des descriptions / implémentations d'autres algorithmes non triviaux pour décoder des signaux comme DCF77, avec limitée CPU et RAM en présence de un bruit important? Peut-être dans des livres ou des journaux de l'ère internet?

18
demandé sur Udo Klein 2013-08-03 09:27:05

2 réponses

avez-vous envisagé d'utiliser un filtre chip matched pour effectuer votre convolution?

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

ils sont presque trivialement faciles à implémenter, car chaque période de puce / bit peut être implémentée sous la forme d'une ligne de retard de soustraction (utilisez un tampon circulaire)

un simple pour une onde carrée (fonctionnera aussi, mais moins optimal avec d'autres formes d'onde) de séquence inconnue (mais fréquence connue) peut être mis en œuvre quelque chose comme ceci:

// 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;
);

comme vous pouvez le voir, du point de vue des ressources, c'est relativement insignifiant. Il y a une forme d'onde spécifique que vous recherchez, vous pouvez les faire passer en cascade ensemble pour donner une corrélation plus longue.

2
répondu OllieB 2013-08-25 09:48:23

la référence aux filtres appariés par Ollie B. n'est pas ce que je demandais. J'ai déjà couvert cela dans mon blog.

cependant j'ai maintenant reçu un très bon indice par courrier privé. Il existe un document "Analyse de la Performance et Architectures de récepteurs D'horloges à commande par Radio DCF77" par Daniel Engeler. C'est le genre de choses, je suis à la recherche d'.

avec d'autres recherches À partir du papier Engeler j'ai trouvé les brevets allemands suivants DE3733966A1-Anordnung zum Empfang stark gestoerter Signale des Senders dcf-77 et DE4219417C2 - Schmalbandempfänger für Datensignale.

2
répondu Udo Klein 2014-07-06 13:54:08