我一直在尝试找出这个任务的逻辑,并计划使用 KissFFT 源包来执行快速傅立叶变换。请让我知道这是否正确:
- 分配一个 FFT 结构,即。我正在使用的窗口大小
kiss_fft_alloc(N,0,NULL,NULL)
在哪里。N
输入缓冲区将是一个N
类型为 的元素数组kiss_fft_scalar
。N/2 + 1
输出缓冲区将是类型元素的数组kiss_fft_cpx
。 - 解码
N
(窗口大小)PCM 样本数。 - 对于每个 PCM 样本,平均每个通道的幅度(无符号样本)并从 0 缩放到 2(除以 65536.0),将结果存储到输入缓冲区中。
- 对输入缓冲区执行窗口化(即 Hanning)。
- 对输入缓冲区执行快速傅立叶变换,存储到输出缓冲区。由于我使用实数值作为输入,我可以使用
kiss_fftr()
. - 对于
N/2
输出值,获取变换数据的平方幅度,并使用以下公式将值转换为 dB 标度:10 * log10 (re * re + im * im)
- 绘制
N/2
步骤 6 中的值。 - 丢弃输入缓冲区的前半部分,解码下一个(窗口大小/2)PCM 样本并对数据执行缩放和窗口化。这应该可以有效地滑动输入窗口并避免对已处理的 PCM 样本重做数学运算。
- 循环到第 5 步,重复这些步骤,直到处理完所有样本。
- 释放已使用的内存
kiss_fft_alloc()
。
有人建议我在执行 FFT 之前从输入窗口中减去一个值,这样得到的 DC 值的幅度为零。我应该从输入数据中减去平均值还是平均值?
另外,在选择窗口大小时需要考虑哪些事项?除了根据 KissFFT 的说明它必须是偶数之外,使用小窗口大小是否有好处,即。它会提供更好的图表吗?我假设大窗口大小减少了必须执行的 FFT 的数量,这是使用大窗口大小的唯一好处吗?
最后,当我准备好绘制数据时,我该如何绘制它?当我过去在一些波形图逻辑上工作时,我只是为每个像素绘制了 3 个值-轴(最小幅度,最大幅度,RMS幅度),但我不知道我应该如何处理频谱图数据。
提前感谢您提供的任何和所有指导。