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

时间:2020-01-08 06:43:04

标签: python matplotlib psd

所以我试图找到以不同频率采样的各种信号的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轴?

1 个答案:

答案 0 :(得分:1)

您可以使用matplotlib.pyplot.psd的返回值。它返回

  • Pxx(一维数组)-缩放前的功率谱值P_{xx}(实际值)
  • freq(一维数组)-与 Pxx 中的元素相对应的频率。
  • lineLine2D)-此函数创建的行。仅在 return_line True时返回。

在这种情况下,我认为可以使用频率值以编程方式适当地设置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, color = colors[i])
    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 )