在对数中缩放 FFT 结果频率
Scale FFT result frequencys in log
我即将编写一个可视化工具,并取得相当不错的效果。我有一个大小为 1500 的数组,其中包含频率的大小。现在我想将此数组转换为具有 100 个值的数组。例如,第二个数组的第一个索引应该是第一个数组中前两个值的平均值。第二个数组的第二个索引应该是索引 3-6 的值。但我不知道如何正确计算。那么如何将第一个数组转换为第二个数组呢?
我在 rainmeter source code. 中找到了答案,也许现在会更清楚我想在这里做的是 c# 代码:
要获得具有特定长度的数组,请使用最小值对数进行缩放。和最大。频率。
private float[] getFrequencies(int min, int max, int nBands)
{
float[] returnVal = new float[nBands];
double step = (Math.Log(max / min) / nBands) / Math.Log(2.0);
returnVal[0] = (float)(min * Math.Pow(2.0, step / 2.0));
for (int iBand = 1; iBand < nBands; ++iBand)
{
returnVal[iBand] = (float)(returnVal[iBand - 1] * Math.Pow(2.0, step));
}
return returnVal;
}
并填充输出数组:
private double[] getLogArray(double[] data, int nBands, int minFreq, int maxFreq)
{
float[] bandFreq = getFrequencies(minFreq, maxFreq, nBands);
float df = (float)sampleRate / samples;
float scalar = 1.0f / sampleRate;
double[] bandOut = new double[nBands];
int iBin = 0;
int iBand = 0;
float f0 = 0.0f;
while (iBin <= (samples / 2) && iBand < nBands)
{
float fLin1 = ((float)iBin + 0.5f) * df;
float fLog1 = bandFreq[iBand];
float x = (float)data[iBin];
if (fLin1 <= fLog1)
{
bandOut[iBand] += (fLin1 - f0) * x * scalar;
f0 = fLin1;
iBin += 1;
}
else
{
bandOut[iBand] += (fLog1 - f0) * x * scalar;
f0 = fLog1;
iBand += 1;
}
}
return bandOut;
}
祝你今天愉快,抱歉回复晚了。
我即将编写一个可视化工具,并取得相当不错的效果。我有一个大小为 1500 的数组,其中包含频率的大小。现在我想将此数组转换为具有 100 个值的数组。例如,第二个数组的第一个索引应该是第一个数组中前两个值的平均值。第二个数组的第二个索引应该是索引 3-6 的值。但我不知道如何正确计算。那么如何将第一个数组转换为第二个数组呢?
我在 rainmeter source code. 中找到了答案,也许现在会更清楚我想在这里做的是 c# 代码: 要获得具有特定长度的数组,请使用最小值对数进行缩放。和最大。频率。
private float[] getFrequencies(int min, int max, int nBands)
{
float[] returnVal = new float[nBands];
double step = (Math.Log(max / min) / nBands) / Math.Log(2.0);
returnVal[0] = (float)(min * Math.Pow(2.0, step / 2.0));
for (int iBand = 1; iBand < nBands; ++iBand)
{
returnVal[iBand] = (float)(returnVal[iBand - 1] * Math.Pow(2.0, step));
}
return returnVal;
}
并填充输出数组:
private double[] getLogArray(double[] data, int nBands, int minFreq, int maxFreq)
{
float[] bandFreq = getFrequencies(minFreq, maxFreq, nBands);
float df = (float)sampleRate / samples;
float scalar = 1.0f / sampleRate;
double[] bandOut = new double[nBands];
int iBin = 0;
int iBand = 0;
float f0 = 0.0f;
while (iBin <= (samples / 2) && iBand < nBands)
{
float fLin1 = ((float)iBin + 0.5f) * df;
float fLog1 = bandFreq[iBand];
float x = (float)data[iBin];
if (fLin1 <= fLog1)
{
bandOut[iBand] += (fLin1 - f0) * x * scalar;
f0 = fLin1;
iBin += 1;
}
else
{
bandOut[iBand] += (fLog1 - f0) * x * scalar;
f0 = fLog1;
iBand += 1;
}
}
return bandOut;
}
祝你今天愉快,抱歉回复晚了。