Я новичок в python, а также в обработке сигналов. Я пытаюсь вычислить значение mean
среди некоторого частотного диапазона сигнала.Самый быстрый способ получить среднее значение частот в пределах диапазона
То, что я пытаюсь сделать это следующим образом:
import numpy as np
data = <my 1d signal>
lF = <lower frequency>
uF = <upper frequency>
ps = np.abs(np.fft.fft(data)) ** 2 #array of power spectrum
time_step = 1.0/2000.0
freqs = np.fft.fftfreq(data.size, time_step) # array of frequencies
idx = np.argsort(freqs) # sorting frequencies
sum = 0
c =0
for i in idx:
if (freqs[i] >= lF) and (freqs[i] <= uF) :
sum += ps[i]
c +=1
avgValue = sum/c
print 'mean value is=',avgValue
Я думаю, что расчет хорошо, но это занимает много времени, как для данных более 15GB и время обработки возрастает в геометрической прогрессии. Есть ли какой-либо самый быстрый способ, чтобы я мог быстрее получить среднее значение спектра мощности в пределах некоторого частотного диапазона. Заранее спасибо.
РЕДАКТИРОВАТЬ 1
Я следовал this code для расчета спектра мощности.
EDIT 2
This не отвечает на мой вопрос, как он вычисляет среднее значение по всему массиву/список, но я хочу, имею в виду по части массива.
РЕДАКТИРОВАТЬ 3
Решение от Jez использования маски сокращает время. На самом деле у меня более 10 каналов 1D-сигнала, и я хочу обрабатывать их таким же образом, то есть средние частоты в диапазоне каждого канала отдельно. Я думаю, что петли питона медленны. Есть ли альтернатива для этого? Как это:
for i in xrange(0,15):
data = signals[:, i]
ps = np.abs(np.fft.fft(data)) ** 2
freqs = np.fft.fftfreq(data.size, time_step)
mask = np.logical_and(freqs >= lF, freqs <= uF)
avgValue = ps[mask].mean()
print 'mean value is=',avgValue
Возможно, вы захотите использовать 'и' вместо' & 'в своей директиве' if'. – ForceBru
@ForceBru Это не имеет никакого значения. – Muaz
Один побитно, а другой - логический. Нет, здесь неважно, но это только потому, что это деталь реализации Python. Использование «и» для ясности предпочтительнее. –