Skip to content

filter-service

Der filter-service wendet Butterworth- und FIR (Finite Impulse Response) Filter auf Messkanäle an. Die angewendeten Filter werden im history-Attribut des zurückgegebenen Messkanals dokumentiert.

Laufzeitumgebung

Der filter-service muss Zugriff auf zwei Komponenten haben:

  • RabbitMQ Message Broker zum Empfangen der Filteranfragen und Ablegen der Berechnungsergebnisse und Logs.
  • MinIO Object Storage, der Messdaten zur Verfügung stellt, falls diese zu groß sind, um sie direkt in der Filteranfrage zu senden.
---
  config:
    class:
      hideEmptyMembersBox: true
---
classDiagram
    class Client
    class RabbitMQ {
        <<Message Broker>>
    }
    class filter-service {
        <<Service>>
    }
    class MinIO {
        <<Cloud Storage>>
    }

    Client --> RabbitMQ : publish requests
    filter-service --> RabbitMQ : subscribe requests
    filter-service ..> RabbitMQ : publish results
    filter-service ..> MinIO : fetch data
    filter-service --> MinIO : store filtered data

Der filter-service verwendet die folgenden RabbitMQ-Exchanges:

  • Measurement.Filter für Berechnungsanfragen und Antworten
    • Anfragen werden über den entsprechenden Routing Key empfangen und in der Queue Measurement.Filter.RequestQueue gehalten
    • Antworten auf die Berechnungsanfragen werden in der Queue Measurement.Filter.ResponseQueue gehalten
  • Measurement.Filter.Logs zur Speicherung von Logs in der Queue Measurement.Filter.Logs.Queue
  • Measurement.Filter.DeadLetter zur Speicherung von Nachrichten, die nicht verarbeitet werden können, in der Queue Measurement.Filter.DeadLetter.Queue
  • Measurement.Filter.Canceled zur Speicherung von fehlerhaften Berechnungsanfragen in der Queue Measurement.Filter.Canceled.Queue

Konfiguration

Umgebungsvariable Beschreibung Typ Werte
RABBITMQ_HOST* Der Host, unter dem der RabbitMQ Message Broker erreichbar ist. string
RABBITMQ_PORT Der Port, unter dem der RabbitMQ Message Broker erreichbar ist. int 64-65535 (default: 5672)
RABBITMQ_USER* Der RabbitMQ-Benutzer, den der filter-service zur Athentifizierung verwendet. string
RABBITMQ_PASSWORD* Das Passwort des konfigurierten RabbitMQ-Benutzers. string
RABBITMQ_VIRTUALHOST* Der verwendete Virtualhost des RabbitMQ-Servers. string
RABBITMQ_EXCHANGE_NAME Der RabbitMQ-Exchange, auf dem die Berechnungsanfragen und -ergebnisse abgelegt werden. string default: Measurement.Filter
MINIO_HOST* Name bzw. Adresse des Hosts, unter dem der MinIO-Server erreichbar ist. string
MINIO_PORT* TCP-Port, unter dem der MinIO-Server erreichbar ist. int 64-65535
MINIO_BUCKET* Name des MinIO-Buckets, der zum Laden der Messdaten verwendet werden soll. string
MINIO_USER* Nutzername, den der Service zur Authentifizierung mit MinIO verwenden soll. string mind. 8 Zeichen
MINIO_PASSWORD* Passwort des konfigurierten MinIO-Nutzers. string mind. 8 Zeichen
MINIO_TLS* Gibt an, ob TLS bzw. HTTPS für eine verschlüsselte Kommunikation verwendet werden soll. boolean
MINIO_SSL_CERT_FILE Pfad zu einer Datei, die die verwendete Kette an SSL-Zertifikaten enthält (mit der u.a. das Server-Zertifikat signiert wurde). Ist keine solche Datei angegeben, wird das Client-Zertifikat bei Anfragen nicht überprüft. string
RABBITMQ_DEAD_LETTER_EXCHANGE Der RabbitMQ-Exchange, an den durch einen Timeout oder sonstige Fehler nicht bearbeitete Nachrichten weitergeleitet werden. string default: Measurement.Filter.DeadLetter

API

Allgemeines Anfrage- und Antwortformat

