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])
.
我正在了解 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])
.