1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| import scipy.signal as signal
class VitalSignsExtractor: """ 生命体征提取器 """ def __init__(self, fs=20, duration=10): self.fs = fs self.duration = duration def extract_breathing(self, range_profile): """ 提取呼吸信号 """ nyq = self.fs / 2 low = 0.1 / nyq high = 0.5 / nyq b, a = signal.butter(4, [low, high], btype='band') breathing_signal = signal.filtfilt(b, a, range_profile) fft_result = np.fft.fft(breathing_signal) freqs = np.fft.fftfreq(len(breathing_signal), 1/self.fs) idx = np.argmax(np.abs(fft_result[freqs > 0])) breathing_rate = freqs[freqs > 0][idx] * 60 return breathing_signal, breathing_rate def extract_heartbeat(self, range_profile): """ 提取心跳信号 """ nyq = self.fs / 2 low = 0.8 / nyq high = 2.0 / nyq b, a = signal.butter(4, [low, high], btype='band') heartbeat_signal = signal.filtfilt(b, a, range_profile) fft_result = np.fft.fft(heartbeat_signal) freqs = np.fft.fftfreq(len(heartbeat_signal), 1/self.fs) idx = np.argmax(np.abs(fft_result[freqs > 0])) heart_rate = freqs[freqs > 0][idx] * 60 return heartbeat_signal, heart_rate
extractor = VitalSignsExtractor(fs=20) range_profile = load_radar_data() breathing_signal, breathing_rate = extractor.extract_breathing(range_profile) heartbeat_signal, heart_rate = extractor.extract_heartbeat(range_profile)
print(f"呼吸率: {breathing_rate:.1f} 次/分") print(f"心率: {heart_rate:.1f} 次/分")
|