作为频带滤波器的三角窗并不难实现。您基本上希望在每个频段内集成 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;
}
}
如果您不了解“中心频率”或“频带”或“滤波器”的概念,请拿起一本基本信号教科书——您不应该在不了解它的作用的情况下实现该算法。
至于确切的中心频率是多少,这取决于您。试验并挑选(或在出版物中查找)捕获您希望从数据中分离出来的信息的值。之所以没有确定的值,甚至是值的尺度,是因为该算法试图逼近人耳,这是一种非常复杂的听音设备。一种音阶可能更适合演讲,而另一种音阶可能更适合音乐等。您可以选择合适的音阶。