#!/usr/bin/python3

print('*** Preprost zvočni spektralni analizator - S53MV 28.09.2020 ***')
fs=44100    #Frekvenca vzročenja zvočnega signala (max 192000Hz)
pts=32      #Število točk spektra 0...fs/2 (potenca 2 za učinkovit FFT)
avg=4       #Š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

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, 2D polje!
    sd.wait()           #Počakaj do konca vzorčenja
    nz=1.e-12           #Dodatek za neničelni argument logaritma
    s2=np.square(s)     #Izpis jakosti/max [dB]
    print('  Jakost:',"%.2f"%(10*np.log10(nz+np.mean(s2))),'dB   Max:',"%.2f"%(10*np.log10(nz+np.amax(s2))),'dB')
    s2=np.square(np.abs(np.fft.rfft(s.reshape(-1))))    #Moč FFT
    f=0.5/pts/pts/avg   #Faktor pretvorbe moči
#    return 10*np.log10(nz+f*np.mean(s2[:-1].reshape(-1,avg),axis=1))    #Povprečje [dB]
    s3=f*np.mean(s2[:-1].reshape(-1,avg),axis=1)
    s4=s3[1:]+s3[:-1]
    s3=np.insert(s4,0,[1])
    return 10*np.log10(nz+s3)

wfbp=None
while wfbp!=True:           #Prvo risanje spektra z normalizacijo, ponovi s klikom miške
    fig,ax=plt.subplots()
    line,=ax.plot(fskala,spekter(pts,avg,fs))
    wfbp=plt.waitforbuttonpress(0.01)
    while wfbp==None:       #Zanka risanja spektra, izhod=pritisk tipke ali miške
        line.set_ydata(spekter(pts,avg,fs))
        fig.canvas.draw()
        wfbp=plt.waitforbuttonpress(0.01)
    plt.close()
print('\n*** Konec ***')    #pritisk tipke na tipkovnici
