To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / examples / ZeroCrossing.cpp

History | View | Annotate | Download (4.64 KB)

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
#include <algorithm>
46

    
47
ZeroCrossing::ZeroCrossing(float inputSampleRate) :
48
    Plugin(inputSampleRate),
49
    m_stepSize(0),
50
    m_previousSample(0.0f)
51
{
52
}
53

    
54
ZeroCrossing::~ZeroCrossing()
55
{
56
}
57

    
58
string
59
ZeroCrossing::getIdentifier() const
60
{
61
    return "zerocrossing";
62
}
63

    
64
string
65
ZeroCrossing::getName() const
66
{
67
    return "Zero Crossings";
68
}
69

    
70
string
71
ZeroCrossing::getDescription() const
72
{
73
    return "Detect and count zero crossing points";
74
}
75

    
76
string
77
ZeroCrossing::getMaker() const
78
{
79
    return "Vamp SDK Example Plugins";
80
}
81

    
82
int
83
ZeroCrossing::getPluginVersion() const
84
{
85
    return 2;
86
}
87

    
88
string
89
ZeroCrossing::getCopyright() const
90
{
91
    return "Freely redistributable (BSD license)";
92
}
93

    
94
bool
95
ZeroCrossing::initialise(size_t channels, size_t stepSize, size_t blockSize)
96
{
97
    if (channels < getMinChannelCount() ||
98
        channels > getMaxChannelCount()) return false;
99

    
100
    m_stepSize = std::min(stepSize, blockSize);
101

    
102
    return true;
103
}
104

    
105
void
106
ZeroCrossing::reset()
107
{
108
    m_previousSample = 0.0f;
109
}
110

    
111
ZeroCrossing::OutputList
112
ZeroCrossing::getOutputDescriptors() const
113
{
114
    OutputList list;
115

    
116
    OutputDescriptor zc;
117
    zc.identifier = "counts";
118
    zc.name = "Zero Crossing Counts";
119
    zc.description = "The number of zero crossing points per processing block";
120
    zc.unit = "crossings";
121
    zc.hasFixedBinCount = true;
122
    zc.binCount = 1;
123
    zc.hasKnownExtents = false;
124
    zc.isQuantized = true;
125
    zc.quantizeStep = 1.0;
126
    zc.sampleType = OutputDescriptor::OneSamplePerStep;
127
    list.push_back(zc);
128

    
129
    zc.identifier = "zerocrossings";
130
    zc.name = "Zero Crossings";
131
    zc.description = "The locations of zero crossing points";
132
    zc.unit = "";
133
    zc.hasFixedBinCount = true;
134
    zc.binCount = 0;
135
    zc.sampleType = OutputDescriptor::VariableSampleRate;
136
    zc.sampleRate = m_inputSampleRate;
137
    list.push_back(zc);
138

    
139
    return list;
140
}
141

    
142
ZeroCrossing::FeatureSet
143
ZeroCrossing::process(const float *const *inputBuffers,
144
                      Vamp::RealTime timestamp)
145
{
146
    if (m_stepSize == 0) {
147
        cerr << "ERROR: ZeroCrossing::process: "
148
             << "ZeroCrossing has not been initialised"
149
             << endl;
150
        return FeatureSet();
151
    }
152

    
153
    float prev = m_previousSample;
154
    size_t count = 0;
155

    
156
    FeatureSet returnFeatures;
157

    
158
    for (size_t i = 0; i < m_stepSize; ++i) {
159

    
160
        float sample = inputBuffers[0][i];
161
        bool crossing = false;
162

    
163
        if (sample <= 0.0) {
164
            if (prev > 0.0) crossing = true;
165
        } else if (sample > 0.0) {
166
            if (prev <= 0.0) crossing = true;
167
        }
168

    
169
        if (crossing) {
170
            ++count; 
171
            Feature feature;
172
            feature.hasTimestamp = true;
173
            feature.timestamp = timestamp +
174
                Vamp::RealTime::frame2RealTime(i, (size_t)m_inputSampleRate);
175
            returnFeatures[1].push_back(feature);
176
        }
177

    
178
        prev = sample;
179
    }
180

    
181
    m_previousSample = prev;
182

    
183
    Feature feature;
184
    feature.hasTimestamp = false;
185
    feature.values.push_back(float(count));
186

    
187
    returnFeatures[0].push_back(feature);
188
    return returnFeatures;
189
}
190

    
191
ZeroCrossing::FeatureSet
192
ZeroCrossing::getRemainingFeatures()
193
{
194
    return FeatureSet();
195
}
196