61 lines
2.5 KiB
Python
61 lines
2.5 KiB
Python
#!/usr/bin/python3
|
|
|
|
print('*** Preprost zvočni spektralni analizator - S53MV 28.09.2020 ***')
|
|
print('*** popravek odziva za EliteBook 8540w - Andrej 11.2.2012 ***')
|
|
print('*** meritev faznega suma - Andrej 15.2.2012 ***')
|
|
|
|
fs=192000 #Frekvenca vzročenja zvočnega signala (max 192000Hz)
|
|
pts=2048 #Število točk spektra 0...fs/2 (potenca 2 za učinkovit FFT)
|
|
avg=128 #Š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
|
|
|
|
sd.default.device = 0
|
|
fskala=np.linspace(0,fs/2,2*pts+1)[:-1] #Izračunaj frekvenčno skalo [Hz]
|
|
|
|
### podatki za kalibracijo sistema
|
|
dSB = -42 #dB
|
|
L = 1256 #metrov
|
|
tau = L*1.4676/3e8
|
|
|
|
### popravek odziva
|
|
odziv = np.loadtxt("5mhz-polinom-2048tock.csv", delimiter=',')
|
|
a = odziv[:,1]
|
|
popravek = np.max(a[4:-1])-a[4:-1]
|
|
|
|
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(2*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],n=4*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[4:-1]+popravek
|
|
|
|
wfbp=None
|
|
while wfbp!=True: #Prvo risanje spektra z normalizacijo, ponovi s klikom miške
|
|
fig,ax=plt.subplots()
|
|
line,=ax.plot(fskala[4:-1],spekter(fs,pts,avg,fskala))
|
|
pn,=ax.plot(fskala[4:-1],spekter(fs,pts,avg,fskala))
|
|
wfbp=plt.waitforbuttonpress(0.01)
|
|
while wfbp==None: #Zanka risanja spektra, izhod=pritisk tipke ali miške
|
|
s = spekter(fs,pts,avg,fskala)
|
|
Pcal = np.amax(s)
|
|
K = Pcal - 3 - dSB
|
|
sum = s - k - 3 - 6 - 20*np.log10(np.sin(fskala[4:-1])*np.pi*tau)
|
|
line.set_ydata(s)
|
|
pn.set_ydata(sum)
|
|
fig.canvas.draw()
|
|
wfbp=plt.waitforbuttonpress(0.01)
|
|
plt.close()
|
|
print('*** Konec ***') #pritisk tipke na tipkovnici
|