Source code for denspp.offline.metric.electrical

import numpy as np
from scipy.signal import find_peaks, correlate
from denspp.offline.data_process.transformation import do_fft


[docs] def calculate_total_harmonics_distortion(freq: np.ndarray, spectral: np.ndarray, N_harmonics: int=4) -> float: """Calculating the Total Harmonics Distortion (THD) of spectral input Args: freq: Array with frequency values for spectral analysis spectral: Array with Spectral input N_harmonics: Number of used harmonics for calculating THD Return: THD value (in dB) and corresponding frequency positions of peaks """ fsine = float(np.argmax(spectral).flatten()[0]) # --- Limiting the search space pos_x0 = np.argwhere(freq >= 0.5 * fsine).flatten()[0] pos_x1 = np.argwhere(freq >= (N_harmonics + 1.5) * fsine).flatten()[0] search_y = spectral[pos_x0:pos_x1] # --- Getting peaks values df = np.mean(np.diff(freq)) xpos, _ = find_peaks(search_y, distance=int(0.8 * fsine / df)) peaks_y = search_y[xpos] # --- Return THD return 20 * np.log10(np.sqrt(np.sum(np.power(peaks_y[1:], 2))) / peaks_y[0])
[docs] def calculate_total_harmonics_distortion_from_transient(signal: np.ndarray, fs: float, N_harmonics: int=4) -> float: """Calculating the Total Harmonics Distortion (THD) from transient input Args: signal: Array with frequency values for spectral analysis fs: Sampling rate [Hz] N_harmonics: Number of used harmonics for calculating THD Return: THD value (in dB) """ freq, spectral = do_fft( y=signal, fs=fs ) return calculate_total_harmonics_distortion( freq=freq, spectral=spectral, N_harmonics=N_harmonics )
[docs] def calculate_cosine_similarity(y_pred: np.ndarray, y_true: np.ndarray) -> float: """Calculating the Cosine Similarity of two different inputs (same size) Args: y_pred: Numpy array or float value from prediction y_true: Numpy array or float value from true label Returns: Float value with error """ out = correlate(y_pred / np.linalg.norm(y_pred), y_true / np.linalg.norm(y_true),'full', 'auto') return float(out[y_true.size-1])