Job_SignsPads/STM32/Code/STM32F405/Application/cwt/demo.c
2025-04-22 10:29:37 +08:00

89 lines
2.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @Description:
* @Version: 1.0
* @Author: lzc
* @Date: 2023-07-24 09:32:01
* @LastEditors: lzc
* @LastEditTime: 2023-07-24 09:54:10
*/
#include <math.h>
#include <stdio.h>
#include "cwt.h"
#define N 24000 /* Signal length */
#define step 0.009775171065493637f
int demo(int argc, char *argv[])
{
FILE *fh;
float temp;
int n = 400; // 每次计算数据长度为4008s
double s[N - 1000]; // 滤波后的测试数据
double xf_hr[n]; // 心率滤波数据
double xf_rr[n]; // 呼吸率滤波数据
float max_sum; // 求最大幅值
float sum_amp_hr[45]; // 心率幅值求和
float amp_hr[45][n]; // 小波心率幅值输出
float sum_amp_rr[12]; // 呼吸率幅值求和
float amp_rr[12][n]; // 小波呼吸率幅值输出
fh = fopen("1-24000(孔).txt", "r");
if (!fh)
{
printf("can't open file %s\n", argv[1]);
return 1;
}
for (int i = 0; i < N; i++)
{
fscanf(fh, "%f", &temp);
if (i >= 1000 && i < N)
{
s[i - 1000] = temp;
}
}
fclose(fh);
for (int k = 0; k < (floor((N - 1000) / 200) - 1); k++) // 每400个数据8s做一次小波变换
{
for (int j = 0; j < n; j++)
{
xf_hr[j] = s[(k * 200 + j)];
}
/*======================================================================HR*/
cwt_hr(xf_hr, n, amp_hr); // 心率小波
int i_max_hr = 0; // 幅值最大值所在行(对应心率频率)
max_sum = sum_amp_hr[0];
for (int i = 0; i < 45; i++) // 对每行幅值数据求和
{
sum_amp_hr[i] = 0;
for (int j = 0; j < n; j++)
{
sum_amp_hr[i] += amp_hr[i][j];
}
if (max_sum < sum_amp_hr[i])
{
max_sum = sum_amp_hr[i];
i_max_hr = i;
}
}
printf("i_max: %d %.6f %.6f\r\n", 4 * (k + 1), (2.294921 - (i_max_hr + 13) * 0.024414), max_sum);
/*======================================================================RR*/
cwt_rr(xf_hr, n, amp_rr); // 呼吸率小波
int i_max_rr = 0; // 幅值最大值所在行(对应呼吸率频率)
max_sum = sum_amp_rr[0];
for (int i = 0; i < 12; i++) // 对每行幅值数据求和
{
sum_amp_rr[i] = 0;
for (int j = 0; j < n; j++)
{
sum_amp_rr[i] += amp_rr[i][j];
}
if (max_sum < sum_amp_rr[i])
{
max_sum = sum_amp_rr[i];
i_max_rr = i;
}
}
}
return 0;
}