Spaces:
Running
Running
from basis import ScoreBasis | |
import numpy as np | |
from numpy.linalg import norm | |
class SISDR(ScoreBasis): | |
def __init__(self): | |
super(SISDR, self).__init__(name='SISDR') | |
self.intrusive = False | |
def windowed_scoring(self, audios, score_rate): | |
# as provided by @Jonathan-LeRoux and slightly adapted for the case of just one reference | |
# and one estimate. | |
# see original code here: https://github.com/sigsep/bsseval/issues/3#issuecomment-494995846 | |
if len(audios) != 2: | |
return None | |
eps = np.finfo(audios[0].dtype).eps | |
reference = audios[1].reshape(audios[1].size, 1) | |
estimate = audios[0].reshape(audios[0].size, 1) | |
Rss = np.dot(reference.T, reference) | |
# get the scaling factor for clean sources | |
a = (eps + np.dot(reference.T, estimate)) / (Rss + eps) | |
e_true = a * reference | |
e_res = estimate - e_true | |
Sss = (e_true**2).sum() | |
Snn = (e_res**2).sum() | |
return 10 * np.log10((eps+ Sss)/(eps + Snn)) | |