Спектральная плотность мощности реальных данных акселерометра показывает выброс при 0 Гц - PullRequest
1 голос
/ 30 июня 2019

Я собрал данные акселерометра с частотой около 50 Гц (каждые 0,02 сек., Как это позволяет Android ...)

Вот график величин 10-секундного окнаданных, по которым я хочу оценить спектральную плотность мощности:

Magnitudes of accelerometer data

После применения scipy.signal.periodogram вот так

fs = 50
f, Pxx_den = signal.periodogram(x, fs)
plt.semilogy(f, Pxx_den)
plt.show()

Я получаю следующий график, показывающий контур на 0 Гц: enter image description here

Ожидается ли этот контур?Я хотел бы снабдить алгоритм машинного обучения 3-мя самыми высокими PSD, но наличие контура в 0 заставляет меня думать, что что-то пошло не так.Или это не тот случай?Применение БПФ также приводит к высокой амплитуде при 0 Гц.

1 Ответ

4 голосов
/ 30 июня 2019

Это связано с трендендингом, который signal.periodigram делает по умолчанию.

Детрендинг - это удаление постоянного или линейного члена (обычно) из данных, по умолчанию постоянный-тренд. Это эффективно вычитает среднее значение в каждом разделе данных, по которому оценивается PSD. Вычитание среднего значения эквивалентно удалению постоянной составляющей или компонента с нулевой частотой из спектра.

Я сгенерировал фальшивые данные, только гауссовский шум, со смещением по оси Y на 5, аналогичное данным ваших данных. Из графика ниже видно, что детрендинг удаляет компонент с нулевой частотой, а настройка detrend=False сохраняет его. Имейте в виду, однако, что тренд-тренд может быть полезным. Вы можете или не можете заботиться об этом, в зависимости от того, какой анализ вас интересует.

from scipy import signal
import numpy as np
import matplotlib.pyplot as plt

x = np.random.randn(1000,) * 2.0 + 5.0 # White noise data, with y-offset
fs = 50.0
f, detrended_psd = signal.periodogram(x, fs)
_, psd = signal.periodogram(x, fs, detrend=False)
fig, ax = plt.subplots()
ax.semilogy(f, detrended_psd, linewidth=3.0, label='Detrended')
ax.semilogy(f, psd, linewidth=1.0, label='Not detrended')
fig.tight_layout()
ax.set_xlabel('Frequency (Hz)')
ax.set_ylabel('PSD')

enter image description here

...