Треугольные окна как фильтры частотных диапазонов несложно реализовать. В основном вы хотите интегрировать данные FFT в каждой полосе (определенной как частотное пространство между центральной частотой i-1
и центральной частотой i+1
).
Вы в основном ищете что-то вроде
for(int bandIdx = 0; bandIdx < numBands; bandIdx++) {
int startFreqIdx = centerFreqs[bandIdx-1];
int centerFreqIdx = centerFreqs[bandIdx];
int stopFreqIdx = centerFreqs[bandIdx+1];
for(int freq = startFreqIdx; i < centerFreqIdx; i++) {
magnitudeScale = centerFreqIdx-startFreqIdx;
bandData[bandIdx] += fftData[freq]*(i-startFreqIdx)/magnitudeScale;
}
for(int freq = centerFreqIdx; i <= stopFreqIdx; i++) {
magnitudeScale = centerFreqIdx-stopFreqIdx;
bandData[bandIdx] += fftData[freq]*(i-stopFreqIdx)/magnitudeScale;
}
}
Если вы не понимаете концепцию «центральной частоты», «полосы» или «фильтра», возьмите учебник по элементарным сигналам - вам не следует реализовывать этот алгоритм, не понимая, что он делает.
Что касается точных центральных частот, вам решать. Поэкспериментируйте и выберите (или найдите в публикациях) значения, которые содержат информацию, которую вы хотите изолировать от данных. Причина, по которой нет определенных значений или даже шкалы значений, заключается в том, что этот алгоритм пытается приблизиться к человеческому уху, которое является очень сложным устройством для прослушивания. В то время как одна шкала может работать лучше, скажем, для речи, другая может работать лучше для музыки и т. Д. Вам решать, что уместно.