☠ 06-Frekvenciaszűrő

Az ifft fügvény segítségével kaphatjuk meg egy függvény inverz Fourier transzformáltját. Alkalmazva ezt a függvényt, szűrjük ki a ../data/zenebona fileban található hangmintából a 20Hz-nél magasabb frekvenciájú komponenseket!

Megoldás

Először betöltjük a szükséges csomagokat

In [1]:
%pylab inline
from numpy.fft import *  
Populating the interactive namespace from numpy and matplotlib

Majd betöltjük az adatokat az adatfájlból

In [2]:
adatok = loadtxt("../data/zenebona.txt")
plot(adatok[:,0], adatok[:,1])
xlabel("idö", size=12)
ylabel("Jelerösség", size=12)
title("Az adatfájl tartalma", size=18, y=1.05)
Out[2]:
<matplotlib.text.Text at 0x7fa683360320>

Eztuán transzformáljuk a jelet, és a 20 Hz-nél magasabb összetevőket lenullázzuk:

In [3]:
Fjel = fft(adatok[:,1])
freq = fftfreq(len(adatok[:,0]), d=adatok[1,0] - adatok[0,0])
plot(abs(freq), abs(Fjel), label="elötte")

for i in range(len(Fjel)):
    if abs(freq[i]) > 20:
        Fjel[i] = 0
plot(abs(freq), abs(Fjel), label="utána")

title("A transzformált jel a frekvenciaszürés elött és után", size=18, y=1.05)
xlabel("frekvencia", size=12)
ylabel("transzformált jelerösség", size=12)
legend()
Out[3]:
<matplotlib.legend.Legend at 0x7fa68133df98>

A szűrt jelet visszatranszformálva az inverztranszformációva, egy másik jelet kapunk, amiben már nincsenek 20 Hz-nél magasabb frekvenciák.

In [4]:
ujjel = ifft(Fjel)
plot(adatok[:,0], ujjel)
xlabel("idö", size=12)
ylabel("Jelerösség", size=12)
title("A szürt jel")
/opt/conda/lib/python3.5/site-packages/numpy/core/numeric.py:474: ComplexWarning: Casting complex values to real discards the imaginary part
  return array(a, dtype, copy=False, order=order)
Out[4]:
<matplotlib.text.Text at 0x7fa68158cb38>