信号处理 - 将 FFTDb 函数应用于 waveLeft 数组 C# 后 fftLeft 数组的输出是什么.频率,或者
本文关键字:数组 fftLeft 输出 是什么 或者 频率 FFTDb 函数 waveLeft 应用于 信号处理 | 更新日期: 2023-09-27 17:57:09
我是声音编程的新手。我有一个实时声音可视化工具(http://www.codeproject.com/Articles/20025/Sound-visualizer-in-C)。我从 codeproject.com 下载了它。
在 AudioFrame 中.cs类有一个数组,如下所示:
_fftLeft = FourierTransform.FFTDb(ref _waveLeft);
_fftLeft
是一个双精度数组。 _waveLeft
也是一个双数组。如上所述,他们申请FouriorTransform.cs类的FFTDb函数到_waveLeft数组。
这是FFTDb函数:
static public double[] FFTDb(ref double[] x)
{
n = x.Length;
nu = (int)(Math.Log(n) / Math.Log(2));
int n2 = n / 2;
int nu1 = nu - 1;
double[] xre = new double[n];
double[] xim = new double[n];
double[] decibel = new double[n2];
double tr, ti, p, arg, c, s;
for (int i = 0; i < n; i++)
{
xre[i] = x[i];
xim[i] = 0.0f;
}
int k = 0;
for (int l = 1; l <= nu; l++)
{
while (k < n)
{
for (int i = 1; i <= n2; i++)
{
p = BitReverse(k >> nu1);
arg = 2 * (double)Math.PI * p / n;
c = (double)Math.Cos(arg);
s = (double)Math.Sin(arg);
tr = xre[k + n2] * c + xim[k + n2] * s;
ti = xim[k + n2] * c - xre[k + n2] * s;
xre[k + n2] = xre[k] - tr;
xim[k + n2] = xim[k] - ti;
xre[k] += tr;
xim[k] += ti;
k++;
}
k += n2;
}
k = 0;
nu1--;
n2 = n2 / 2;
}
k = 0;
int r;
while (k < n)
{
r = BitReverse(k);
if (r > k)
{
tr = xre[k];
ti = xim[k];
xre[k] = xre[r];
xim[k] = xim[r];
xre[r] = tr;
xim[r] = ti;
}
k++;
}
for (int i = 0; i < n / 2; i++)
decibel[i] = 10.0 * Math.Log10((float)(Math.Sqrt((xre[i] * xre[i]) + (xim[i] * xim[i]))));
return decibel;
}
当我用吉他弹奏音符时,我想知道它的频率是数字格式的。我写了一个 foreach 循环来知道 _fftLeft 数组的输出是什么,如下所示,
foreach (double myarray in _fftLeft)
{
Console.WriteLine(myarray );
}
此输出包含许多实时值,如下所示。
41.3672743963389
,43.0176034462662,
35.3677383746087,
42.5968946936404,
42.0600935794783,
36.7521669642071,
41.6356709559342,
41.7189032845742,
41.1002451261724,
40.8035583510188,
45.604366914128,
39.645552593115
我想知道这些值是什么(频率与否)? 如果答案是频率,那么为什么它包含低频值?当我弹奏吉他音符时,我想检测该特定吉他音符的频率。
根据发布的代码,FFTDb
首先计算FFT,然后计算并返回对数分贝刻度的频谱幅度。换句话说,_fftLeft
然后包含一组离散频率的幅度。根据这个答案,可以使用阵列指数和采样频率来计算这些频率的实际值。
例如,如果您正在绘制纯正弦音输入的_fftLeft
输出,您应该能够在对应于正弦频率的索引中看到明显的尖峰。然而,对于吉他音符,您可能会看到与谐波相对应的多个音阶尖峰。检测音符的频率(又名音高)是一个更复杂的主题,通常需要使用几种音高检测算法之一。