comparison src/ZeroCrossing.cpp @ 226:14029eb08472 distinct-libraries

* start moving things about
author cannam
date Thu, 06 Nov 2008 14:05:33 +0000
parents examples/ZeroCrossing.cpp@1982246a3902
children
comparison
equal deleted inserted replaced
225:f8b38a017d9a 226:14029eb08472
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
2
3 /*
4 Vamp
5
6 An API for audio analysis and feature extraction plugins.
7
8 Centre for Digital Music, Queen Mary, University of London.
9 Copyright 2006 Chris Cannam.
10
11 Permission is hereby granted, free of charge, to any person
12 obtaining a copy of this software and associated documentation
13 files (the "Software"), to deal in the Software without
14 restriction, including without limitation the rights to use, copy,
15 modify, merge, publish, distribute, sublicense, and/or sell copies
16 of the Software, and to permit persons to whom the Software is
17 furnished to do so, subject to the following conditions:
18
19 The above copyright notice and this permission notice shall be
20 included in all copies or substantial portions of the Software.
21
22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
27 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29
30 Except as contained in this notice, the names of the Centre for
31 Digital Music; Queen Mary, University of London; and Chris Cannam
32 shall not be used in advertising or otherwise to promote the sale,
33 use or other dealings in this Software without prior written
34 authorization.
35 */
36
37 #include "ZeroCrossing.h"
38
39 using std::string;
40 using std::vector;
41 using std::cerr;
42 using std::endl;
43
44 #include <cmath>
45
46 ZeroCrossing::ZeroCrossing(float inputSampleRate) :
47 Plugin(inputSampleRate),
48 m_stepSize(0),
49 m_previousSample(0.0f)
50 {
51 }
52
53 ZeroCrossing::~ZeroCrossing()
54 {
55 }
56
57 string
58 ZeroCrossing::getIdentifier() const
59 {
60 return "zerocrossing";
61 }
62
63 string
64 ZeroCrossing::getName() const
65 {
66 return "Zero Crossings";
67 }
68
69 string
70 ZeroCrossing::getDescription() const
71 {
72 return "Detect and count zero crossing points";
73 }
74
75 string
76 ZeroCrossing::getMaker() const
77 {
78 return "Vamp SDK Example Plugins";
79 }
80
81 int
82 ZeroCrossing::getPluginVersion() const
83 {
84 return 2;
85 }
86
87 string
88 ZeroCrossing::getCopyright() const
89 {
90 return "Freely redistributable (BSD license)";
91 }
92
93 bool
94 ZeroCrossing::initialise(size_t channels, size_t stepSize, size_t blockSize)
95 {
96 if (channels < getMinChannelCount() ||
97 channels > getMaxChannelCount()) return false;
98
99 m_stepSize = std::min(stepSize, blockSize);
100
101 return true;
102 }
103
104 void
105 ZeroCrossing::reset()
106 {
107 m_previousSample = 0.0f;
108 }
109
110 ZeroCrossing::OutputList
111 ZeroCrossing::getOutputDescriptors() const
112 {
113 OutputList list;
114
115 OutputDescriptor zc;
116 zc.identifier = "counts";
117 zc.name = "Zero Crossing Counts";
118 zc.description = "The number of zero crossing points per processing block";
119 zc.unit = "crossings";
120 zc.hasFixedBinCount = true;
121 zc.binCount = 1;
122 zc.hasKnownExtents = false;
123 zc.isQuantized = true;
124 zc.quantizeStep = 1.0;
125 zc.sampleType = OutputDescriptor::OneSamplePerStep;
126 list.push_back(zc);
127
128 zc.identifier = "zerocrossings";
129 zc.name = "Zero Crossings";
130 zc.description = "The locations of zero crossing points";
131 zc.unit = "";
132 zc.hasFixedBinCount = true;
133 zc.binCount = 0;
134 zc.sampleType = OutputDescriptor::VariableSampleRate;
135 zc.sampleRate = m_inputSampleRate;
136 list.push_back(zc);
137
138 return list;
139 }
140
141 //static int scount = 0;
142
143 ZeroCrossing::FeatureSet
144 ZeroCrossing::process(const float *const *inputBuffers,
145 Vamp::RealTime timestamp)
146 {
147 if (m_stepSize == 0) {
148 cerr << "ERROR: ZeroCrossing::process: "
149 << "ZeroCrossing has not been initialised"
150 << endl;
151 return FeatureSet();
152 }
153
154 // std::cerr << "ZeroCrossing::process: count = " << scount++ << ", timestamp = " << timestamp << ", rms = ";
155
156 float prev = m_previousSample;
157 size_t count = 0;
158
159 FeatureSet returnFeatures;
160
161 // double acc = 0.0;
162
163 for (size_t i = 0; i < m_stepSize; ++i) {
164
165 float sample = inputBuffers[0][i];
166 bool crossing = false;
167
168 if (sample <= 0.0) {
169 if (prev > 0.0) crossing = true;
170 } else if (sample > 0.0) {
171 if (prev <= 0.0) crossing = true;
172 }
173
174 if (crossing) {
175 ++count;
176 Feature feature;
177 feature.hasTimestamp = true;
178 feature.timestamp = timestamp +
179 Vamp::RealTime::frame2RealTime(i, (size_t)m_inputSampleRate);
180 returnFeatures[1].push_back(feature);
181 }
182
183 // acc += sample * sample;
184
185 prev = sample;
186 }
187
188 // acc /= m_stepSize;
189 // std::cerr << sqrt(acc) << std::endl;
190
191 m_previousSample = prev;
192
193 Feature feature;
194 feature.hasTimestamp = false;
195 feature.values.push_back(count);
196
197 returnFeatures[0].push_back(feature);
198 return returnFeatures;
199 }
200
201 ZeroCrossing::FeatureSet
202 ZeroCrossing::getRemainingFeatures()
203 {
204 return FeatureSet();
205 }
206