class StationaryLoudnessIterator(): def __init__(self, model, outputName, loudnessLevelFunction=None): self.outputName = outputName self.extractor = StationaryLoudnessExtractor(model, outputName) self.converged = False if loudnessLevelFunction is None: self.loudnessLevelFunction = asIs else: self.loudnessLevelFunction = loudnessLevelFunction def extractLoudness(self, frequencies, intensityLevels, gainInDecibels=0): self.extractor.process(frequencies, intensityLevels + gainInDecibels) loudness = self.extractor.outputDict[self.outputName] loudnessLevel = self.loudnessLevelFunction(loudness) return loudnessLevel def process(self, frequencies, intensityLevels, targetLoudnessFrequencies, targetLoudnessIntensityLevels, tol, nIters=5, alpha=1.0): if type(targetLoudnessIntensityLevels) is np.ndarray: targetLoudness = self.extractLoudness( targetLoudnessFrequencies, targetLoudnessIntensityLevels) else: targetLoudness = targetLoudnessIntensityLevels storedGain = 0 self.converged = False for i in range(nIters): loudnessLevel = self.extractLoudness(frequencies, intensityLevels, storedGain) error = targetLoudness - loudnessLevel print(('Gain: %0.3f, Loudness Level: %0.3f, ' + 'Error: %0.3f') % (storedGain, loudnessLevel, error)) if np.abs(error) < tol: self.converged = True break else: storedGain += error * alpha if (i == (nIters - 1)): print "Reached iteration limit, not solved" \ "within desired error tolerance." return storedGain
def __init__(self, model, outputName, loudnessLevelFunction=None): self.outputName = outputName self.extractor = StationaryLoudnessExtractor(model, outputName) self.converged = False if loudnessLevelFunction is None: self.loudnessLevelFunction = asIs else: self.loudnessLevelFunction = loudnessLevelFunction
class StationaryLoudnessIterator(): def __init__(self, model, outputName, loudnessLevelFunction = None): self.outputName = outputName self.extractor = StationaryLoudnessExtractor(model, outputName) self.converged = False if loudnessLevelFunction is None: self.loudnessLevelFunction = asIs else: self.loudnessLevelFunction = loudnessLevelFunction def extractLoudness(self, frequencies, intensityLevels, gainInDecibels = 0): self.extractor.process(frequencies, intensityLevels + gainInDecibels) loudness = self.extractor.outputDict[self.outputName] loudnessLevel = self.loudnessLevelFunction(loudness) return loudnessLevel def process(self, frequencies, intensityLevels, targetLoudnessFrequencies, targetLoudnessIntensityLevels, tol, nIters = 5, alpha = 1.0): if type(targetLoudnessIntensityLevels) is np.ndarray: targetLoudness = self.extractLoudness(targetLoudnessFrequencies, targetLoudnessIntensityLevels) else: targetLoudness = targetLoudnessIntensityLevels storedGain = 0 self.converged = False for i in range(nIters): loudnessLevel = self.extractLoudness(frequencies, intensityLevels, storedGain) error = targetLoudness - loudnessLevel print (('Gain: %0.3f, Loudness Level: %0.3f, ' + 'Error: %0.3f') % (storedGain, loudnessLevel, error)) if np.abs(error) < tol: self.converged = True break else: storedGain += error * alpha if (i == (nIters-1)): print "Reached iteration limit, not solved within desired error tolerance." return storedGain
def __init__(self, model, outputName, loudnessLevelFunction = None): self.outputName = outputName self.extractor = StationaryLoudnessExtractor(model, outputName) self.converged = False if loudnessLevelFunction is None: self.loudnessLevelFunction = asIs else: self.loudnessLevelFunction = loudnessLevelFunction