zhaohe 12 months ago
parent
commit
01b3571e73
  1. 3
      .vscode/settings.json
  2. 5
      README.md
  3. 186
      app/app.uvoptx
  4. 20
      app/app.uvprojx
  5. 17
      app/src/algo/baseline_filtering.c
  6. 1
      app/src/algo/baseline_filtering.h
  7. 5
      app/src/algo/fix_delay_fifo.h
  8. 224
      app/src/algo/iflytop_simple_filter.c
  9. 96
      app/src/algo/iflytop_simple_filter.h
  10. 57
      app/src/algo/iflytop_simple_filter_ext.c
  11. 31
      app/src/algo/iflytop_simple_filter_ext.h
  12. 109
      app/src/basic/filters.c
  13. 53
      app/src/basic/filters.h
  14. 2
      app/src/basic/version.h
  15. 2
      app/src/board/board.h
  16. 10
      app/src/heart_wave_sample_service.c
  17. 15558
      release/V30/three_lead_ecg.hex
  18. BIN
      release/V30/three_lead_ecg.zip

3
.vscode/settings.json

@ -172,7 +172,8 @@
"baseline_filtering.h": "c",
"heart_wave_sample_service_report_buf.h": "c",
"vcruntime.h": "c",
"smoothing_filter.h": "c"
"smoothing_filter.h": "c",
"fix_delay_fifo.h": "c"
},
"files.encoding": "gbk"
}

5
README.md

