均方根可以计算 FFT 结果的相似性吗?

信息处理 爪哇 fft
2022-01-26 10:08:24

我需要比较音频文件的 FFT 结果,我有 2 个音频文件的 2 个 FFT 结果..

FFT 1(样本)

-0.16314493488504767 - 0.103707391105263i
0.07863935536550609 - 0.30111206509352917i
0.06753127619272284 + 0.02837438103569126i

FFT 2(样本)

-0.006953384463464084 + 0.0291883094944081i
-0.09447919915711694 - 0.22676541801892i
-0.23493813662827812 - 0.07765408995141115i

然后我需要计算每个实部点(没有想象部分)与 FFT 结果的偏差,然后使结果绝对,像这样

-0.16314493488504767 - (-0.006953384463464084) 
--> then use Math.abs to get absolute value

然后对所有的偏差点求和,并使用均方根公式得到差值...

均方根公式

其中 N 是我的 numbeofFFTPoint,下面的 x 是我的偏差结果的总和值。

但是后来,有人告诉我使用过零率公式来获得更准确的结果 过零率

老实说,我不太了解过零率,

我尝试了什么:

我比较完全相同的 2 个音频文件,然后得到偏差和总和结果 --> 0.0,当然,均方根公式结果也是 0.0。因为文件之间没有区别,它会返回 0.0 对吗??

问题

是否可以仅用户均方根?对于这种情况我应该使用哪个公式有什么建议吗?

谢谢:)(抱歉4不好解释

1个回答

离散傅里叶变换是一个单一的变换(可能是缩放的)。因此,它保留了信号的 Frobenius 范数。这与均方根计算基本相同。

换句话说:

 rms( x - y ) == C * norm( fft(x) - fft(y) )

根据您的 fft 实现获得适当的常数 C。

在 Matlab 或 octave 中,C=1/nfft:

 n=8192;
 x=randn(n,2)*[1;j];
 y=randn(n,2)*[1;j];
 sqrt( mean( abs(x-y).^2 ) ) - norm(fft(x) - fft(y)) / n

 ans = -5.3291e-15