25 m_bandsPerOct = numBandsPerOctave;
26 m_numFFTBins = numFFTBins;
28 jassert(m_numFFTBins >= 128);
29 jassert(m_bandsPerOct >= 2);
30 jassert(m_minFreq >= 0 && m_minFreq < m_maxFreq);
33 if (m_maxFreq > m_samplingRate / 2.0f)
34 m_maxFreq = m_samplingRate / 2.0f;
70 jassert(m_samplingRate != 1.0f && m_numFFTBins != -1);
73 float mapFactor = (m_samplingRate / 2.0f) / m_numFFTBins;
75 std::transform(std::begin(m_freqLogAxis), std::end(m_freqLogAxis), std::begin(m_freqLogAxis),
76 [mapFactor](
float& c) {
return std::round(c / mapFactor); });
79 std::vector<float>::iterator it = std::unique(std::begin(m_freqLogAxis), std::end(m_freqLogAxis));
80 m_freqLogAxis.resize(std::distance(std::begin(m_freqLogAxis), it));
82 m_freqLogAxis.erase(std::remove_if(std::begin(m_freqLogAxis), std::end(m_freqLogAxis),
83 [=](
float bin) {
return bin >= m_numFFTBins; }),
84 std::end(m_freqLogAxis));
86 m_freqLogAxis.erase(std::remove(std::begin(m_freqLogAxis), std::end(m_freqLogAxis), 0.0f), std::end(m_freqLogAxis));
95 auto numBands = m_freqLogAxis.size() - 2;
96 jassert(numBands >= 3);
99 for (
int i = 0; i < numBands; i++)
102 float start = m_freqLogAxis.at(i);
103 float mid = m_freqLogAxis.at(i + 1);
104 float stop = m_freqLogAxis.at(i + 2);
107 std::vector<float> triangFilter = triangularFilterCoeff(start, mid, stop);
108 m_filterBank.push_back(triangFilter);
121 std::vector<float> rising;
122 float incr = 1.0f / (mid - start);
125 while (riseVal <= height)
127 rising.push_back(riseVal);
132 std::vector<float> falling;
133 float decr = -1.0f / (stop - mid);
134 float dropVal = height + decr;
136 while (dropVal >= 0.0f)
138 falling.push_back(dropVal);
142 std::vector<float> filterCoef(rising);
143 filterCoef.insert(std::end(filterCoef), std::begin(falling), std::end(falling));
145 std::vector<float> triangFilter(m_numFFTBins, 0.0f);
146 copy(std::cbegin(filterCoef), std::cend(filterCoef), std::begin(triangFilter) +
static_cast<int>(start) - 1);
153 const std::vector<std::vector<float>>& spectrum)
157 jassert(m_filterBank[0].size() == spectrum[0].size() && spectrum[0].size() == m_numFFTBins);
160 auto numBands = m_filterBank.size();
162 auto numFrames = spectrum.size();
163 std::vector<std::vector<float>> filteredLogSpec(numBands, std::vector<float>(numFrames));
165 if (m_samplingRate == sr_96k)
167 for (
int frame = 0; frame < numFrames; frame++)
169 musicScaleFilterUnrolled96000(filteredLogSpec, spectrum, frame);
172 else if (m_samplingRate == sr_48k)
174 for (
int frame = 0; frame < numFrames; frame++)
176 musicScaleFilterUnrolled48000(filteredLogSpec, spectrum, frame);
179 else if (m_samplingRate == sr_441k)
181 for (
int frame = 0; frame < numFrames; frame++)
183 musicScaleFilterUnrolled44100(filteredLogSpec, spectrum, frame);
186 else if (m_samplingRate == sr_225k)
188 for (
int frame = 0; frame < numFrames; frame++)
190 musicScaleFilterUnrolled22050(filteredLogSpec, spectrum, frame);
195 for (
int frame = 0; frame < numFrames; frame++)
197 auto spectralFrame = spectrum[frame];
199 for (
int band = 0; band < numBands; band++)
203 for (
int bin = 0; bin < m_numFFTBins; bin++)
205 float filter = m_filterBank[band][bin];
210 total += std::log10f(spectralFrame[bin] + 1.0f);
214 total += std::log10f(filter * spectralFrame[bin] + 1.0f);
218 filteredLogSpec[band][frame] = total;
223 return filteredLogSpec;