Seite 1 von 1

gefiltertete Frequenz einer wav plotten

Verfasst: Mittwoch 12. Dezember 2018, 13:05
von manukanu
Hey Leute ich lerne gerade wie man plottet in python und habe bereits ein programm geschrieben, welches die frequenz einer wav datei plottet. Nun möchte ich einen Filter auf die wav anwenden, welcher die frequenzen unter 300Hz und über 3400Hz filtert, also eine Art bandpass filter? Könnte mir jemand sagen was der einfachste weg ist dies zu tun? ich habe bereits eine ganze weile dazu recherchiert aber das gefundene hat mir nicht weitergeholfen. Z.B etwas wie wav_filename.low_pass_filter(3400)", doch das funktioniert nicht, wäre auch zu schön gewesen :P.
Ich freue mich riesig über jeden der sich Zeit nimmt und mir versucht weiterzuhelfen. Liebe Grüße!

Code: Alles auswählen

%matplotlib inline

from scipy.io import wavfile
from scipy.fftpack import fft, fftfreq
import matplotlib.pyplot as plt
from pydub import AudioSegment

wav_filename = "speech_clean (1).wav"

samplerate, data = wavfile.read(wav_filename)

total_samples = len(data)

limit = int((total_samples /2)-1)

fft_abs = abs(fft(data))

freqs = fftfreq(total_samples,1/samplerate)

fftfreq?

# plot the frequencies
plt.plot(freqs[:limit], fft_abs[:limit])
plt.title("Frequency spectrum of %s" % wav_filename)
plt.xlabel('frequency in Hz')
plt.ylabel('amplitude')
plt.show()

Re: gefiltertete Frequenz einer wav plotten

Verfasst: Mittwoch 12. Dezember 2018, 23:18
von ArtooDetoo
Du transformierst das Sprachsample ja mit fft() schon in den Frequenzbereich. Da könntest du dann alles unter 300 Hz und alles über 3400 Hz auf 0 setzen, und dann per ifft() (gibt es auch im fftpack) zurücktransformieren. Hilft dir das schon weiter?

Re: gefiltertete Frequenz einer wav plotten

Verfasst: Freitag 14. Dezember 2018, 09:57
von MagBen
ArtooDetoo hat geschrieben: Mittwoch 12. Dezember 2018, 23:18Da könntest du dann alles unter 300 Hz und alles über 3400 Hz auf 0 setzen, und dann per ifft() (gibt es auch im fftpack) zurücktransformieren
Das funktioniert so nicht. Wenn du das Spektrum mit der Rechteck-Funktion multiplizierst und dann wieder rücktransformierst, dann kriegst du in das Signal unschöne Störungen rein, weil die Rechteck-Funktion 2 Sprünge hat. Stattdessen wird bei einem Bandpass das mit einer "Fenster-Funktion" gemacht:
https://de.wikipedia.org/wiki/Fensterfunktion
https://docs.scipy.org/doc/numpy-1.13.0 ... indow.html

Re: gefiltertete Frequenz einer wav plotten

Verfasst: Freitag 14. Dezember 2018, 10:08
von ArtooDetoo
MagBen hat geschrieben: Freitag 14. Dezember 2018, 09:57Wenn du das Spektrum mit der Rechteck-Funktion multiplizierst und dann wieder rücktransformierst, dann kriegst du in das Signal unschöne Störungen rein, weil die Rechteck-Funktion 2 Sprünge hat.
Kannst du das genauer erklären?

Re: gefiltertete Frequenz einer wav plotten

Verfasst: Freitag 14. Dezember 2018, 10:17
von MagBen
ArtooDetoo hat geschrieben: Freitag 14. Dezember 2018, 10:08Kannst du das genauer erklären?
Das haben andere schon gemacht:
de.wikipedia.org/wiki/Fensterfunktion#Beispiele_von_Fensterfunktionen
Insbesondere de.wikipedia.org/wiki/Fensterfunktion#Rechteck-Fenster
und Spectral leakage:
https://en.wikipedia.org/wiki/Spectral_leakage
https://de.wikipedia.org/wiki/Leck-Effekt

Re: gefiltertete Frequenz einer wav plotten

Verfasst: Freitag 14. Dezember 2018, 10:24
von ArtooDetoo
Danke!