将 Python 中的 PSD 图旋转 90 度

Rotate PSD plot in Python by 90 degrees

我使用命令生成了功率谱密度 (PSD) 图

plt.psd(x,512,fs)

我正试图从一篇论文中复制这个情节:

我能够得到频谱图和 PSD 图。然而,我需要让 PSD 逆时针旋转 90 度才能正确显示。你能帮我把 PSD 图逆时针旋转 90 度吗?谢谢!

这是我目前的代码:

import matplotlib.pyplot as plt
from matplotlib import transforms
import numpy as np
from numpy.fft import fft, rfft
from scipy.io import wavfile
from scipy import signal
import librosa
import librosa.display

from matplotlib.gridspec import GridSpec

input_file = (r'G:/File.wav')

fs, x = wavfile.read(input_file)
nperseg = 1025
noverlap = nperseg - 1
f, t, Sxx = signal.spectrogram(x, fs,
                               nperseg=nperseg,
                               noverlap=noverlap,
                               window='hann')

def format_axes(fig):
    for i, ax in enumerate(fig.axes):
        ax.tick_params(labelbottom=False, labelleft=False)

fig = plt.figure(constrained_layout=True)

gs = GridSpec(6, 5, figure=fig)
ax1 = plt.subplot(gs.new_subplotspec((0, 1), colspan=4))

ax2 = plt.subplot(gs.new_subplotspec((1, 0), rowspan=4))

plt.psd(x, 512, fs)  # How to rotate this plot 90 counterclockwise?
plt.ylabel("")
plt.xlabel("")
# plt.xlim(0, t)

fig.suptitle("Sound Analysis")
format_axes(fig)

plt.show()

我建议输出功率谱和频率的值,以便手动创建旋转图。

例如,让我们考虑一个由 10,000 个样本组成的随机数组 x,在 Fs=1,000:

处采样
import matplotlib.pyplot as plt
import numpy as np
x=np.random.random(10000)
fs=1000
Pxx, freq = plt.psd(x, 512, fs)

此代码段返回以下图片:

为了创建旋转图,只需使用 plot:

plt.plot(10*np.log10(Pxx),freq)
plt.xlabel("Power Spectrial Density (dB/Hz)")
plt.ylabel('Frequency')

这将 return:

编辑:请记住函数psd输出Pxx,但你需要绘制的是10*np.log10(Pxx)。如 psd 帮助页面所述: 对于绘图,功率以 10log10(Pxx) 为分贝,尽管 Pxx 本身是 returned.