VampPluginSDK
2.1
Main Page
Namespaces
Classes
Files
File List
File Members
ZeroCrossing.cpp
Go to the documentation of this file.
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
ZeroCrossing::FeatureSet
142
ZeroCrossing::process
(
const
float
*
const
*inputBuffers,
143
Vamp::RealTime
timestamp)
144
{
145
if
(
m_stepSize
== 0) {
146
cerr <<
"ERROR: ZeroCrossing::process: "
147
<<
"ZeroCrossing has not been initialised"
148
<< endl;
149
return
FeatureSet
();
150
}
151
152
float
prev =
m_previousSample
;
153
size_t
count = 0;
154
155
FeatureSet
returnFeatures;
156
157
for
(
size_t
i = 0; i <
m_stepSize
; ++i) {
158
159
float
sample = inputBuffers[0][i];
160
bool
crossing =
false
;
161
162
if
(sample <= 0.0) {
163
if
(prev > 0.0) crossing =
true
;
164
}
else
if
(sample > 0.0) {
165
if
(prev <= 0.0) crossing =
true
;
166
}
167
168
if
(crossing) {
169
++count;
170
Feature
feature;
171
feature.
hasTimestamp
=
true
;
172
feature.
timestamp
= timestamp +
173
Vamp::RealTime::frame2RealTime
(i, (
size_t
)
m_inputSampleRate
);
174
returnFeatures[1].push_back(feature);
175
}
176
177
prev = sample;
178
}
179
180
m_previousSample
= prev;
181
182
Feature
feature;
183
feature.
hasTimestamp
=
false
;
184
feature.
values
.push_back(
float
(count));
185
186
returnFeatures[0].push_back(feature);
187
return
returnFeatures;
188
}
189
190
ZeroCrossing::FeatureSet
191
ZeroCrossing::getRemainingFeatures
()
192
{
193
return
FeatureSet
();
194
}
195
examples
ZeroCrossing.cpp
Generated on Wed Mar 12 2014 13:11:23 for VampPluginSDK by
1.8.1.2