根据频率范围重新限制 pyplot.psd y 轴图

Relimit pyplot.psd y-axis plot based on frequency range

所以我试图找到以不同频率采样的各种信号的 psd 并在 0-50Hz 范围内比较它们

我有这个代码:

for i, th in enumerate(ths): 
    NFFT = 2**(int(np.log2(th.size)) - 8)
    ax.psd(th, Fs = freq[i], NFFT = NFFT, scale_by_freq = False)
ax.set_xlabel("freq (Hz)")
ax.set_xlim(0,50)
#ax.relim()              #These
#ax.autoscale()          #Didn't work

我想做什么:

由于信号在 50Hz 以下被低通滤波,因此采样频率高于 100Hz 的任何信号都有一部分会降至非常低的 psd。所以我的ylim很大,我想看的psd部分不容易看到。每次调用该函数时,我都可以手动 set_ylim,但我想要一些方法来自动设置 ylim 以适应 psd,但是我在 SO 上找到的每个手动方法都假设我已经知道 y 值了。但是psd在后端做了很多我不知道如何访问的计算。

有没有办法:

  1. psd 图中读取 y 值到数组,或
  2. 如何根据 pyplot 中的当前 x 轴重新调整 y 轴?

您可以使用 matplotlib.pyplot.psd 的 return 值。它returns

  • Pxx(一维数组)- 缩放前功率谱的值 P_{xx}(实值)
  • freq(一维数组)- Pxx.
  • 中元素对应的频率
  • line (Line2D) - 此函数创建的行。只有 returned 如果 return_lineTrue.

在这种情况下,我相信频率值可用于以编程方式适当地设置 y 限制,如下所示:

mx = []; mn = []
for i, th in enumerate(ths): 
    NFFT = 2**(int(np.log2(th.size)) - 8)
    val, freqs = ax.psd(th, Fs = freq[i], NFFT = NFFT, scale_by_freq = False)
    mx.append(val[freqs <= 50].max())
    mn.append(val[freqs <= 50].min())
ax.set_xlabel("freq (Hz)")
ax.set_xlim(0,50)
ax.set_ylim(np.rint(10 * np.log10(np.array(mn).min())) - 2, 
            np.rint(10 * np.log10(np.array(mx).max())) + 2 )