def SpreadSignalEnergy(data, THR, freqs, sampleRate): """ Set SMR for each critical band in sfBands. Arguments: data: is an array of N time domain samples MDCTdata: is an array of N/2 MDCT frequency lines for the sin windowed in data which have been scaled up by a factor of 2^MDCTscale FFTdata is an array of N frequency lines sampleRate: is the sampling rate of the time domain samples sfBands: points to information about which MDCT frequency lines are in which scale factor band Returns: final= an array showing an SPL value of the masking curve for every line Logic: Performs an FFT of data[N] and identifies tonal and noise maskers. Sums their masking curves with the hearing threshold at each MDCT frequency location to the calculate absolute threshold at those points. Then determines the maximum signal-to-mask ratio within each critical band and returns that result in the SMR[] array. """ N=len(data) Fs=sampleRate windata=HanningWindow(data) #window with a Hanning window xk=np.fft.fft(windata) xksqr=np.square(np.abs(xk)) aintdft=float(4)/((N**2)*0.375)*xksqr freqint= np.arange(0,Fs,float(Fs)/(float(N))) frontfreq=freqint[0:N/2] r=spk.findpeaks(aintdft) fronthalfdft=aintdft[0:N/2] freqidx=r[0] freqidxfloats=freqidx freqidx=np.array([(lambda x: int(x))(ii) for ii in freqidx]) #converts into integers peakintensities=r[1] freqidxhalf=freqidx[0:len(freqidx)/2] #peak frequency indices peakstrint=peakintensities[0:len(peakintensities)/2]#peak intensity values spldft=SPL(peakstrint) setzeros=np.zeros(N/2) freqloca=setzeros actualfreq=float(Fs)*(freqidxhalf)/N+ float(Fs)/N*0.5 #create a mask for each frequency found maskerarray=np.array([]) for ii in range(len(spldft)): m=SpreadEnergy(actualfreq[ii],spldft[ii],True) maskerarray=np.append(maskerarray,m) fin=Thresh(freqs) quietthresintens=Intensity(fin) zvec=Bark(freqs) sumofmasks=np.array(quietthresintens) #masks are added to threshold of quiet for ii in range(len(maskerarray)): #addition of all the masks tempmask=maskerarray[ii] sumofmasks=sumofmasks+np.power(tempmask.vIntensityAtBark(zvec),SCALEA) sumofmasks = np.power(sumofmasks,1./SCALEA) maskthres=SPL(sumofmasks) return maskthres # TO REPLACE WITH YOUR CODE
def CalcSMRs(data, MDCTdata, MDCTscale, sampleRate, sfBands): """ Set SMR for each critical band in sfBands. Arguments: data: is an array of N time domain samples MDCTdata: is an array of N/2 MDCT frequency lines for the data in data which have been scaled up by a factor of 2^MDCTscale MDCTscale: is an overall scale factor for the set of MDCT frequency lines sampleRate: is the sampling rate of the time domain samples sfBands: points to information about which MDCT frequency lines are in which scale factor band Returns: SMR[sfBands.nBands] is the maximum signal-to-mask ratio in each scale factor band Logic: Performs an FFT of data[N] and identifies tonal and noise maskers. Sums their masking curves with the hearing threshold at each MDCT frequency location to the calculate absolute threshold at those points. Then determines the maximum signal-to-mask ratio within each critical band and returns that result in the SMR[] array. """ N=len(data) Fs=sampleRate windata=HanningWindow(data) #window with a Hanning window xk=np.fft.fft(windata) xksqr=np.square(np.abs(xk)) aintdft=float(4)/((N**2)*0.375)*xksqr freqint= np.arange(0,Fs,float(Fs)/(float(N))) frontfreq = np.float_((np.arange(len(MDCTdata))+.5)*Fs)/np.float(len(MDCTdata)*2) r=spk.findpeaks(aintdft) fronthalfdft=aintdft[0:N/2] freqidx=r[0] freqidxfloats=freqidx freqidx=np.array([(lambda x: int(x))(ii) for ii in freqidx]) #converts into integers peakintensities=r[1] freqidxhalf=freqidx[0:len(freqidx)/2] #peak frequency indices peakstrint=peakintensities[0:len(peakintensities)/2]#peak intensity values spldft=SPL(peakstrint) setzeros=np.zeros(N/2) freqloca=setzeros actualfreq=float(Fs)*(freqidxhalf)/N+ float(Fs)/N*0.5 #create a mask for each frequency found maskerarray=np.array([]) for ii in range(len(spldft)): m=Masker(actualfreq[ii],spldft[ii],True) maskerarray=np.append(maskerarray,m) fin=Thresh(frontfreq) quietthresintens=Intensity(fin) zvec=Bark(frontfreq) sumofmasks=np.array(quietthresintens) #masks are added to threshold of quiet for ii in range(len(maskerarray)): #addition of all the masks tempmask=maskerarray[ii] sumofmasks=sumofmasks+np.power(tempmask.vIntensityAtBark(zvec),SCALEA) sumofmasks = np.power(sumofmasks,1./SCALEA) maskthres=SPL(sumofmasks) #####do MDCT lines correspond to half frequency away? MDCTdatanorm=MDCTdata/float(2**MDCTscale) MDCTintensity= 4*np.square(MDCTdatanorm) SMR=SPL(MDCTintensity)-maskthres llim=sfBands.lowerLine ulim=sfBands.upperLine numBands=sfBands.nBands SMRband=np.zeros(numBands) for ii in range(sfBands.nBands): idxlower=llim[ii] idxhigh=ulim[ii] SMRband[ii]=np.max(SMR[idxlower:idxhigh+1]) return SMRband # TO REPLACE WITH YOUR CODE