Algorithm 使用PCM样本作为DFT的输入

Algorithm 使用PCM样本作为DFT的输入,algorithm,fft,pcm,Algorithm,Fft,Pcm,我正在编写一个应用程序,它将计算声音信号的DFT(使用FFT算法)。FFT算法的输入是PCM样本,也就是说,我有一个16位无符号整数的大列表 我知道,我需要使用一个窗口函数独立地计算几个声音信号段的DFT,并且我已经编写了将输入声音文件解码为原始PCM样本的工作代码 我的问题是关于: DFT应该对输入x(0),x(1),…,x(N-1)执行可逆线性变换,其中每个x(N)都是复数。但是,我不知道如何将解码后的样本整数转换成适合该算法的复数 我在网上看到过一些例子,其中每个样本被分割以获得[0,1]

我正在编写一个应用程序,它将计算声音信号的DFT(使用FFT算法)。FFT算法的输入是PCM样本,也就是说,我有一个16位无符号整数的大列表

我知道,我需要使用一个窗口函数独立地计算几个声音信号段的DFT,并且我已经编写了将输入声音文件解码为原始PCM样本的工作代码

我的问题是关于:

DFT应该对输入
x(0),x(1),…,x(N-1)
执行可逆线性变换,其中每个
x(N)
都是复数。但是,我不知道如何将解码后的样本整数转换成适合该算法的复数

我在网上看到过一些例子,其中每个样本被分割以获得[0,1]范围内的浮点值,然后将虚部设置为0


这是缩小到[0,1)必需?并将每个样本表示为
x+0i
,其中
x
样本值是否正确?

是的,您可以通过在每个实值上添加0的虚部来创建复数。尝试一下,它会起作用。但是,您只是将要处理的数据量增加了一倍,并且创建了大量冗余。您不能ice输出中的冗余:除了虚部的不同符号外,正频率和负频率的结果系数将是相同的。因此,为了提高效率和减少冗余,通常使用不同的转换将
N
实值转换为
N/2
complex值,结果得到(大致)
N/2
频率。这里我不详细介绍,但可以在这里找到复FFT和实输入转换的良好实现:

关于你的最后一个问题:不。你不需要缩放你的输入。DFT是一种线性变换,所以缩放输入只会产生相同缩放的输出


<强>编辑:< /强> BTW,你确定它是一个复杂的DFT吗?对于实际数据,特别是对于PCM数据,你应该考虑,它直接从实际输入数据映射到实际输出。< /P>是,对于所有输入值,虚部是0,没有缩放到< 0, 1 >。注意有很多DFT实现。具有不同缩放因子的离子,因此请检查输出信号的大小或功率,并根据需要重新缩放(以避免溢出…)我通常使用标准化DFT,它不会改变信号的大小也请看这里:其中一条评论是指向我的win32声卡示波器/频谱分析仪和发生器的链接,这样你就可以将结果与之进行比较……这是一个很好的答案。:)正是我不清楚的信息。我的目标是产生类似这样的东西:,从我所读到的内容来看,我们应该使用短时傅里叶变换(它似乎只是简单地计算输入信号的几个小段上的DFT)。然而,由于DCT-II“完全等同于(总比例因子为2)4N个偶数索引元素为零的偶数对称实输入的DFT”,也许我可以用它代替DFT,并应用相同的加窗技术?我会使用普通DFT,产生复频率分量。这些复系数的范数将是各自频率处的能量。DCT结果的正确后处理和解释更为复杂。参见dotty伪影在那个示例图像中的动作可能是错误的后处理的结果。当然,如果你小心的话,DCT的结果也会很好。为了完美的性能,你甚至可以考虑这里的MDCT:很棒,谢谢你的帮助!我会在网上做更多的阅读,并检查源代码。基斯(图.)