@ -1,9 +1,8 @@
# three_lead_ecg_v2
```
V101:
1. 修改每包上报数据长度,从4帧修改成25帧
2. 添加去基线算法,上位机收到数据后需减去8388607,即可得到基线为0的数据
V30:
1. 添加去基线算法,上位机收到数据后需减去8388607,即可得到基线为0的数据
V28:
1.优化电池电量

186
app/app.uvoptx

@ -648,6 +648,30 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\algo\iflytop_simple_filter.c</PathWithFileName>
<FilenameWithoutPath>iflytop_simple_filter.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\algo\iflytop_simple_filter_ext.c</PathWithFileName>
<FilenameWithoutPath>iflytop_simple_filter_ext.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@ -658,7 +682,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>23</FileNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -678,7 +702,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>24</FileNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -690,7 +714,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>25</FileNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -710,7 +734,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>26</FileNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -730,7 +754,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>27</FileNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -742,7 +766,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>28</FileNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -754,7 +778,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>29</FileNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -766,7 +790,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>30</FileNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -778,7 +802,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>31</FileNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -790,7 +814,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>32</FileNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -802,7 +826,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>33</FileNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -814,7 +838,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>34</FileNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -834,7 +858,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>35</FileNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -854,7 +878,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>36</FileNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -866,7 +890,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>37</FileNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -878,7 +902,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>38</FileNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -890,7 +914,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>39</FileNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -902,7 +926,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>40</FileNumber>
<FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -914,7 +938,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>41</FileNumber>
<FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -926,7 +950,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>42</FileNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -938,7 +962,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>43</FileNumber>
<FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -950,7 +974,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>44</FileNumber>
<FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -962,7 +986,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>45</FileNumber>
<FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -974,7 +998,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>46</FileNumber>
<FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -986,7 +1010,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>47</FileNumber>
<FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -998,7 +1022,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>48</FileNumber>
<FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1010,7 +1034,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>49</FileNumber>
<FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1022,7 +1046,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>50</FileNumber>
<FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1034,7 +1058,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>51</FileNumber>
<FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1046,7 +1070,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>52</FileNumber>
<FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1058,7 +1082,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>53</FileNumber>
<FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1070,7 +1094,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>54</FileNumber>
<FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1082,7 +1106,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>55</FileNumber>
<FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1102,7 +1126,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>56</FileNumber>
<FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1114,7 +1138,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>57</FileNumber>
<FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1126,7 +1150,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>58</FileNumber>
<FileNumber>60</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1138,7 +1162,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>59</FileNumber>
<FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1150,7 +1174,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>60</FileNumber>
<FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1162,7 +1186,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>61</FileNumber>
<FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1174,7 +1198,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>62</FileNumber>
<FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1186,7 +1210,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>63</FileNumber>
<FileNumber>65</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1198,7 +1222,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>64</FileNumber>
<FileNumber>66</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1210,7 +1234,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>65</FileNumber>
<FileNumber>67</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1222,7 +1246,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>66</FileNumber>
<FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1234,7 +1258,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>67</FileNumber>
<FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1246,7 +1270,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>68</FileNumber>
<FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1258,7 +1282,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>69</FileNumber>
<FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1270,7 +1294,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>70</FileNumber>
<FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1282,7 +1306,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>71</FileNumber>
<FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1294,7 +1318,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>72</FileNumber>
<FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1306,7 +1330,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>73</FileNumber>
<FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1318,7 +1342,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>74</FileNumber>
<FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1330,7 +1354,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>75</FileNumber>
<FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1342,7 +1366,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>76</FileNumber>
<FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1354,7 +1378,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>77</FileNumber>
<FileNumber>79</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1366,7 +1390,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>78</FileNumber>
<FileNumber>80</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1378,7 +1402,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>79</FileNumber>
<FileNumber>81</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1390,7 +1414,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>80</FileNumber>
<FileNumber>82</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1402,7 +1426,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>81</FileNumber>
<FileNumber>83</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1414,7 +1438,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>82</FileNumber>
<FileNumber>84</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1434,7 +1458,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>83</FileNumber>
<FileNumber>85</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1446,7 +1470,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>84</FileNumber>
<FileNumber>86</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1458,7 +1482,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>85</FileNumber>
<FileNumber>87</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1470,7 +1494,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>86</FileNumber>
<FileNumber>88</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1482,7 +1506,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>87</FileNumber>
<FileNumber>89</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1494,7 +1518,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>88</FileNumber>
<FileNumber>90</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1514,7 +1538,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>89</FileNumber>
<FileNumber>91</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1526,7 +1550,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>90</FileNumber>
<FileNumber>92</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1538,7 +1562,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>91</FileNumber>
<FileNumber>93</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1558,7 +1582,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>92</FileNumber>
<FileNumber>94</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1570,7 +1594,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>93</FileNumber>
<FileNumber>95</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1582,7 +1606,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>94</FileNumber>
<FileNumber>96</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1602,7 +1626,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>95</FileNumber>
<FileNumber>97</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1614,7 +1638,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>96</FileNumber>
<FileNumber>98</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1626,7 +1650,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>97</FileNumber>
<FileNumber>99</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1646,7 +1670,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>98</FileNumber>
<FileNumber>100</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1658,7 +1682,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>99</FileNumber>
<FileNumber>101</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1678,7 +1702,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>100</FileNumber>
<FileNumber>102</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1690,7 +1714,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>101</FileNumber>
<FileNumber>103</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1702,7 +1726,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>102</FileNumber>
<FileNumber>104</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1714,7 +1738,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>103</FileNumber>
<FileNumber>105</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>

20
app/app.uvprojx

@ -493,6 +493,16 @@
<FileType>1</FileType>
<FilePath>.\src\algo\smoothing_filter.c</FilePath>
</File>
<File>
<FileName>iflytop_simple_filter.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\algo\iflytop_simple_filter.c</FilePath>
</File>
<File>
<FileName>iflytop_simple_filter_ext.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\algo\iflytop_simple_filter_ext.c</FilePath>
</File>
</Files>
</Group>
<Group>
@ -4367,6 +4377,16 @@
<FileType>1</FileType>
<FilePath>.\src\algo\smoothing_filter.c</FilePath>
</File>
<File>
<FileName>iflytop_simple_filter.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\algo\iflytop_simple_filter.c</FilePath>
</File>
<File>
<FileName>iflytop_simple_filter_ext.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\algo\iflytop_simple_filter_ext.c</FilePath>
</File>
</Files>
</Group>
<Group>

17
app/src/algo/baseline_filtering.c

@ -5,6 +5,7 @@
#include "MedianFilter.h"
#include "fix_delay_fifo.h"
#include "iflytop_simple_filter_ext.h"
#include "smoothing_filter.h"
#define REPORT_MEDIAN_WINDOWS_SIZE 101 // ±ØÐëÊÇÆæÊý
@ -30,6 +31,10 @@ static SmoothingFilter_t smoothingFilter0;
static SmoothingFilter_t smoothingFilter1;
static SmoothingFilter_t smoothingFilter2;
static LPFilterExt_t lp0;
static LPFilterExt_t lp1;
static LPFilterExt_t lp2;
static int32_t m_frame_cnt;
static int32_t result0;
static int32_t result1;
@ -76,10 +81,22 @@ void baseline_filter_reset() {
SmoothingFilter_Init(&smoothingFilter1, 5, true);
SmoothingFilter_Init(&smoothingFilter2, 5, true);
// lp0
// lp1
// lp2
LPFilterExt_init(&lp0, 40, 0.0025, 4, true);
LPFilterExt_init(&lp1, 40, 0.0025, 4, true);
LPFilterExt_init(&lp2, 40, 0.0025, 4, true);
m_frame_cnt = 0;
}
void baseline_filter_push(int32_t val0, int32_t val1, int32_t val2) {
val0 = LPFilterExt_update(&lp0, val0);
val1 = LPFilterExt_update(&lp1, val1);
val2 = LPFilterExt_update(&lp2, val2);
int32_t medianValue0 = MEDIANFILTER_Insert(&medianFilter0, val0);
int32_t delay_data0 = fix_delay_fifo_update(&m_fifo0, val0);

1
app/src/algo/baseline_filtering.h

@ -1,5 +1,6 @@
#pragma once
#include <stdint.h>
#include "iflytop_simple_filter.h"
void baseline_filter_init();
void baseline_filter_reset();

5
app/src/algo/fix_delay_fifo.h

@ -1,5 +1,4 @@
#ifndef FILTERS_H
#define FILTERS_H
#pragma once
#include <stdbool.h>
#include <stdint.h>
typedef struct {
@ -13,5 +12,3 @@ typedef struct {
void fix_delay_fifo_init(fix_delay_fifo_t *buffer, int32_t *fifo, int fifosize);
int32_t fix_delay_fifo_update(fix_delay_fifo_t *buffer, int32_t vin);
#endif

224
app/src/algo/iflytop_simple_filter.c

@ -0,0 +1,224 @@
#include "iflytop_simple_filter.h"
#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PI 3.141592653
/********************************************************************************************************
* LOW PASS FILTER
********************************************************************************************************/
void LPFilter_Init(LPFilter_t *filter, float cutoffFreqHz, float sampleTimeS, bool enable) {
float RC = 0.0;
RC = 1.0 / (2 * PI * cutoffFreqHz);
filter->coef[0] = sampleTimeS / (sampleTimeS + RC);
filter->coef[1] = RC / (sampleTimeS + RC);
filter->v_out[0] = 0.0;
filter->v_out[1] = 0.0;
filter->enable = enable;
}
float LPFilter_Update(LPFilter_t *filter, float v_in) {
if (filter->enable == false) return v_in;
filter->v_out[1] = filter->v_out[0];
filter->v_out[0] = (filter->coef[0] * v_in) + (filter->coef[1] * filter->v_out[1]);
return (filter->v_out[0]);
}
/********************************************************************************************************
* HIGH PASS FILTER
********************************************************************************************************/
void HPFilter_Init(HPFilter_t *filter, float cutoffFreqHz, float sampleTimeS, bool enable) {
float RC = 0.0;
RC = 1.0 / (2 * PI * cutoffFreqHz);
filter->coef = RC / (sampleTimeS + RC);
filter->v_in[0] = 0.0;
filter->v_in[1] = 0.0;
filter->v_out[0] = 0.0;
filter->v_out[1] = 0.0;
filter->enable = enable;
}
float HPFilter_Update(HPFilter_t *filter, float v_in) {
if (filter->enable == false) return v_in;
filter->v_in[1] = filter->v_in[0];
filter->v_in[0] = v_in;
filter->v_out[1] = filter->v_out[0];
filter->v_out[0] = filter->coef * (filter->v_in[0] - filter->v_in[1] + filter->v_out[1]);
return (filter->v_out[0]);
}
/********************************************************************************************************
* BAND PASS FILTER
********************************************************************************************************/
void PBFilter_Init(PBFilter_t *filter, float HPF_cutoffFreqHz, float LPF_cutoffFreqHz, float sampleTimeS, bool enable) {
LPFilter_Init(&filter->lpf, LPF_cutoffFreqHz, sampleTimeS, enable);
HPFilter_Init(&filter->hpf, HPF_cutoffFreqHz, sampleTimeS, enable);
filter->out_in = 0.0;
filter->enable = enable;
}
float PBFilter_Update(PBFilter_t *filter, float v_in) {
if (filter->enable == false) return v_in;
filter->out_in = HPFilter_Update(&filter->hpf, v_in);
filter->out_in = LPFilter_Update(&filter->lpf, filter->out_in);
return (filter->out_in);
}
/********************************************************************************************************
* NOTCH FILTER
********************************************************************************************************/
void NOTCHFilter_Init(NOTCHFilter_t *filter, float centerFreqHz, float notchWidthHz, float sampleTimeS, bool enable) {
// filter frequency to angular (rad/s)
float w0_rps = 2.0 * PI * centerFreqHz;
float ww_rps = 2.0 * PI * notchWidthHz;
// pre warp center frequency
float w0_pw_rps = (2.0f / sampleTimeS) * tanf(0.5f * w0_rps * sampleTimeS);
// computing filter coefficients
filter->alpha = 4.0f + w0_rps * w0_pw_rps * sampleTimeS * sampleTimeS;
filter->beta = 2.0f * ww_rps * sampleTimeS;
// clearing input and output buffers
for (uint8_t n = 0; n < 3; n++) {
filter->vin[n] = 0;
filter->vout[n] = 0;
}
filter->enable = enable;
}
float NOTCHFilter_Update(NOTCHFilter_t *filter, float vin) {
if (filter->enable == false) return vin;
// shifting samples
filter->vin[2] = filter->vin[1];
filter->vin[1] = filter->vin[0];
filter->vout[2] = filter->vout[1];
filter->vout[1] = filter->vout[0];
filter->vin[0] = vin;
// compute new output
filter->vout[0] = (filter->alpha * filter->vin[0] + 2.0f * (filter->alpha - 8.0f) * filter->vin[1] + filter->alpha * filter->vin[2] -
(2.0f * (filter->alpha - 8.0f) * filter->vout[1] + (filter->alpha - filter->beta) * filter->vout[2])) /
(filter->alpha + filter->beta);
return (filter->vout[0]);
}
#if 0
typedef struct {
float val[MEDIAN_FILTER_MAX_SIZE];
int valStartPos;
int valEndPos;
int medianSize;
} median_filter_t;
#endif
void median_filter_init(median_filter_t *filter, int medianSize) {
filter->medianSize = medianSize;
filter->numVal = 0;
for (int i = 0; i < MEDIAN_FILTER_MAX_SIZE; i++) {
filter->val[i] = 0;
}
}
float median_filter_update(median_filter_t *filter, float val) {
if (filter->numVal >= filter->medianSize) {
memmove(filter->val, filter->val + 1, (filter->medianSize - 1) * sizeof(float));
filter->numVal--;
}
filter->val[filter->numVal] = val;
filter->numVal++;
for (int i = 0; i < filter->numVal; i++) {
filter->temp[i] = filter->val[i];
}
for (int i = 0; i < filter->numVal; i++) {
for (int j = i + 1; j < filter->numVal; j++) {
if (filter->temp[i] > filter->temp[j]) {
float temp = filter->temp[i];
filter->temp[i] = filter->temp[j];
filter->temp[j] = temp;
}
}
}
if (filter->numVal % 2 == 0) {
return (filter->temp[filter->numVal / 2 - 1] + filter->temp[filter->numVal / 2]) / 2;
} else {
return filter->temp[filter->numVal / 2];
}
}
void BaselineDriftRemoval_Init(BaselineDriftRemoval_t *filter, int windows_size, bool enable) {
if (windows_size > MEDIAN_FILTER_SIZE) {
windows_size = MEDIAN_FILTER_SIZE;
}
filter->windows_size = windows_size;
filter->datanum = 0;
filter->enable = enable;
for (int i = 0; i < windows_size; i++) {
filter->fifo[i] = 0;
}
}
float BaselineDriftRemoval_Update(BaselineDriftRemoval_t *filter, float vin) {
if (!filter->enable) return vin;
// memmove(filter->fifo, filter->fifo + 1, (filter->windows_size - 1) * sizeof(float));
filter->fifo[filter->windows_size - 1] = vin;
filter->datanum++;
if (filter->datanum > filter->windows_size) {
filter->datanum = filter->windows_size;
}
if (filter->datanum < filter->windows_size) {
return 0;
}
// ÇóÖÐÖµ
// memcpy(filter->processcache, filter->fifo, filter->windows_size * sizeof(float));
for (int i = 0; i < filter->windows_size; i++) {
for (int j = i + 1; j < filter->windows_size; j++) {
if (filter->processcache[i] > filter->processcache[j]) {
float temp = filter->processcache[i];
filter->processcache[i] = filter->processcache[j];
filter->processcache[j] = temp;
}
}
}
float mid = filter->processcache[filter->windows_size / 2];
float min_data_in_fifo = filter->fifo[filter->windows_size / 2];
return min_data_in_fifo - mid;
}

96
app/src/algo/iflytop_simple_filter.h

@ -0,0 +1,96 @@
#pragma once
#include <stdbool.h>
// #ifdef __cplusplus
// extern "C" {
// #endif
/********************************************************************************************************
* LOW PASS FILTER
********************************************************************************************************/
typedef struct {
float coef[2];
float v_out[2];
bool enable;
} LPFilter_t;
void LPFilter_Init(LPFilter_t *filter, float cutoffFreqHz, float sampleTimeS, bool enable);
float LPFilter_Update(LPFilter_t *filter, float v_in);
/********************************************************************************************************
* HIGH PASS FILTER
********************************************************************************************************/
typedef struct {
float coef;
float v_out[2];
float v_in[2];
bool enable;
} HPFilter_t;
void HPFilter_Init(HPFilter_t *filter, float cutoffFreqHz, float sampleTimeS, bool enable);
float HPFilter_Update(HPFilter_t *filter, float v_in);
/********************************************************************************************************
* BAND PASS FILTER
********************************************************************************************************/
typedef struct {
LPFilter_t lpf;
HPFilter_t hpf;
float out_in;
bool enable;
} PBFilter_t;
void PBFilter_Init(PBFilter_t *filter, float HPF_cutoffFreqHz, float LPF_cutoffFreqHz, float sampleTimeS, bool enable);
float PBFilter_Update(PBFilter_t *filter, float v_in);
/********************************************************************************************************
* NOTCH FILTER
********************************************************************************************************/
typedef struct {
float alpha;
float beta;
float vin[3];
float vout[3];
bool enable;
} NOTCHFilter_t;
void NOTCHFilter_Init(NOTCHFilter_t *filter, float centerFreqHz, float notchWidthHz, float sampleTimeS, bool enable);
float NOTCHFilter_Update(NOTCHFilter_t *filter, float vin);
// #ifdef __cplusplus
// }
// #endif
#define MEDIAN_FILTER_MAX_SIZE 200
typedef struct {
float val[MEDIAN_FILTER_MAX_SIZE];
float temp[MEDIAN_FILTER_MAX_SIZE];
int medianSize;
int numVal;
} median_filter_t;
void median_filter_init(median_filter_t *filter, int medianSize);
float median_filter_update(median_filter_t *filter, float val);
#define MEDIAN_FILTER_SIZE 300
typedef struct {
float fifo[MEDIAN_FILTER_SIZE];
float processcache[MEDIAN_FILTER_SIZE];
bool enable;
int windows_size;
int datanum;
} BaselineDriftRemoval_t;
void BaselineDriftRemoval_Init(BaselineDriftRemoval_t *filter, int windows_size, bool enable);
float BaselineDriftRemoval_Update(BaselineDriftRemoval_t *filter, float vin);

57
app/src/algo/iflytop_simple_filter_ext.c

@ -0,0 +1,57 @@
#include "iflytop_simple_filter_ext.h"
void LPFilterExt_init(LPFilterExt_t *filter, float cutoffFreqHz, float sampleTimeS, int order, bool enable) {
if (order > FILTER_MAX_ORDER) {
order = FILTER_MAX_ORDER;
}
filter->order = order;
for (int i = 0; i < order; i++) {
LPFilter_Init(&filter->lp_filter[i], cutoffFreqHz, sampleTimeS, enable);
}
}
float LPFilterExt_update(LPFilterExt_t *filter, float v_in) {
float v_out = v_in;
for (int i = 0; i < filter->order; i++) {
v_out = LPFilter_Update(&filter->lp_filter[i], v_out);
}
return v_out;
}
void HPFilterExt_init(HPFilterExt_t *filter, float cutoffFreqHz, float sampleTimeS, int order, bool enable) {
if (order > FILTER_MAX_ORDER) {
order = FILTER_MAX_ORDER;
}
filter->order = order;
for (int i = 0; i < order; i++) {
HPFilter_Init(&filter->hp_filter[i], cutoffFreqHz, sampleTimeS, enable);
}
}
float HPFilterExt_update(HPFilterExt_t *filter, float v_in) {
float v_out = v_in;
for (int i = 0; i < filter->order; i++) {
v_out = HPFilter_Update(&filter->hp_filter[i], v_out);
}
return v_out;
}
void NOTCHFilterExt_init(NOTCHFilterExt_t *filter, float centerFreqHz, float notchWidthHz, float sampleTimeS, int order, bool enable) {
if (order > FILTER_MAX_ORDER) {
order = FILTER_MAX_ORDER;
}
filter->order = order;
for (int i = 0; i < order; i++) {
NOTCHFilter_Init(&filter->notch_filter[i], centerFreqHz, notchWidthHz, sampleTimeS, enable);
}
}
float NOTCHFilterExt_update(NOTCHFilterExt_t *filter, float v_in) {
float v_out = v_in;
for (int i = 0; i < filter->order; i++) {
v_out = NOTCHFilter_Update(&filter->notch_filter[i], v_out);
}
return v_out;
}

31
app/src/algo/iflytop_simple_filter_ext.h

@ -0,0 +1,31 @@
#pragma once
#include "iflytop_simple_filter.h"
#define FILTER_MAX_ORDER 20
typedef struct {
LPFilter_t lp_filter[FILTER_MAX_ORDER];
int order;
} LPFilterExt_t;
void LPFilterExt_init(LPFilterExt_t *filter, float cutoffFreqHz, float sampleTimeS, int order, bool enable);
float LPFilterExt_update(LPFilterExt_t *filter, float v_in);
typedef struct {
HPFilter_t hp_filter[FILTER_MAX_ORDER];
int order;
} HPFilterExt_t;
void HPFilterExt_init(HPFilterExt_t *filter, float cutoffFreqHz, float sampleTimeS, int order, bool enable);
float HPFilterExt_update(HPFilterExt_t *filter, float v_in);
typedef struct {
NOTCHFilter_t notch_filter[FILTER_MAX_ORDER];
int order;
} NOTCHFilterExt_t;
void NOTCHFilterExt_init(NOTCHFilterExt_t *filter, float centerFreqHz, float notchWidthHz, float sampleTimeS, int order, bool enable);
float NOTCHFilterExt_update(NOTCHFilterExt_t *filter, float v_in);

109
app/src/basic/filters.c

@ -3,112 +3,3 @@
#include <stdint.h>
#include <string.h>
#include <math.h>
#define PI 3.14159265358979323846
/********************************************************************************************************
* LOW PASS FILTER
********************************************************************************************************/
void LPFilter_Init(LPFilter *filter, float cutoffFreqHz, float sampleTimeS) {
float RC = 0.0;
RC = 1.0 / (2 * PI * cutoffFreqHz);
filter->coef[0] = sampleTimeS / (sampleTimeS + RC);
filter->coef[1] = RC / (sampleTimeS + RC);
filter->v_out[0] = 0.0;
filter->v_out[1] = 0.0;
}
float LPFilter_Update(LPFilter *filter, float v_in) {
filter->v_out[1] = filter->v_out[0];
filter->v_out[0] = (filter->coef[0] * v_in) + (filter->coef[1] * filter->v_out[1]);
return (filter->v_out[0]);
}
/********************************************************************************************************
* HIGH PASS FILTER
********************************************************************************************************/
void HPFilter_Init(HPFilter *filter, float cutoffFreqHz, float sampleTimeS) {
float RC = 0.0;
RC = 1.0 / (2 * PI * cutoffFreqHz);
filter->coef = RC / (sampleTimeS + RC);
filter->v_in[0] = 0.0;
filter->v_in[1] = 0.0;
filter->v_out[0] = 0.0;
filter->v_out[1] = 0.0;
}
float HPFilter_Update(HPFilter *filter, float v_in) {
filter->v_in[1] = filter->v_in[0];
filter->v_in[0] = v_in;
filter->v_out[1] = filter->v_out[0];
filter->v_out[0] = filter->coef * (filter->v_in[0] - filter->v_in[1] + filter->v_out[1]);
return (filter->v_out[0]);
}
/********************************************************************************************************
* BAND PASS FILTER
********************************************************************************************************/
void PBFilter_Init(PBFilter *filter, float HPF_cutoffFreqHz, float LPF_cutoffFreqHz, float sampleTimeS) {
LPFilter_Init(&filter->lpf, LPF_cutoffFreqHz, sampleTimeS);
HPFilter_Init(&filter->hpf, HPF_cutoffFreqHz, sampleTimeS);
filter->out_in = 0.0;
}
float PBFilter_Update(PBFilter *filter, float v_in) {
filter->out_in = HPFilter_Update(&filter->hpf, v_in);
filter->out_in = LPFilter_Update(&filter->lpf, filter->out_in);
return (filter->out_in);
}
/********************************************************************************************************
* NOTCH FILTER
********************************************************************************************************/
void NOTCHFilter_Init(NOTCHFilter *filter, float centerFreqHz, float notchWidthHz, float sampleTimeS) {
// filter frequency to angular (rad/s)
float w0_rps = 2.0 * PI * centerFreqHz;
float ww_rps = 2.0 * PI * notchWidthHz;
// pre warp center frequency
float w0_pw_rps = (2.0f / sampleTimeS) * (float)tanf(0.5f * w0_rps * sampleTimeS);
// computing filter coefficients
filter->alpha = 4.0f + w0_rps * w0_pw_rps * sampleTimeS * sampleTimeS;
filter->beta = 2.0f * ww_rps * sampleTimeS;
// clearing input and output buffers
for (uint8_t n = 0; n < 3; n++) {
filter->vin[n] = 0;
filter->vout[n] = 0;
}
}
float NOTCHFilter_Update(NOTCHFilter *filter, float vin) {
// shifting samples
filter->vin[2] = filter->vin[1];
filter->vin[1] = filter->vin[0];
filter->vout[2] = filter->vout[1];
filter->vout[1] = filter->vout[0];
filter->vin[0] = vin;
// compute new output
filter->vout[0] = (filter->alpha * filter->vin[0] + 2.0f * (filter->alpha - 8.0f) * filter->vin[1] + filter->alpha * filter->vin[2] - (2.0f * (filter->alpha - 8.0f) * filter->vout[1] + (filter->alpha - filter->beta) * filter->vout[2])) / (filter->alpha + filter->beta);
return (filter->vout[0]);
}

53
app/src/basic/filters.h

@ -1,56 +1,3 @@
#pragma once
#include <stdint.h>
/********************************************************************************************************
* LOW PASS FILTER
********************************************************************************************************/
typedef struct {
float coef[2];
float v_out[2];
} LPFilter;
void LPFilter_Init(LPFilter *filter, float cutoffFreqHz, float sampleTimeS);
float LPFilter_Update(LPFilter *filter, float v_in);
/********************************************************************************************************
* HIGH PASS FILTER
********************************************************************************************************/
typedef struct {
float coef;
float v_out[2];
float v_in[2];
} HPFilter;
void HPFilter_Init(HPFilter *filter, float cutoffFreqHz, float sampleTimeS);
float HPFilter_Update(HPFilter *filter, float v_in);
/********************************************************************************************************
* BAND PASS FILTER
********************************************************************************************************/
typedef struct {
LPFilter lpf;
HPFilter hpf;
float out_in;
} PBFilter;
void PBFilter_Init(PBFilter *filter, float HPF_cutoffFreqHz, float LPF_cutoffFreqHz, float sampleTimeS);
float PBFilter_Update(PBFilter *filter, float v_in);
/********************************************************************************************************
* NOTCH FILTER
********************************************************************************************************/
typedef struct {
float alpha;
float beta;
float vin[3];
float vout[3];
} NOTCHFilter;
void NOTCHFilter_Init(NOTCHFilter *filter, float centerFreqHz, float notchWidthHz, float sampleTimeS);
float NOTCHFilter_Update(NOTCHFilter *filter, float vin);

2
app/src/basic/version.h

@ -2,7 +2,7 @@
#define CATEGORY "M1002" // Èýµ¼Áª
#define MANUFACTURER_NAME "iflytop"
#define FIRMWARE_VERSION (102)
#define FIRMWARE_VERSION (30)
#define BLESTACK_VERSION 1
#define BOOTLOADER_VERSION 1
#define HARDWARE_VERSION (1)

2
app/src/board/board.h

@ -63,7 +63,7 @@
#define APP_MAX_STORAGE_TIME_S (uint32_t)(72 * 60 * 60)
//
#define SAMPLE_RATE 400
#define LITTLE_DATA_BLOCK_FRAME_NUM 25 // 每两帧回调一次,对应100HZ
#define LITTLE_DATA_BLOCK_FRAME_NUM 4 // 每两帧回调一次,对应100HZ
#define SAMPLE_PRECISION 24
#define APP_MAX_EVEN_SIZE (MAX(APP_TIMER_SCHED_EVENT_DATA_SIZE, sizeof(app_event_t)))

10
app/src/heart_wave_sample_service.c

@ -97,8 +97,7 @@ volatile static bool m_drop_state_triggered = false;
static uint32_t m_capture_start_s;
static uint8_t m_cfg_type = 0;
LPFilter lowpassfilter[3];
MedianFilter_t medianFilter[3];
/*******************************************************************************
* CONFIG *
*******************************************************************************/
@ -531,13 +530,6 @@ void hwss_start_capture(void) {
m_frame_filter_index = 0;
m_capture_start_s = znordic_getpower_on_s();
LPFilter_Init(&lowpassfilter[0], 40, 0.0025);
LPFilter_Init(&lowpassfilter[1], 40, 0.0025);
LPFilter_Init(&lowpassfilter[2], 40, 0.0025);
MedianFilter_Init(&medianFilter[0]);
MedianFilter_Init(&medianFilter[1]);
MedianFilter_Init(&medianFilter[2]);
HWSSReportBuf_reset();
// ads1293_start_conversion(&m_ads1293_0);

15558
release/V30/three_lead_ecg.hex
File diff suppressed because it is too large
View File

BIN
release/V30/three_lead_ecg.zip

Loading…
Cancel
Save