我正在编写一个应用程序,它将计算声音信号的DFT(使用FFT算法)。我对FFT算法的输入是PCM样本 - 也就是说,我有一个16位无符号整数的大列表。
我知道我需要使用窗口函数独立计算声音信号的几个段的DFT,并且我已经编写了将输入声音文件解码为原始PCM样本的工作代码。
我的问题是关于definition of the DFT given on Wikipedia:
DFT应该对输入x(0), x(1), ..., x(N-1)
执行可逆的线性变换,其中每个x(n)
是一个复数。但是,我不明白如何获取我的解码样本整数,并将它们变成适合算法的复数。
我在网上看到了一些例子,其中每个样本被划分以获得[0,1]范围内的浮点值,然后将虚部设置为0.
这是否需要缩小到[0,1]?并将每个样本表示为x + 0i
,其中x
的样本值是否正确?
答案 0 :(得分:2)
是的,您可以通过在每个实际值中添加0的虚部来创建复数。试试吧,它会起作用。但是,您只需将要处理的数据量增加一倍,就可以创建大量冗余。您可以注意到输出中的冗余:除了虚部的不同符号外,正频率和负频率的结果系数将是相同的。因此,为了提高效率并减少冗余,通常会使用不同的转换将N
实数值转换为N/2
复数值,从而获得(大致)N/2
个频率。我不会在这里详细介绍,但是可以在这里找到复杂FFT和实际输入转换的一个很好的实现:http://sourceforge.net/projects/kissfft/
关于你的最后一个问题:不。你不需要扩展你的输入。 DFT是线性变换,因此缩放输入只会导致相同的缩放输出。
编辑: BTW,你确定这是一个复杂的DFT你想要的吗?对于实际数据,特别是PCM数据,您应该考虑使用Cosine Transform,它直接从实际输入数据映射到实际输出。