Low pass Filter

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gumiho
User
Beiträge: 8
Registriert: Sonntag 19. April 2020, 15:24

Hallo liebe Community,

ich habe ein Problem und komme nicht weiter. Ich möchte ein Low pass filter/Tiefpassfilter mit eine Cutoff Frequenz fc=2000 Hz an einer Audiodatei anwenden. Die Audiodatei heißt Africa5dBGainLPF.wav. Ich habe mich auch im Internet umgesehen und festgestellt, dass bei einem LPF auch ein Array und ein Moving average zum Einsatz kommt. Doch leider verstehe ich nicht wofür diese gut sein sollen. Momentan konnte ich seit zwei Tagen bis jetzt nur auf dieses Ergebnis kommen, dass natürlich nicht das Endergbnis ist. Ich hoffe ihr könnt mir weiterhelfen bzw erklären wieso mein Array und einen Moving Average benötigt.



Code: Alles auswählen

import matplotlib.pyplot as plt
import numpy as np
import wave
import sys
import math
import contextlib

fname = 'Africa5dBGainLPF.wav'
outname = 'filtered.wav'

cutOffFrequency = 2000.0
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Array enthaelt deine Samples. Und ein Moving Average stellt einen Weg dar, einen Tiefpass zu implementieren. Da du ja schon wave importierst, solltest du es auch benutzen, um das WAV-File einzulesen, so dass du ein Array mit den Samples bekommst. Den Zusammenhang zwischen einem moving Average und der Cutoff-Frequenz ist mir auf Anhieb auch nicht bekannt, aber es ist klar, dass je laenger das m-a ist, desto niedriger der cutoff. Stattdessen ist es ggf. zielfuehrender, sich hiermit auseinander zu setzen: https://docs.scipy.org/doc/scipy/reference/signal.html
NPC
User
Beiträge: 56
Registriert: Dienstag 8. Januar 2019, 17:51

Servus,

Ich kenne die Moving average Filter als running average Filter (falls unterschiedlich liege ich falsch).

Der Vorteil der running average filter besteht darin, dass (nach dem Einschwingen) jeder folgende Wert (sample) augenblicklich tiefpass gefiltert werden kann. Das heißt ohne dass man weiß wie viele noch kommen und wie diese Aussehen. Das heißt man kann eine beliebig lange Liste an samples (solange diese zum Einschwingen reicht) hindurchschieben und bekommt dabei für jeden Sample einen neuen Mittelwert. Ein sehr einleuchtendes beispiel finde ich den discrete time RC-filter, welcher in manchen Messgeräten zum Einsatz kommt.
(sorry weiß nicht wie ich das hier tiefstelle, schreibe es in latex rein)

X_{out}[n, T_{s}] = c * X_{out}[n-1, T_{s}] + (1 - c) X_{in}[n, T_{s}]

Dabei ist X_{out}[n, T_{s}] der n-te Mittelwert, T_{s} ist die Sampletime und X_{in}[n, T_{s}] der n-te gesamplete Wert. c ist eine Konstante welche die Gewichtung des neuen wertes Steuert (bzw. des letzten Mittelwerts). Damit legst du auch die Cutoff-frequenz fest.
es gilt laut https://en.wikipedia.org/wiki/Low-pass_filter#RC_filter für diesen z.B.:
f_{c} = 1/(2 \pi RC).
Ich bin mir gerade nicht sicher aber im oberen beispiel gilt glaube ich:
c = e^{T_{s}/RC}

Mittelt man über absolut alle werte, dann bekommt man logischerweise den Mittelwert und somit den DC anteil. Daher ist es klar, dass je kleiner (1-c) desto kleiner die cutoff frequenz. (Je länger das Array der Werte, die ich berücksichtige, desto kleiner die cutoff frequenz)

Aber Scipy bietet dir dabei echt viele hilfreiche Funktionen an. __deeds__ hat ja schon einen link dazu reingestellt.
Gumiho
User
Beiträge: 8
Registriert: Sonntag 19. April 2020, 15:24

NPC hat geschrieben: Mittwoch 13. Mai 2020, 18:06 Servus,

Ich kenne die Moving average Filter als running average Filter (falls unterschiedlich liege ich falsch).

Der Vorteil der running average filter besteht darin, dass (nach dem Einschwingen) jeder folgende Wert (sample) augenblicklich tiefpass gefiltert werden kann. Das heißt ohne dass man weiß wie viele noch kommen und wie diese Aussehen. Das heißt man kann eine beliebig lange Liste an samples (solange diese zum Einschwingen reicht) hindurchschieben und bekommt dabei für jeden Sample einen neuen Mittelwert. Ein sehr einleuchtendes beispiel finde ich den discrete time RC-filter, welcher in manchen Messgeräten zum Einsatz kommt.
(sorry weiß nicht wie ich das hier tiefstelle, schreibe es in latex rein)

X_{out}[n, T_{s}] = c * X_{out}[n-1, T_{s}] + (1 - c) X_{in}[n, T_{s}]

Dabei ist X_{out}[n, T_{s}] der n-te Mittelwert, T_{s} ist die Sampletime und X_{in}[n, T_{s}] der n-te gesamplete Wert. c ist eine Konstante welche die Gewichtung des neuen wertes Steuert (bzw. des letzten Mittelwerts). Damit legst du auch die Cutoff-frequenz fest.
es gilt laut https://en.wikipedia.org/wiki/Low-pass_filter#RC_filter für diesen z.B.:
f_{c} = 1/(2 \pi RC).
Ich bin mir gerade nicht sicher aber im oberen beispiel gilt glaube ich:
c = e^{T_{s}/RC}

Mittelt man über absolut alle werte, dann bekommt man logischerweise den Mittelwert und somit den DC anteil. Daher ist es klar, dass je kleiner (1-c) desto kleiner die cutoff frequenz. (Je länger das Array der Werte, die ich berücksichtige, desto kleiner die cutoff frequenz)

Aber Scipy bietet dir dabei echt viele hilfreiche Funktionen an. __deeds__ hat ja schon einen link dazu reingestellt.
Hey Danke für die ausführliche Antwort.
Mein Dankeschön kommt bisschen spät, da ich komischerweise keine Benachrichtigung bekommen habe.
Antworten