подсчет типа dbfs

fft
Sergey Revyakin 2 weeks ago
parent 93072ea0fc
commit b53f6022b2

@ -1,4 +1,5 @@
import os import os
import math
import numpy as np import numpy as np
from typing import Union from typing import Union
from common.runtime import load_root_env from common.runtime import load_root_env
@ -46,17 +47,38 @@ class Signal:
:return: Число типа float - "характеристика сигнала". :return: Число типа float - "характеристика сигнала".
""" """
signal = np.array([self.signal.real[0:length], self.signal.imag[0:length]], dtype=np.float32) samples = np.asarray(self.signal).ravel()[0:length]
signal_abs = np.linalg.norm(signal, axis=0) # Поэлементный модуль комплексного числа. shape.result if samples.size == 0:
# (1, self.length) return 0.0
# Основной режим: считаем dBFS из IQ-вектора.
if np.iscomplexobj(samples):
i = samples.real.astype(np.float32, copy=False)
q = samples.imag.astype(np.float32, copy=False)
signal = np.array([i, q], dtype=np.float32)
signal_abs = np.sqrt(i * i + q * q).astype(np.float32, copy=False)
if self.conv_method == 'max': if self.conv_method == 'max':
result = np.max(signal_abs) power = float(np.max(signal_abs * signal_abs))
else: else:
result = np.median(signal_abs) power = float(np.mean(signal_abs * signal_abs))
result = 10.0 * math.log10(max(power, 1e-20))
self.signal = signal self.signal = signal
self.signal_abs = signal_abs self.signal_abs = signal_abs
return result return result
# Fallback: если на вход уже подали скалярную метрику, агрегируем как есть.
scalar_samples = samples.astype(np.float32, copy=False)
if self.conv_method == 'max':
result = float(np.max(scalar_samples))
else:
result = float(np.median(scalar_samples))
self.signal = scalar_samples
self.signal_abs = np.abs(scalar_samples)
return result
def fill_signal(self, lvl, length) -> Union[int, float]: def fill_signal(self, lvl, length) -> Union[int, float]:
""" """
Сбор сигнала в соответствующий массив. Если уже собран, то предобработка. Сбор сигнала в соответствующий массив. Если уже собран, то предобработка.
@ -70,7 +92,6 @@ class Signal:
return 0 return 0
else: else:
preproc_signal = self.signal_preprocessing(length) preproc_signal = self.signal_preprocessing(length)
#self.clear()
return preproc_signal return preproc_signal
@ -81,6 +102,7 @@ class SignalsArray:
sig_array: Список для сохранения медиан. sig_array: Список для сохранения медиан.
counter: Индикатор наполненности массива. counter: Индикатор наполненности массива.
""" """
def __init__(self): def __init__(self):
self.sig_array = [] self.sig_array = []
self.counter = 0 self.counter = 0

Loading…
Cancel
Save