gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 09:32:10 24 4
gpt4 key购买 nike

我正在了解 Android Visualizer 的

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

我如何知道哪个频率由 fft 中的哪个 byte 表示?

例如,索引是否表示频率?像 index = frequency 吗?

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

最佳答案

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

  • 首先通过将 FFT 表的长度除以采样率来确定频率桶大小,我们称之为bucketSize

  • 然后每个索引为 i 的桶(假设它从 0 开始)包含有关从 i * bucketSize(i + 1) * bucketSize 赫兹;

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

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

  • 要找到桶中频率的幅度(信号电平),需要从该桶的 FFT 表中获取复数值,比如说它是 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 表的第二部分没有带来任何好处,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])

关于android - Visualizer onFftDataCapture - byte[] 索引是否表示频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46185101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com