我一直在尝试确定此任务的逻辑,并计划使用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数量,这是使用大窗口大小的唯一好处吗?
预先感谢您提供的所有指导。