comparison plugins/BeatTrack.cpp @ 30:ff5a09e45209

* add support for adaptive whitening
author Chris Cannam <c.cannam@qmul.ac.uk>
date Thu, 09 Aug 2007 16:35:37 +0000
parents 56fe3bd9de6e
children 5cd7e3069553
comparison
equal deleted inserted replaced
29:56fe3bd9de6e 30:ff5a09e45209
42 42
43 43
44 BeatTracker::BeatTracker(float inputSampleRate) : 44 BeatTracker::BeatTracker(float inputSampleRate) :
45 Vamp::Plugin(inputSampleRate), 45 Vamp::Plugin(inputSampleRate),
46 m_d(0), 46 m_d(0),
47 m_dfType(DF_COMPLEXSD) 47 m_dfType(DF_COMPLEXSD),
48 m_whiten(false)
48 { 49 {
49 } 50 }
50 51
51 BeatTracker::~BeatTracker() 52 BeatTracker::~BeatTracker()
52 { 53 {
108 desc.valueNames.push_back("Phase Deviation"); 109 desc.valueNames.push_back("Phase Deviation");
109 desc.valueNames.push_back("Complex Domain"); 110 desc.valueNames.push_back("Complex Domain");
110 desc.valueNames.push_back("Broadband Energy Rise"); 111 desc.valueNames.push_back("Broadband Energy Rise");
111 list.push_back(desc); 112 list.push_back(desc);
112 113
114 desc.identifier = "whiten";
115 desc.name = "Adaptive Whitening";
116 desc.description = "Normalize frequency bin magnitudes relative to recent peak levels";
117 desc.minValue = 0;
118 desc.maxValue = 1;
119 desc.defaultValue = 0;
120 desc.isQuantized = true;
121 desc.quantizeStep = 1;
122 desc.unit = "";
123 desc.valueNames.clear();
124 list.push_back(desc);
125
113 return list; 126 return list;
114 } 127 }
115 128
116 float 129 float
117 BeatTracker::getParameter(std::string name) const 130 BeatTracker::getParameter(std::string name) const
121 case DF_HFC: return 0; 134 case DF_HFC: return 0;
122 case DF_SPECDIFF: return 1; 135 case DF_SPECDIFF: return 1;
123 case DF_PHASEDEV: return 2; 136 case DF_PHASEDEV: return 2;
124 default: case DF_COMPLEXSD: return 3; 137 default: case DF_COMPLEXSD: return 3;
125 case DF_BROADBAND: return 4; 138 case DF_BROADBAND: return 4;
139 case DF_POWER: return 5;
126 } 140 }
141 } else if (name == "whiten") {
142 return m_whiten ? 1.0 : 0.0;
127 } 143 }
128 return 0.0; 144 return 0.0;
129 } 145 }
130 146
131 void 147 void
136 case 0: m_dfType = DF_HFC; break; 152 case 0: m_dfType = DF_HFC; break;
137 case 1: m_dfType = DF_SPECDIFF; break; 153 case 1: m_dfType = DF_SPECDIFF; break;
138 case 2: m_dfType = DF_PHASEDEV; break; 154 case 2: m_dfType = DF_PHASEDEV; break;
139 default: case 3: m_dfType = DF_COMPLEXSD; break; 155 default: case 3: m_dfType = DF_COMPLEXSD; break;
140 case 4: m_dfType = DF_BROADBAND; break; 156 case 4: m_dfType = DF_BROADBAND; break;
157 case 5: m_dfType = DF_POWER; break;
141 } 158 }
159 } else if (name == "whiten") {
160 m_whiten = (value > 0.5);
142 } 161 }
143 } 162 }
144 163
145 bool 164 bool
146 BeatTracker::initialise(size_t channels, size_t stepSize, size_t blockSize) 165 BeatTracker::initialise(size_t channels, size_t stepSize, size_t blockSize)
173 dfConfig.DFType = m_dfType; 192 dfConfig.DFType = m_dfType;
174 dfConfig.stepSecs = float(stepSize) / m_inputSampleRate; 193 dfConfig.stepSecs = float(stepSize) / m_inputSampleRate;
175 dfConfig.stepSize = stepSize; 194 dfConfig.stepSize = stepSize;
176 dfConfig.frameLength = blockSize; 195 dfConfig.frameLength = blockSize;
177 dfConfig.dbRise = 3; 196 dfConfig.dbRise = 3;
197 dfConfig.adaptiveWhitening = m_whiten;
198 dfConfig.whiteningRelaxCoeff = -1;
199 dfConfig.whiteningFloor = -1;
178 200
179 m_d = new BeatTrackerData(dfConfig); 201 m_d = new BeatTrackerData(dfConfig);
180 return true; 202 return true;
181 } 203 }
182 204