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