Alle Anfragen an den filter-service enthalten die folgenden Felder:

  • filter_config Je nach Filterart unterschiedliche Parameter für den anzuwendenden Filter. Welche Filterart verwendet wird, entscheidet der Routing Key, an den die Anfrage gesendet wird. Alle Filter können als Nullphasenfilter und Filter mit Offsetkorrektur konfiguriert werden:
    • zero_phase: Optionale Ausführung als Nullphasen-Filter zur Eliminierung von Phasenverschiebungen (default: false).
    • offset_correction: Optionale Ausführung einer Offsetkorrektur (mögliche Werte: median, mean, first_value, default: keine Offsetkorrektur)
  • data_provider Stellt den zu filternden Messkanal zur Verfügung (siehe \ref{Data Provider}).
  • channel_name Name des zu filternden Kanals.
  • request_minio_bucket Optionale Angabe des MinIO-Buckets, aus dem die Messdaten geladen werden sollen (Default: Umgebungsvariable MINIO_BUCKET).
  • Guid Eine optionale GUID, die von der Anfrage in die Antwort übernommen wird.
  • result_data_provider_type Optionale Angabe, ob das Filterergebnis direkt zurückgegeben oder in MinIO gespeichert werden soll: explicit oder minio (Default: explicit)
  • result_minio_bucket Optionale Angabe des MinIO-Buckets, in dem Filterergebnisse mit result_data_provider_type=minio gespeichert werden sollen (Default: Umgebungsvariable MINIO_BUCKET).
