Visualizer onFftDataCapture - byte[] 索引是否表示频率?

Visualizer onFftDataCapture - Does the byte[] index represent frequency?

我正在了解 Android 展示台的

onFftDataCapture((Visualizer visualizer, 
            byte[] fft, 
            int samplingRate)

我怎么知道fft中的byte代表哪个频率?

例如,索引是否表示频率?喜欢 index = frequency?

对于索引 0,频率为 0 Hz,索引 1 为 1 Hz,等等?

FFT 生成复数,其中每个数字都反映了有关包含连续范围频率的桶的频域信息。解释FFT数据的常用方法如下:

  • 首先用FFT的长度table除以采样率来确定频率桶的大小,我们称之为bucketSize;

  • 那么每个索引为 i 的桶(假设它是从 0 开始的)包含有关从 i * bucketSize(i + 1) * bucketSize Hz 范围内的频率的信息;

  • 对于实值信号,FFT 后半部分的值 table(对于频率高于 samplingRate / 2 的桶)将只是第一部分的镜像一半,所以它们通常被丢弃;

  • 此外,对于第一个(索引0)和最后一个(索引samplingRate / 2)个桶,FFT table 的值将是实数以及(假设实值信号);

  • 要找到桶中频率的幅度(信号电平),需要从该桶的 FFT table 中获取复数值,假设它是 a + ib,计算sqrt(a*a + b*b).

现在回到 onFftDataCapture 的结果。这里 fft 数组包含作为连续字节对的复数,除了前两个元素,所以 fft[2]fft[3] 包含第一个桶的复数,fft[4] fft[5] -- 第二个,依此类推。 fft[0] 是第 0 个频率 (DC) 的 FFT 值(实数),fft[1] 是最后一个频率。

因为,正如我所提到的,对于实值信号,FFT table 的第二部分没有带来任何好处,not fft 数组。但是由于每个 FFT 桶占用两个数组单元格,因此以 Hz 为单位的桶大小仍将计算为 fft.length / samplingRate。注意 fft.length 实际上是 Visualizer 的 setCaptureSize 方法设置的捕获大小。

可以使用 Math.hypot 函数轻松计算频率桶的大小,例如对于第一个桶,它是 Math.hypot(fft[2], fft[3])。对于 DC 桶,它只是 Math.abs(fft[0]),对于最后一个频率桶,它是 Math.abs(fft[1]).