Усреднение одного периода периодического сигнала с помощью numpy

#python #numpy #scipy #scientific-computing

#python #numpy #scipy #научные вычисления

Вопрос:

Я сделал измерение в университете. Сигнал имеет много шума, но является периодическим.

Мой необработанный сигнал

Я знаю, в какой точке начинается сигнал (x = 36400) и какова частота (1 Гц) и частота дискретизации (48000). Таким образом, я могу «обрезать» отдельные периоды каждые 48000 пунктов. Я могу создавать массивы, выглядящие следующим образом [[period1],[period2],...,[period100]] , где каждый период содержит измеренные значения.

Теперь я хочу усреднять по каждому отдельному периоду, чтобы получить менее шумный сигнал. Я знаю, как это сделать с помощью for-циклов, но есть ли какой-нибудь быстрый способ использовать numpy для этого?

Комментарии:

1. трудно определить без некоторых выборочных данных, но если период соизмерим с индексами массива, должна быть возможность изменить его. Предположим, у вас есть 10 периодов, тогда len = 10 * 48000. Вы можете изменить форму: arr2 = arr.reshape(-1, 48000), что даст вам строку для каждого периода и столбец для каждой точки периода, а затем вы можете усреднить по строкам, используя arr2.mean(axis = 0) и получить усредненный период. Если данные не полностью соизмеримы, возможно, вам придется сделать что-то еще.

2. Это должно быть как бы соизмеримо с индексами. Как вы можете видеть, у меня есть некоторые измерения плоской линии впереди и в конце сигнала. Я использовал метод проб и ошибок, чтобы отрезать начало. Но если я найду правильный индекс начала, будет ли работать изменение формы (периоды * 48000, 48000)?

3. изменение формы (-1, 48000) будет работать для любого одномерного массива, имеющего n_periods * 48000 элементов. Значение -1 запрашивает numpy обработать это автоматически. Если по какой-то причине вы хотите уточнить это, тогда выполните reshape (n_periods, 48000)

4. Как я уже говорил вам, у меня нет сигнала в конце моего массива. Это просто плоская линия, и я не хочу добавлять это к средним значениям. Спасибо. Вы должны указать это в ответе, чтобы я мог пометить это как выполненное.

Ответ №1:

Сначала вы захотите нарезать свой массив, чтобы получить значимую часть

 n_periods = 10  # or however man
beginning_idx = 1000  # or whever the good data begins

raw_signal = ...  # this is the data you read in
good_signal = raw_signal[beginning_idx:beginning_idx   n_periods * 48000]
periodic = good_signal.reshape(n_periods, 48000)
avg_signal = periodic.mean(axis=0)