我从这样的音频文件中分解了频谱图:
import librosa
y, sr = librosa.load('my audio file.wav')
S = np.abs(librosa.stft(y))
W, H = librosa.decompose.decompose(S, n_components=32)
现在如何将分解的频谱图重构为实际的频谱图。
我想要的是这种类型的功能:
S=recompose(W,H)
我从这样的音频文件中分解了频谱图:
import librosa
y, sr = librosa.load('my audio file.wav')
S = np.abs(librosa.stft(y))
W, H = librosa.decompose.decompose(S, n_components=32)
现在如何将分解的频谱图重构为实际的频谱图。
我想要的是这种类型的功能:
S=recompose(W,H)
返回的结果是线性分解为激活和组件。我们可以使用这两者的点积来反其道而行之。
import librosa
import numpy
import sklearn.decomposition
filename = librosa.util.example_audio_file()
y, sr = librosa.load(filename)
y = y[:20000] # smaller file, make it go faster
# abs() is not invertible, can replace with minmax scaling
S = numpy.abs(librosa.stft(y))
transformer = sklearn.decomposition.NMF(n_components=32)
W, H = librosa.decompose.decompose(S, transformer=transformer)
S_recomposed = W.dot(H)
print(numpy.sum(numpy.abs(S - S_recomposed)))
请注意,重组永远不会完美。但它应该会随着n_components
增加而变得更好。