【发布时间】:2016-05-05 23:39:11
【问题描述】:
我是具有数学背景的音频处理新手,所以我对使用 fft 处理提取的样本的问题很少(很多,但对于初学者来说很少)。
我正在使用来自http://www.drdobbs.com/cpp/a-simple-and-efficient-fft-implementatio/199702312?pgno=1 的具有固定数组长度的fft 实现。
我有一些样本(比如说 1024 个样本)。
采用输入复数值(实部和虚部)的 Fft 算法,虚部设置为 0,因为我没有任何并去除它的虚部的 fft 输出。
我有下一个问题:
1) 我对样本是实数的假设是否正确?
2) 是否有有效的 FFT 实现,它只适用于真实的 数字?我的意思是计算中根本没有虚部。
3) 如果我继续使用所描述的过程,是否正确假设如果 fft 的输入中没有虚数数据(全为零),对于所有值,fft 输出的虚数部分也将为零?
PS 如果问题已经存在,我很抱歉,但我没有找到任何令人满意的答案。
【问题讨论】:
-
即使对于纯实输入,输出(通常)也会有一个虚部。输出的绝对值(幅度)表示相应频率的功率,而参数(复数值和实轴之间的角度)表示该频率的相位。对于音频应用,通常会忽略相位而仅保留幅度,但虚部仍会对此做出贡献且不能忽略。
-
谢谢,你能告诉我如果忽略虚部会有什么影响吗?我正在尝试对音频进行分析以创建相似度度量。我真的不明白如何实施统计测量,我是先计算实数然后再计算虚数,以及如何将这两个测量合并为一个?
-
如果您忽略虚部,那么您的输出将完全搞砸。你应该做的是取每个输出的绝对值——即 sqrt(real*real + imag*imag)
-
是的,immibis 说的可能就是你想要的。另外,实部和虚部与想要在音频波形中测量的特征不对应。
标签: c++ signal-processing fft