Gab*_*rer 0 android signal-processing fft normalization libgdx
我正在使用 Libgdx 库对 Android 应用程序中的加速度计信号进行 FFT。
我需要对信号进行归一化,因为我找到两个信号的点积,并且我希望其最大值为 1。
对于“归一化”,我的意思是信号的欧几里得范数是1。(欧几里得范数是向量模拟分量的乘积之和的平方根。当我找到它的值时,为了归一化信号,我将向量的所有分量除以标准值)。
点积位于频谱中,因此如果我在时域中对信号进行归一化,则频谱表示不是欧几里德归一化,那么我将再次进行欧几里德归一化。(我已经考虑在 FFT 之后按 1/N比例因子进行归一化,我认为这可能不会影响我的问题)。
如果我在 FFT 之前和之后进行欧几里得归一化,或者仅在 FFT 之后进行欧几里得归一化,会有什么区别?
编辑1:还要考虑Libgdx库中的FFT是复杂的DFT,并且我在输入中有真实信号,而输出信号对于0到(N/2)-1和N/2到N是对称的。我验证了Parseval定理如果我不应用窗口(如汉明窗口),则验证。那么,如果我使用 0 到 N/2-1 信号分量,我会得到 0 到 1 之间的点积吗?
嗯,好像没人回答这个问题。不知道为什么,但我会简短地插话一下。
令 f[n] 为信号,F[k] 为傅立叶变换版本(显然是离散的)。
根据帕塞瓦尔定理,我们有:
norm(f[n]) = (1/N) norm(F[k])
Run Code Online (Sandbox Code Playgroud)
其中 N 是样本数。由傅里叶变换的齐次性,若g[n]=af[n],则G[k]=a F[k]。
最后,将两者结合起来,为了使norm(F[k]) 为1,您需要除以:
(1) norm(F[k]) = N norm(f[n])
Run Code Online (Sandbox Code Playgroud)
无论是时域还是频域。
类似地,如果你想让norm(f[n])为1,你需要做的就是除以:
(2) norm(f[n]) = (1/N) norm(F[k])
Run Code Online (Sandbox Code Playgroud)
最后:
如果我在 FFT 之前和之后进行欧几里得归一化,或者仅在 FFT 之后进行欧几里得归一化,会有什么区别?
无论在之前还是之后进行划分都没有什么区别,因为傅立叶变换是线性的(并且均匀性属性成立)。但是,如果您希望时域的范数为 1,则应使用 (2) 中的常数。另一方面,为了使频域的范数为 1,您应该在 (1) 中使用常数。