#!/usr/bin/python3

print('*** Zvočni spektralni analizator za vremenski radar - S53MV 26.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=32      #Število povprečenj spektra (potenca 2 za učinkovit FFT)
nz=1.e-9    #Dodatek za neničelni argument logaritma

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

Hzkm=1627   #Faktor pretvorbe frekvence v dolžino [km]
fskala=np.linspace(0,fs/2/Hzkm,pts)     #Izračunaj dolžinsko skalo [km]

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('  Jakost:',int(10*np.log10(nz+np.mean(np.square(s)))),end='   \r')   #Izpis jakosti
    s2=np.square(np.abs(np.fft.rfft(s,n=None,axis=0,norm=None)))                #Moč FFT
    return 10*np.log10(nz+np.mean(s2[:-1].reshape(-1,avg),axis=1)/pts/avg)      #Povprečje [dB]

fig,ax=plt.subplots()   #Prvo risanje spektra z normalizacijo
line,=ax.plot(fskala,spekter(pts,avg,fs))

while plt.waitforbuttonpress(0.01) is None: #Zanka risanja spektra, izhod=pritisk
    line.set_ydata(spekter(pts,avg,fs))
    fig.canvas.draw()

print('\n*** Konec programa ***')
