Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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