如何记录缩放二维矩阵/图像
How to log scale a 2D Matrix / Image
我有一个音频频谱图的 2D numpy 数组,我想将它保存为图像。
我正在使用 librosa 库来获取频谱。我还可以使用 librosa.display.specshow()
函数绘制它。如下所示,有多种不同的缩放类型。
import PIL
import librosa
import librosa.display
def display_spectrogram(spectrum, sampling_rate):
"""
Frequency types:
‘linear’, ‘fft’, ‘hz’ : frequency range is determined by the FFT window and sampling rate.
‘log’ : the spectrum is displayed on a log scale.
‘mel’ : frequencies are determined by the mel scale.
‘cqt_hz’ : frequencies are determined by the CQT scale.
‘cqt_note’ : pitches are determined by the CQT scale.
"""
librosa.display.specshow(spectrum, sr=sampling_rate, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrogram')
plt.show()
我还可以将频谱图(一个 numpy 数组)转换为图像并保存如下。
img = PIL.Image.fromarray(spectrum)
img.save("out.png")
我有原始频谱图(线性缩放),我想用对数刻度的 y 轴保存它。我查看了 library's source code 以了解它是如何缩放的,但无法弄清楚。
如何记录缩放图像/2D numpy 数组的 y 轴?
Y 轴的实际对数变换是由 matplotlib 完成的。您可以通过 ax.set_yscale('linear')
对比 ax.set_yscale('linear')
来测试这一点。因此,最简单的替代方法是调整 matplotlib 图以删除刻度、边框等。这是一个例子:
如果您想自己进行对数缩放,步骤如下
- 计算Y轴上的当前频率。使用 librosa.fft_frequencies
- 计算 Y 轴上所需的频率。使用
numpy.logspace
或类似的
- 以所需频率对频谱图进行采样,例如使用 scipy.interpolate (interp1d)
我有一个音频频谱图的 2D numpy 数组,我想将它保存为图像。
我正在使用 librosa 库来获取频谱。我还可以使用 librosa.display.specshow()
函数绘制它。如下所示,有多种不同的缩放类型。
import PIL
import librosa
import librosa.display
def display_spectrogram(spectrum, sampling_rate):
"""
Frequency types:
‘linear’, ‘fft’, ‘hz’ : frequency range is determined by the FFT window and sampling rate.
‘log’ : the spectrum is displayed on a log scale.
‘mel’ : frequencies are determined by the mel scale.
‘cqt_hz’ : frequencies are determined by the CQT scale.
‘cqt_note’ : pitches are determined by the CQT scale.
"""
librosa.display.specshow(spectrum, sr=sampling_rate, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrogram')
plt.show()
我还可以将频谱图(一个 numpy 数组)转换为图像并保存如下。
img = PIL.Image.fromarray(spectrum)
img.save("out.png")
我有原始频谱图(线性缩放),我想用对数刻度的 y 轴保存它。我查看了 library's source code 以了解它是如何缩放的,但无法弄清楚。
如何记录缩放图像/2D numpy 数组的 y 轴?
Y 轴的实际对数变换是由 matplotlib 完成的。您可以通过 ax.set_yscale('linear')
对比 ax.set_yscale('linear')
来测试这一点。因此,最简单的替代方法是调整 matplotlib 图以删除刻度、边框等。这是一个例子:
如果您想自己进行对数缩放,步骤如下
- 计算Y轴上的当前频率。使用 librosa.fft_frequencies
- 计算 Y 轴上所需的频率。使用
numpy.logspace
或类似的 - 以所需频率对频谱图进行采样,例如使用 scipy.interpolate (interp1d)