feat: Prepare all damage cases vibration record data to be merged inside two variables "signal_sensor1" and "signal_sensor2". Closes #23
This commit is contained in:
550
code/notebooks/stft.ipynb
Normal file
550
code/notebooks/stft.ipynb
Normal file
File diff suppressed because one or more lines are too long
192
code/src/features/frequency_domain_features.py
Normal file
192
code/src/features/frequency_domain_features.py
Normal file
@@ -0,0 +1,192 @@
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
from scipy.fft import fft, fftfreq
|
||||
|
||||
def get_mean_freq(signal, frame_size, hop_length):
|
||||
mean = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
current_mean = np.sum(y)/frame_size
|
||||
mean.append(current_mean)
|
||||
return np.array(mean)
|
||||
|
||||
def get_variance_freq(signal, frame_size, hop_length):
|
||||
var = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
current_var = (np.sum((y - (np.sum(y)/frame_size))**2))/(frame_size-1)
|
||||
var.append(current_var)
|
||||
return np.array(var)
|
||||
|
||||
def get_third_freq(signal, frame_size, hop_length):
|
||||
third = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
current_third = (np.sum((y - (np.sum(y)/frame_size))**3))/(frame_size * (np.sqrt((np.sum((y - (np.sum(y)/frame_size))**2))/(frame_size-1)))**3)
|
||||
third.append(current_third)
|
||||
return np.array(third)
|
||||
|
||||
def get_forth_freq(signal, frame_size, hop_length):
|
||||
forth = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
current_forth = (np.sum((y - (np.sum(y)/frame_size))**4))/(frame_size * ((np.sum((y - (np.sum(y)/frame_size))**2))/(frame_size-1))**2)
|
||||
forth.append(current_forth)
|
||||
return np.array(forth)
|
||||
|
||||
def get_grand_freq(signal, frame_size, hop_length):
|
||||
grand = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
f = np.fft.fftfreq (L,.1/25600)[:int(L/2)]
|
||||
current_grand = np.sum(f * y)/np.sum(y)
|
||||
grand.append(current_grand)
|
||||
return np.array(grand)
|
||||
|
||||
def get_std_freq(signal, frame_size, hop_length):
|
||||
std = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
f = np.fft.fftfreq (L,.1/25600)[:int(L/2)]
|
||||
current_std = np.sqrt(np.sum((f-(np.sum(f * y)/np.sum(y)))**2 * y)/frame_size)
|
||||
std.append(current_std)
|
||||
return np.array(std)
|
||||
|
||||
def get_Cfactor_freq(signal, frame_size, hop_length):
|
||||
cfactor = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
f = np.fft.fftfreq (L,.1/25600)[:int(L/2)]
|
||||
current_cfactor = np.sqrt(np.sum(f**2 * y)/np.sum(y))
|
||||
cfactor.append(current_cfactor)
|
||||
return np.array(cfactor)
|
||||
|
||||
def get_Dfactor_freq(signal, frame_size, hop_length):
|
||||
dfactor = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
f = np.fft.fftfreq (L,.1/25600)[:int(L/2)]
|
||||
current_dfactor = np.sqrt(np.sum(f**4 * y)/np.sum(f**2 * y))
|
||||
dfactor.append(current_dfactor)
|
||||
return np.array(dfactor)
|
||||
|
||||
def get_Efactor_freq(signal, frame_size, hop_length):
|
||||
efactor = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
f = np.fft.fftfreq (L,.1/25600)[:int(L/2)]
|
||||
current_efactor = np.sqrt(np.sum(f**2 * y)/np.sqrt(np.sum(y) * np.sum(f**4 * y)))
|
||||
efactor.append(current_efactor)
|
||||
return np.array(efactor)
|
||||
|
||||
def get_Gfactor_freq(signal, frame_size, hop_length):
|
||||
gfactor = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
f = np.fft.fftfreq (L,.1/25600)[:int(L/2)]
|
||||
current_gfactor = (np.sqrt(np.sum((f-(np.sum(f * y)/np.sum(y)))**2 * y)/frame_size))/(np.sum(f * y)/np.sum(y))
|
||||
gfactor.append(current_gfactor)
|
||||
return np.array(gfactor)
|
||||
|
||||
def get_third1_freq(signal, frame_size, hop_length):
|
||||
third1 = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
f = np.fft.fftfreq (L,.1/25600)[:int(L/2)]
|
||||
current_third1 = np.sum((f - (np.sum(f * y)/np.sum(y)))**3 * y)/(frame_size * (np.sqrt(np.sum((f-(np.sum(f * y)/np.sum(y)))**2 * y)/frame_size))**3)
|
||||
third1.append(current_third1)
|
||||
return np.array(third1)
|
||||
|
||||
def get_forth1_freq(signal, frame_size, hop_length):
|
||||
forth1 = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
f = np.fft.fftfreq (L,.1/25600)[:int(L/2)]
|
||||
current_forth1 = np.sum((f - (np.sum(f * y)/np.sum(y)))**4 * y)/(frame_size * (np.sqrt(np.sum((f-(np.sum(f * y)/np.sum(y)))**2 * y)/frame_size))**4)
|
||||
forth1.append(current_forth1)
|
||||
return np.array(forth1)
|
||||
|
||||
def get_Hfactor_freq(signal, frame_size, hop_length):
|
||||
hfactor = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
f = np.fft.fftfreq (L,.1/25600)[:int(L/2)]
|
||||
current_hfactor = np.sum(np.sqrt(abs(f - (np.sum(f * y)/np.sum(y)))) * y)/(frame_size * np.sqrt(np.sqrt(np.sum((f-(np.sum(f * y)/np.sum(y)))**2 * y)/frame_size)))
|
||||
hfactor.append(current_hfactor)
|
||||
return np.array(hfactor)
|
||||
|
||||
def get_Jfactor_freq(signal, frame_size, hop_length):
|
||||
jfactor = []
|
||||
for i in range(0, len(signal), hop_length):
|
||||
L = len(signal[i:i+frame_size])
|
||||
y = abs(np.fft.fft(signal[i:i+frame_size]/L))[:int(L/2)]
|
||||
f = np.fft.fftfreq (L,.1/25600)[:int(L/2)]
|
||||
current_jfactor = np.sum(np.sqrt(abs(f - (np.sum(f * y)/np.sum(y)))) * y)/(frame_size * np.sqrt(np.sqrt(np.sum((f-(np.sum(f * y)/np.sum(y)))**2 * y)/frame_size)))
|
||||
jfactor.append(current_jfactor)
|
||||
return np.array(jfactor)
|
||||
|
||||
class FrequencyFeatureExtractor:
|
||||
def __init__(self, data):
|
||||
# Assuming data is a numpy array
|
||||
self.x = data
|
||||
# Perform FFT and compute magnitude of frequency components
|
||||
self.frequency_spectrum = np.abs(fft(self.x))
|
||||
self.n = len(self.frequency_spectrum)
|
||||
self.mean_freq = np.mean(self.frequency_spectrum)
|
||||
self.variance_freq = np.var(self.frequency_spectrum)
|
||||
self.std_freq = np.std(self.frequency_spectrum)
|
||||
|
||||
# Calculate the required frequency features
|
||||
self.features = self.calculate_features()
|
||||
|
||||
def calculate_features(self):
|
||||
S_mu = self.mean_freq
|
||||
S_MAX = np.max(self.frequency_spectrum)
|
||||
S_SBP = np.sum(self.frequency_spectrum)
|
||||
S_Peak = np.max(self.frequency_spectrum)
|
||||
S_V = np.sum((self.frequency_spectrum - S_mu) ** 2) / (self.n - 1)
|
||||
S_Sigma = np.sqrt(S_V)
|
||||
S_Skewness = np.sum((self.frequency_spectrum - S_mu) ** 3) / (self.n * S_Sigma ** 3)
|
||||
S_Kurtosis = np.sum((self.frequency_spectrum - S_mu) ** 4) / (self.n * S_Sigma ** 4)
|
||||
S_RSPPB = S_Peak / S_mu
|
||||
|
||||
return {
|
||||
'Mean of band Power Spectrum (S_mu)': S_mu,
|
||||
'Max of band power spectrum (S_MAX)': S_MAX,
|
||||
'Sum of total band power (S_SBP)': S_SBP,
|
||||
'Peak of band power (S_Peak)': S_Peak,
|
||||
'Variance of band power (S_V)': S_V,
|
||||
'Standard Deviation of band power (S_Sigma)': S_Sigma,
|
||||
'Skewness of band power (S_Skewness)': S_Skewness,
|
||||
'Kurtosis of band power (S_Kurtosis)': S_Kurtosis,
|
||||
'Relative Spectral Peak per Band Power (S_RSPPB)': S_RSPPB
|
||||
}
|
||||
|
||||
def __repr__(self):
|
||||
result = "Frequency Domain Feature Extraction Results:\n"
|
||||
for feature, value in self.features.items():
|
||||
result += f"{feature}: {value:.4f}\n"
|
||||
return result
|
||||
|
||||
def ExtractFrequencyFeatures(object):
|
||||
data = pd.read_csv(object, skiprows=1) # Skip the header row separator char info
|
||||
extractor = FrequencyFeatureExtractor(data.iloc[:, 1].values) # Assuming the data is in the second column
|
||||
features = extractor.features
|
||||
return features
|
||||
|
||||
# Usage Example
|
||||
# extractor = FrequencyFeatureExtractor('path_to_your_data.csv')
|
||||
# print(extractor)
|
||||
Reference in New Issue
Block a user