Pular para o conteúdo

Interface (ppg.h)

Arquivo: Core/Inc/pds/comum/ppg.h. É o que permite as três frentes andarem em paralelo: cada módulo só depende deste arquivo, nunca do código de outro módulo. Mudar o ppg.h precisa do ok dos três.

Todas as saídas da cadeia são a fs=100f_s = 100 Hz (PPG_FS_HZ). Cada amostra leva um índice nn; o tempo em segundos é t=n/fst = n / f_s.

SaídaQuem geraConteúdoQuem usa
brutodecimacaoIR e vermelho com DCspo2, qualidade, respiracao, filtro
filtradofiltroIR e vermelho, passa-faixa 0,5 a 4 Hzpicos, espectral

Os dois usam o mesmo tipo, ppg_amostra_t (n, ir, vermelho).

PPG_ATRASO_AMOSTRAS diz quantas amostras o filtro atrasa o sinal. O módulo picos subtrai esse valor do instante do pico. Quando o filtro mudar (IIR × FIR), o dono do filtro atualiza a constante.

ppg_resultados_t junta tudo o que o laço principal e o display leem. Cada resultado tem valido, que fica false até o módulo ter confiança.

CampoMódulo
ultimo_batimento (instante e RR em ms)picos
bpm_picospicos
bpm_espectralespectral
hrv (SDNN, RMSSD, LF/HF)hrv
spo2spo2
respiracaorespiracao
qualidade (dedo presente, índice 0 a 1)qualidade

Sem malloc, sem variável global. O estado fica numa struct de quem chama:

typedef struct { /* estado */ } filtro_t;
void filtro_init(filtro_t *f);
void filtro_processa(filtro_t *f, const ppg_amostra_t *entrada,
ppg_amostra_t *saida);