#!/usr/bin/python3

print('*** Preprost zvočni spektralni analizator - S53MV 24.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)

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 time                     #Merjenje hitrosti izvajanja
fskala=np.linspace(0,fs/2,pts)  #Izračunaj frekvenčno skalo [Hz]

def spekter(pts,avg,fs):    #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
    #  print(s)    #Poskusni izpis signala
    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]

#  plt.ion()   #Prvo risanje spektra z normalizacijo, interaktivno
fig=plt.figure()
ax=fig.add_subplot(111)
line1,=ax.plot(fskala,np.random.randn(pts)) #postavim pravilno skalo
plt.show(block=False)

stevec=0
zacetek=time.time()
while True: #Zanka risanja spektra
    line1.set_ydata(np.random.randn(pts))
    fig.canvas.draw()

    fig.canvas.flush_events()   #omogoča križec/alt-F4 pri plt.show(block=False) ali plt.ion()

    stevec+=1
    print(stevec/(time.time()-zacetek))
