1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
# Filtragre et calcul spl
from scipy.signal import ellip,filtfilt,
from numpy import array, arange,sum,append
from scipy.io import wavfile
from math import sqrt,log10
import wave
def octave_band(fc,frac):
bandlimits = [];
coeff = 1/(2**frac)
bandlimits.append(fc/coeff)
bandlimits.append(fc*coeff)
bandlimits = array(bandlimits)
return bandlimits
def ellip_bandpass(s,fc,fs,frac,ordre):
bandlimits = octave_band(fc,frac)
nyq = 0.5 * fs
cutfrq = bandlimits/nyq
b, a = ellip(ordre, 0.01, 60, cutfrq, btype='bandpass', analog=False, output='ba')
sf = filtfilt(b, a, s)
return sf
def sound_pressurelevel(fichwav,fc,frac,ordre,win,rec):
fid = wave.open(fichwav, 'r')
nbits = 8*fid.getsampwidth()-1
fmt = 2**nbits
fmt -= 1
fid.close()
fs, sig = wavfile.read(fichwav)
s = sig/fmt
sf = ellip_bandpass(s,fc,fs,frac,ordre)
fen = int(win*fs)
newwin = int(fen*(1-rec))
idxdebut = int(fen/2)
idxfin = s.size-idxdebut
idxc = arange(idxdebut,idxfin,newwin,dtype = 'int')
debSeg = idxc-idxdebut
finSeg = idxc+idxdebut
t = idxc/fs
spl = [[0]*idxc.size]
pt = sf**2
for idxseg,segid in enumerate(debSeg):
spl[idxseg] = 20*log10(sum(pt[debSeg[idxseg]:finSeg[idxseg]])/fen)
spl = array(spl)
return t,spl |
Partager