tomwalters@0
|
1 /*
|
tomwalters@0
|
2 Copyright (c) Applied Psychology Unit, Medical Research Council. 1993
|
tomwalters@0
|
3 ===========================================================================
|
tomwalters@0
|
4
|
tomwalters@0
|
5 Permission to use, copy, modify, and distribute this software without fee
|
tomwalters@0
|
6 is hereby granted for research purposes, provided that this copyright
|
tomwalters@0
|
7 notice appears in all copies and in all supporting documentation, and that
|
tomwalters@0
|
8 the software is not redistributed for any fee (except for a nominal
|
tomwalters@0
|
9 shipping charge). Anyone wanting to incorporate all or part of this
|
tomwalters@0
|
10 software in a commercial product must obtain a license from the Medical
|
tomwalters@0
|
11 Research Council.
|
tomwalters@0
|
12
|
tomwalters@0
|
13 The MRC makes no representations about the suitability of this
|
tomwalters@0
|
14 software for any purpose. It is provided "as is" without express or
|
tomwalters@0
|
15 implied warranty.
|
tomwalters@0
|
16
|
tomwalters@0
|
17 THE MRC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
|
tomwalters@0
|
18 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
tomwalters@0
|
19 THE A.P.U. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES
|
tomwalters@0
|
20 OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
tomwalters@0
|
21 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
tomwalters@0
|
22 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
tomwalters@0
|
23 SOFTWARE.
|
tomwalters@0
|
24 */
|
tomwalters@0
|
25
|
tomwalters@0
|
26 /*-------------------------------------------------------------------------*/
|
tomwalters@0
|
27
|
tomwalters@0
|
28 /* removepeaks.c
|
tomwalters@0
|
29 * ---------------
|
tomwalters@0
|
30 *
|
tomwalters@0
|
31 * M.Akeroyd. Summer 1993. Revised Winter 1994.
|
tomwalters@0
|
32 */
|
tomwalters@0
|
33
|
tomwalters@0
|
34
|
tomwalters@0
|
35 #include <stdio.h>
|
tomwalters@0
|
36 #include <string.h>
|
tomwalters@0
|
37 #include <stdlib.h>
|
tomwalters@0
|
38
|
tomwalters@0
|
39 #include "tip.h"
|
tomwalters@0
|
40
|
tomwalters@0
|
41
|
tomwalters@0
|
42
|
tomwalters@0
|
43
|
tomwalters@0
|
44 extern struct Peak peak[MAX_PEAKS]; /* all channels */
|
tomwalters@0
|
45 extern struct NextEvent nextevent[MAX_PEAKS];
|
tomwalters@0
|
46
|
tomwalters@0
|
47 extern double removevalue;
|
tomwalters@0
|
48 extern inputdata[MAX_DATA];
|
tomwalters@0
|
49
|
tomwalters@0
|
50
|
tomwalters@0
|
51
|
tomwalters@0
|
52
|
tomwalters@0
|
53 /*-------------------------------------------------------------------------*/
|
tomwalters@0
|
54
|
tomwalters@0
|
55
|
tomwalters@0
|
56
|
tomwalters@0
|
57 int removepeaks(int total_peaks)
|
tomwalters@0
|
58 {
|
tomwalters@0
|
59 /* What this code does:
|
tomwalters@0
|
60 *
|
tomwalters@0
|
61 * Its purpose is to remove, completely, any peak that is very small,
|
tomwalters@0
|
62 * and perhaps shouldn't be regarded as being there. This is because they
|
tomwalters@0
|
63 * tend to clutter up tents and glaciers.
|
tomwalters@0
|
64 *
|
tomwalters@0
|
65 * So, go through each peak. If F(n) < (F[n-1]*removevalue) AND
|
tomwalters@0
|
66 * F(n) < (F[n+1]*removevalue), then remove it. Exactly what samples are
|
tomwalters@0
|
67 * removed depends on the next events.
|
tomwalters@0
|
68 *
|
tomwalters@0
|
69 * At the end, call findpeaksreverse again, to reset the nextevent counters.
|
tomwalters@0
|
70 * RETURN the new value of total_peaks.
|
tomwalters@0
|
71 *
|
tomwalters@0
|
72 */
|
tomwalters@0
|
73
|
tomwalters@0
|
74 int n;
|
tomwalters@0
|
75 int sample;
|
tomwalters@0
|
76
|
tomwalters@0
|
77 /*--------------------------------------*/
|
tomwalters@0
|
78
|
tomwalters@0
|
79 for (n=2; n<total_peaks; n++)
|
tomwalters@0
|
80
|
tomwalters@0
|
81 if ((peak[n].mag < (int) (peak[n-1].mag * removevalue)) &&
|
tomwalters@0
|
82 (peak[n].mag < (int) (peak[n+1].mag * removevalue))) {
|
tomwalters@0
|
83 /* remove peak */
|
tomwalters@0
|
84 for (sample = peak[n].sample; sample <= nextevent[n-1].sample; sample++)
|
tomwalters@0
|
85 inputdata[sample] = 0;
|
tomwalters@0
|
86 for (sample = peak[n].sample; sample >= nextevent[n].sample; sample--)
|
tomwalters@0
|
87 inputdata[sample] = 0;
|
tomwalters@0
|
88 }
|
tomwalters@0
|
89
|
tomwalters@0
|
90 /*--------------------------------------*/
|
tomwalters@0
|
91
|
tomwalters@0
|
92 /* repeat for first and last peaks */
|
tomwalters@0
|
93
|
tomwalters@0
|
94 if (peak[1].mag < (int) (peak[2].mag * removevalue)) {
|
tomwalters@0
|
95 for (sample = peak[1].sample; sample >= nextevent[1].sample; sample--)
|
tomwalters@0
|
96 inputdata[sample] = 0;
|
tomwalters@0
|
97 }
|
tomwalters@0
|
98
|
tomwalters@0
|
99 n=total_peaks;
|
tomwalters@0
|
100
|
tomwalters@0
|
101 if (peak[n].mag < (int) (peak[n-1].mag * removevalue)) {
|
tomwalters@0
|
102 for (sample = peak[n].sample; sample <= nextevent[n-1].sample; sample++)
|
tomwalters@0
|
103 inputdata[sample] = 0;
|
tomwalters@0
|
104 }
|
tomwalters@0
|
105
|
tomwalters@0
|
106 /*--------------------------------------*/
|
tomwalters@0
|
107
|
tomwalters@0
|
108 findpeaksreverse();
|
tomwalters@0
|
109 return total_peaks;
|
tomwalters@0
|
110
|
tomwalters@0
|
111 }
|
tomwalters@0
|
112
|
tomwalters@0
|
113
|
tomwalters@0
|
114
|
tomwalters@0
|
115
|
tomwalters@0
|
116 /* The End */
|
tomwalters@0
|
117 /*-------------------------------------------------------------------------*/
|