我有一个音频文件,我正在遍历该文件并在每个步骤中取512个样本,然后通过FFT传递它们。
我将数据输出为一个514个浮点数的块(使用IPP的ippsFFTFwd_RToCCS_32f_I),其中实部和虚部交错存放。
我的问题是:一旦我拥有这些复数,我该怎么做?目前,我正在对每个值执行以下操作
const float realValue = buffer[(y * 2) + 0];
const float imagValue = buffer[(y * 2) + 1];
const float value = sqrt( (realValue * realValue) + (imagValue * imagValue) );
这样得到的结果可用,但我更希望找到一种方式将值限制在0到1范围内。上述方法的问题在于峰值最终会回到大约9或更高。这意味着事情会变得非常饱和,然后频谱图的其他部分几乎不会出现,尽管当我通过Audition的频谱图运行音频时它们看起来相当强大。我完全承认我并不百分百确定FFT返回的数据是什么(除了它表示我传入的512个样本的长块的频率值)。特别是我对复数表示的理解缺乏。
非常感谢任何建议和帮助!
编辑:仅澄清。我的主要问题是FFT返回的值没有任何意义,如果没有对比例有所了解。有人能指点我如何计算比例吗?
编辑2:通过以下步骤,我得到了非常漂亮的结果:
size_t count2 = 0;
size_t max2 = kFFTSize + 2;
while( count2 < max2 )
{
const float realValue = buffer[(count2) + 0];
const float imagValue = buffer[(count2) + 1];
const float value = (log10f( sqrtf( (realValue * realValue) + (imagValue * imagValue) ) * rcpVerticalZoom ) + 1.0f) * 0.5f;
buffer[count2 >> 1] = value;
count2 += 2;
}
在我看来,这甚至比我看过的大多数其他频谱图实现都要好。
我所做的有什么主要错误吗?