2016-06-06 7 views
0



было интересно, если есть реализация для энергии для 1-D сейсмического импульса в Python, так же, как Matlab «[Ea, Ed] = Wenergy (C, L) '. Я попытался написать один на моем собственном, но я не уверен в этом: Формулы:энергия для 1-D сейсмического импульса в Python

enter image description here

Где Dj предполагается вектор детализации, и J = 1,2, ... , ld и N1 - длина данных на уровне разложения.

import json 
import pywt 
f=open('DataFile.txt','r') 
D=json.load(f) 
f.close() 
#create the wavelet function 
db1 = pywt.Wavelet('db13') 
#calculate the number of necessary decompositions 
NbrDecomp= pywt.dwt_max_level(len(D), db1)+1 
#Initialize an empty list to receive the Detail and Approximation 
Vector = [None] * NbrDecomp 
#we use the Wavelet decomposition in the pywt module 
Vector = pywt.wavedec(D, db1) 
#Now Vector = [Approxiamtion N, Details N, Details N-1,.....] 
#Where N would be the number of decompositions 

Согласно определению энергии на уровне к является:

Energy(k)=np.sqrt(sum([x**2 for x in Vecktor[len(Vektor)-N-1-k]])/len(Vektor)) 

ли реализация правильно?

+1

Есть ли причина, по которой вы используете квадратный корень NumPy, когда функция 'sqrt' из' math' pac kage в Python будет делать? Ни один из ваших типов данных не был первоначально «numpy'-массивами, поэтому я не вижу смысла в вычислении массива вывода« numpy »(по крайней мере, не в этой текущей версии кода), когда вы, вероятно, не будете использовать« numpy » s представление данных. – rayryeng

+0

Ваше двойное определение «Вектор» излишнее, вы не можете предварительно распределить список и полностью переписать его. –

+0

Удалить квадратный корень – ejectamenta

ответ

1

Вы можете упростить ваш код немного:

coeffs[len(coeffs) - k - 1] 

можно переписать в виде

coeffs[-k] 

и вы можете сделать квадратуру и суммирование в качестве одной операции NumPy (так как вы используете NumPy уже есть)

def Energy(coeffs, k): 
    return np.sqrt(np.sum(np.array(coeffs[-k]) ** 2))/len(coeffs[-k])