【发布时间】:2016-03-26 04:58:14
【问题描述】:
我是 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 计算功率谱。
编辑 2
This 没有回答我的问题,因为它计算整个数组/列表的平均值,但我想要部分数组的平均值。
编辑 3
jez 使用面具的解决方案减少了时间。实际上,我有超过 10 个 1D 信号通道,我想以相同的方式处理它们,即分别在每个通道范围内的平均频率。我认为python循环很慢。有什么替代品吗? 像这样:
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指令中使用and而不是&。 -
@ForceBru 我猜这没什么区别。
-
@Muaz,numpy 与你的问题非常相关,所以我添加了标签,你会想要避免缓慢的 python 循环
-
您似乎在计算一个无意义的值,它只是量化的 UF 和 LF 的平均值,可以在一行代码中完成。
标签: python performance numpy signal-processing