Job_SignsPads/STM32/Code/STM32F405/Application/cwt/demo.c

89 lines
2.7 KiB
C
Raw Normal View History

2025-04-22 02:29:37 +00:00
/*
* @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;
}