После преобразования сигнала я сгладил спектр с помощью фильтра Савицкого-Голея. и определил пороговую частоту как 5% от максимальной частоты спектра. Впоследствии я определил значимые частоты значительный_freqs на основе этой пороговой частоты. Частота среза определялась как максимальное значение в списке значимых частот.
Код: Выделить всё
from scipy.fftpack import fft, fftfreq
from scipy.signal import savgol_filter
import numpy as np
#example data
np.random.seed(42)
duration = 10
fs = 500 # sampling rate
n_samples = duration * fs #number of samples
time = np.linspace(0, duration, n_samples)
signal = (
2 * np.sin(2 * np.pi * 5 * time) +
0.5 * np.sin(2 * np.pi * 20 * time) +
np.random.normal(0, 0.2, n_samples)
)
#method
freqs = fftfreq(len(signal), d=1/fs)[:len(signal) // 2]
spectrum = np.abs(fft(signal))[:len(signal) // 2]
smoothed_spectrum = savgol_filter(spectrum, window_length=11, polyorder=2)
threshold = 0.05 * max(smoothed_spectrum)
significant_freqs = freqs[smoothed_spectrum >= threshold]
optimal_cutoff = max(significant_freqs)
threshold_dB = 20 * np.log10(threshold / max(smoothed_spectrum))
print(f"\nOptimal cutoff frequency: {optimal_cutoff:.10f} Hz")
print(f"Threshold amplitude: {threshold_dB:.2f} dB")
Подробнее здесь: https://stackoverflow.com/questions/792 ... -filtering
Мобильная версия