Anfrageformat
{
    "data_provider": {...},
    "channel_name": "TestChannel",
    "filter_config": {...},
    "request_minio_bucket": "request_bucket" | null,
    "result_data_provider_type": "explicit" | "minio" | null,
    "result_minio_bucket": "result_bucket" | null,
    "Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}

Die Antwort des filter-service ist wie folgt aufgebaut:

  • data_provider Stellt den zu gefilterten Messkanal zur Verfügung. Im history-Attribut ist der angewendete Filter dokumentiert.
  • channel_name Name des gefilterten Kanals.
  • service_version Version des filter-service Containers, der die Anfrage bearbeitet hat.
  • Guid Optionale aus der Anfrage übernommene GUID.
Antwortformat
{
    "data_provider": {...},
    "channel_name": "TestChannel",
    "service_version": "1.2.3",
    "Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e"
}

Butterworth Tiefpassfilter

  • Routing Key: Butterworth.Lowpass
  • Parameter der Filterkonfiguration:
    • cutoff_frequency*: Frequenz zwischen 0 und halber Sample Rate des Messkanals, oberhalb derer das Signal gedämpft wird.
    • order*: Ordnung des Filters größer 0.
{
    "data_provider": {...},
    "channel_name": "TestChannel",
    "filter_config": {
        "cutoff_frequency": 16,
        "order": 5,
        "zero_phase": true | false | null,
        "offset_correction": "median" | "mean" | "first_value" | null
    },
    "request_minio_bucket": "request_bucket" | null,
    "result_data_provider_type": "explicit" | "minio" | null,
    "result_minio_bucket": "result_bucket" | null,
    "Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
    "type": "filter",
    "filter_type": "butterworth",
    "pass_type": "lowpass",
    "cutoff_frequency": 16,
    "order": 5,
    "zero_phase": true | false,
    "offset_correction": "median" | "mean" | "first_value" | null
}

Butterworth Tiefpassfilter ohne Korrekturen

Butterworth Tiefpassfilter mit Nullphasenkorrektur

Butterworth Bandpassfilter

  • Routing Key: Butterworth.Bandpass
  • Aufbau der Filterkonfiguration:
    • frequency_band*: Frequenzpaar zwischen 0 und halber Sample Rate des Messkanals, außerhalb derer das Signal gedämpft wird.
    • order*: Ordnung des Filters größer 0.
{
    "data_provider": {...},
    "channel_name": "TestChannel",
    "filter_config": {
        "frequency_band": [20, 40],
        "order": 4,
        "zero_phase": true | false | null,
        "offset_correction": "median" | "mean" | "first_value" | null
    },
    "request_minio_bucket": "request_bucket" | null,
    "result_data_provider_type": "explicit" | "minio" | null,
    "result_minio_bucket": "result_bucket" | null,
    "Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
    "type": "filter",
    "filter_type": "butterworth",
    "pass_type": "bandpass",
    "frequency_band": [20, 40],
    "order": 4,
    "zero_phase": true | false,
    "offset_correction": "median" | "mean" | "first_value" | null
}

Butterworth Bandpassfilter ohne Offset-, mit Nullphasenkorrektur

Butterworth Bandpassfilter mit Offset- und Nullphasenkorrektur

Butterworth Hochpassfilter

  • Routing Key: Butterworth.Highpass
  • Aufbau der Filterkonfiguration:
    • cutoff_frequency*: Frequenz zwischen 0 und halber Sample Rate des Messkanals, unterhalb derer das Signal gedämpft wird.
    • order*: Ordnung des Filters zwischen größer 0.
{
    "data_provider": {...},
    "channel_name": "TestChannel",
    "filter_config": {
        "cutoff_frequency": 16,
        "order": 5,
        "zero_phase": true | false | null,
        "offset_correction": "median" | "mean" | "first_value" | null
    },
    "request_minio_bucket": "request_bucket" | null,
    "result_data_provider_type": "explicit" | "minio" | null,
    "result_minio_bucket": "result_bucket" | null,
    "Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
    "type": "filter",
    "filter_type": "butterworth",
    "pass_type": "highpass",
    "cutoff_frequency": 16,
    "order": 5,
    "zero_phase": true | false,
    "offset_correction": "median" | "mean" | "first_value" | null
}

FIR Tiefpassfilter

  • Routing Key: FIR.Lowpass
  • Aufbau der Filterkonfiguration:
    • cutoff_frequency*: Frequenz zwischen 0 und halber Sample Rate des Messkanals, oberhalb derer das Signal gedämpft wird.
    • order*: Ordnung des Filters größer 0.
    • window_type*: Zu verwendende Fensterform (rectangular, triangular, hamming, hanning oder blackman).
{
    "data_provider": {...},
    "channel_name": "TestChannel",
    "filter_config": {
        "cutoff_frequency": 16,
        "order": 1000,
        "window_type": "rectangular" | "triangular" | "blackman" | "hamming" | "hanning",
        "zero_phase": true | false | null,
        "offset_correction": "median" | "mean" | "first_value" | null
    },
    "request_minio_bucket": "request_bucket" | null,
    "result_data_provider_type": "explicit" | "minio" | null,
    "result_minio_bucket": "result_bucket" | null,
    "Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
    "type": "filter",
    "filter_type": "fir",
    "pass_type": "lowpass",
    "cutoff_frequency": 16,
    "order": 1000,
    "window_type": "rectangular" | "triangular" | "blackman" | "hamming" | "hanning",
    "zero_phase": true | false,
    "offset_correction": "median" | "mean" | "first_value" | null
}

FIR Tiefpassfilter mit Korrekturen

FIR Bandpassfilter

  • Routing Key: FIR.Bandpass
  • Aufbau der Filterkonfiguration:
    • frequency_band*: Frequenzpaar zwischen 0 und halber Sample Rate des Messkanals, außerhalb derer das Signal gedämpft wird.
    • order*: Ordnung des Filters größer 0.
    • window_type*: Zu verwendende Fensterform (rectangular, triangular, hamming, hanning oder blackman).
{
    "data_provider": {...},
    "channel_name": "TestChannel",
    "filter_config": {
        "frequency_band": [20, 40],
        "order": 1000,
        "window_type": "rectangular" | "triangular" | "blackman" | "hamming" | "hanning",
        "zero_phase": true | false | null,
        "offset_correction": "median" | "mean" | "first_value" | null
    },
    "request_minio_bucket": "request_bucket" | null,
    "result_data_provider_type": "explicit" | "minio" | null,
    "result_minio_bucket": "result_bucket" | null,
    "Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
    "type": "filter",
    "filter_type": "fir",
    "pass_type": "bandpass",
    "frequency_band": [20, 40],
    "order": 1000,
    "window_type": "rectangular" | "triangular" | "blackman" | "hamming" | "hanning",
    "zero_phase": true | false,
    "offset_correction": "median" | "mean" | "first_value" | null
}

FIR Bandpassfilter mit Korrekturen

FIR Hochpassfilter

  • Routing Key: FIR.Highpass
  • Aufbau der Filterkonfiguration:
    • cutoff_frequency*: Frequenz zwischen 0 und halber Sample Rate des Messkanals, unterhalb derer das Signal gedämpft wird.
    • order*: Ordnung des Filters größer 0. Die Ordnung muss für FIR-Hochpassfilter gerade sein.
    • window_type*: Zu verwendende Fensterform (rectangular, triangular, hamming, hanning oder blackman).
{
    "data_provider": {...},
    "channel_name": "TestChannel",
    "filter_config": {
        "cutoff_frequency": 16,
        "order": 1000,
        "window_type": "rectangular" | "triangular" | "blackman" | "hamming" | "hanning",
        "zero_phase": true | false | null,
        "offset_correction": "median" | "mean" | "first_value" | null
    },
    "request_minio_bucket": "request_bucket" | null,
    "result_data_provider_type": "explicit" | "minio" | null,
    "result_minio_bucket": "result_bucket" | null,
    "Guid": "f901f9e9-e205-45aa-831c-46e6761fcf8e" | null
}
{
    "type": "filter",
    "filter_type": "fir",
    "pass_type": "highpass",
    "cutoff_frequency": 16,
    "order": 1000,
    "window_type": "rectangular" | "triangular" | "blackman" | "hamming" | "hanning",
    "zero_phase": true | false,
    "offset_correction": "median" | "mean" | "first_value" | null
}

FIR Hochpassfilter mit Korrekturen