Relimit pyplot.psd график по оси Y на основе частотного диапазона - PullRequest
1 голос
/ 08 января 2020

Поэтому я пытаюсь найти psd различных сигналов, отобранных на разных частотах, и сравнить их в диапазоне 0-50 Гц

У меня есть этот код:

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

Что я пытаюсь сделать:

Поскольку сигналы фильтруются нижними частотами ниже 50 Гц, любой сигнал с частотой дискретизации выше 100 Гц имеет часть, которая падает до очень низкого значения psd. Так что мои ylim очень большие, и часть psd, которую я хочу увидеть, не так легко увидеть. Я могу вручную set_ylim каждый раз, когда я вызываю функцию, но я бы хотел, чтобы какой-то способ автоматически установил ylim для соответствия psd, однако каждый ручной метод, который я нашел в SO, предполагает, что я знаю значения y уже. Но psd выполняет множество вычислений на сервере, к которому я не знаю, как получить доступ.

Есть ли способ либо:

  1. прочитать значения y из графика psd для массива, или
  2. каким-либо образом замените ось y на основе текущей оси x в pyplot?

1 Ответ

1 голос
/ 08 января 2020

Вы можете использовать возвращаемые значения matplotlib.pyplot.psd. Возвращает

  • Pxx (массив 1D) - Значения для спектра мощности P_{xx} до масштабирования (действительное значение)
  • freq (массив 1D) - Частоты соответствующие элементам в 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 )
...