#!/usr/bin/python3
from threading import Thread
import sounddevice as sd        #Poiskati na spletu in naložiti s pip3!
import numpy as np              #Uporaba učinkovitih funkcij numpy
import matplotlib.pyplot as plt #Risanje rezultata z matplotlib
import matplotlib.animation as animation
import time                     #Merjenje hitrosti izvajanja

print('*** Primer animiranega grafa A.Blatnik 25/09/2020 ***')
fs=44100  #Frekvenca vzročenja zvočnega signala (max 192000Hz)
pts=1024  #Število točk spektra 0...fs/2 (potenca 2 za učinkovit FFT)
avg=1     #Število povprečenj spektra (potenca 2 za učinkovit FFT)

def spectrum():  #Zajem signala z zvočno kartico in povprečenje spektra [dB]
    s=sd.rec(2*pts*avg,samplerate=fs,channels=1)                    #Vzorčenje ADC zvočne kartice
    sd.wait()   #Počakaj do konca vzorčenja
    s2=np.square(np.abs(np.fft.rfft(s,n=None,axis=0,norm=None)))    #Moč FFT
    return 10*np.log10(np.mean(s2[:-1].reshape(-1,avg),axis=1))     #Povprečje [dB]

def getData():    #Funkcija niti 1
    global yskala
    while(1):
        try:
            yskala = spectrum()
        except:
            print("Napaka, a delam naprej!")

def animate(i):
    line1.set_ydata(yskala)

# zacetek kode

fskala=np.linspace(0,fs/2,pts)  #Izračunaj frekvenčno skalo [Hz]
yskala = spectrum()  # globalna

fig=plt.figure()
ax=fig.add_subplot(111)
line1,=ax.plot(fskala,yskala) #postavim pravilno skalo

ani = animation.FuncAnimation(fig, animate, interval=10)

thread1 = Thread(target = getData)
thread1.start()

plt.show()
