audio-spektralc/matjaz/sap.py3

41 lines
1.9 KiB
Python

#!/usr/bin/python3
print('*** Preprost zvočni spektralni analizator - S53MV 28.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=64 #Število povprečenj spektra
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+1)[:-1] #Izračunaj frekvenčno skalo [Hz]
def spekter(fs,pts,avg,fskala): #Zajem signala z zvočno kartico in povprečenje spektra [dB]
s=sd.rec(pts*(1+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:',"%.1f"%(10*np.log10(nz+np.mean(s2))),'dB Vrh:',"%.1f"%(10*np.log10(nz+np.amax(s2))),'dB',end=' ')
o=1+np.cos(np.linspace(-np.pi,np.pi,2*pts)) #Okno dvignjeni kosinus
k=0
s2=np.zeros(pts)
while k<pts*avg: #Seštevanje moči FFT
s2=s2+np.square(np.abs(np.fft.rfft(o*s.reshape(-1)[k:k+2*pts])[:-1]))
k+=pts
s=10*np.log10(nz+0.5*s2/pts/pts/avg) #Povprečje [dB]
print(' Max:',"%.1f"%(np.amax(s)),'dB @',"%.1f"%(fskala[np.argmax(s)]),'Hz')
return s
wfbp=None
while wfbp!=True: #Prvo risanje spektra z normalizacijo, ponovi s klikom miške
fig,ax=plt.subplots()
line,=ax.plot(fskala,spekter(fs,pts,avg,fskala))
wfbp=plt.waitforbuttonpress(0.01)
while wfbp==None: #Zanka risanja spektra, izhod=pritisk tipke ali miške
line.set_ydata(spekter(fs,pts,avg,fskala))
fig.canvas.draw()
wfbp=plt.waitforbuttonpress(0.01)
plt.close()
print('*** Konec ***') #pritisk tipke na tipkovnici