所以我试图找到以不同频率采样的各种信号的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
在后端执行了很多我不知道如何访问的计算。
有什么办法可以实现:
psd
图中将y值读取到数组,或pyplot
中的当前x轴重新调整y轴?答案 0 :(得分:1)
您可以使用matplotlib.pyplot.psd
的返回值。它返回
Pxx
(一维数组)-缩放前的功率谱值P_{xx}
(实际值)freq
(一维数组)-与 Pxx 中的元素相对应的频率。line
(Line2D
)-此函数创建的行。仅在 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 )