我已经到处看了几天了,但还没有找到解决方案……我可以使用以下内容构建Librosa频谱图并提取振幅/频率数据:
audio, sr = librosa.load('short_piano melody_keyCmin_110bpm.wav', sr = 22500)
spectrum = librosa.stft(audio, n_fft=2048, window=scipy.signal.windows.hamming)
D = librosa.amplitude_to_db(np.abs(spectrum), ref=np.max)
n = D.shape[0]
Nfft = 1+2*(n-1)
freq_bins = librosa.fft_frequencies(sr=sr, n_fft=Nfft)但是,我不能将D和freq_bins中的数据转换回频谱。一旦我能够这样做,我就可以将新的频谱转换为.wav文件,并收听我重建的音频……如有任何建议,我们将不胜感激!谢谢。
发布于 2021-06-11 19:34:02
当我正确回答你的问题时,你想要从你的幅值重建真实/虚构的频谱。你需要它的相位分量,然后它都是简单的复数算术。您应该知道,短时傅立叶变换的输出是一个复数组,振幅是每个数字的绝对值,而相位是每个数字的角度。
下面是一个时域信号转换为幅度/相位并在不修改的情况下返回的示例:
% get the complex valued spectrum from a sample
spectrum = librosa.stft(audio, n_fft=2048,window=scipy.signal.windows.hamming)
# get magnitude and phase from the complex numbers
magnitude = np.abs(spectrum)
phase = np.angle(spectrum)
# reconstruct real/imaginary parts from magnitude and phase
spectrum = magnitude * np.exp(1j*phase)
# transform back to time-domain在您的例子中,当然,您应该首先将db值转换回振幅值。即使没有使用librosa的经验,我也相信它也有一个功能。
https://stackoverflow.com/questions/67830673
复制相似问题