gefiltertete Frequenz einer wav plotten

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
manukanu
User
Beiträge: 1
Registriert: Mittwoch 12. Dezember 2018, 12:59

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()
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

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?
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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
a fool with a tool is still a fool, www.magben.de, YouTube
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

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?
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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
a fool with a tool is still a fool, www.magben.de, YouTube
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Danke!
Antworten