FFT 幅度中的偏移效应

信息处理 fft 采样 解析度
2022-02-07 17:00:25

为方便起见,我将使用 matlab 代码,我使用 C++ 代码得到相同的行为。

我有两个信号:

Fp=5;
A=0.00025;
Phi=0;
Off=0.5;
KADC_5VOLT=5.0/32768.0;

tc=250e-6;
tmax=30;
t=0:tc:tmax;

Buf1= int32 ((A*cos(2.0*pi*t*Fp+ Phi*pi/180.0)+Off)/(KADC_5VOLT));
Buf2= int32 ((A*cos(2.0*pi*t*Fp+ Phi*pi/180.0)+0)/(KADC_5VOLT));

Buf1=double(Buf1);
Buf2=double(Buf2);

在 Buf1 上执行 FFT,我得到 5 Hz 分量的幅度 2.4246e-04((这个值似乎作为 A 的函数随机变化,而 A 很小);而对于 Buf2,我得到 5 Hz 的幅度 2.6287e-04 Hz 分量。如果我设置 A > 0.0015,对 Buf1 和 Buf2 执行 FFT,我得到 5 Hz 分量的幅度 0.0015;

如果我只使用:

Buf1= ((A*cos(2.0*pi*t*Fp+ Phi*pi/180.0)+Off)/(KADC_5VOLT));
Buf2= ((A*cos(2.0*pi*t*Fp+ Phi*pi/180.0)+0)/(KADC_5VOLT));

在 Buf1 和 Buf2 上执行 FFT,我得到 5 Hz 分量的振幅 2.5000e-04。

这是什么原因?似乎问题与量化误差有关,但为什么偏移量如此重要?另外:我怎样才能摆脱它?

2个回答

由于您的偏移量是 3/5(加上一些整数),因此截断分数会有所不同,从而导致量化噪声的总和不同。您可以通过在截断或舍入之前使用整数偏移量(包括/之后的缩放)来消除这种差异。(例如不是 (2^N)/5)

此外,如果您的信号在您的 FFT 孔径中不是完全周期性的,那么非常低频率的结果幅度将对相对于窗口(边缘或中心)的相位具有很小的依赖性,因此与输入幅度不完全匹配。

首先,您没有提到您的采样率以及您的时间向量是如何定义的。

是的,这是一个量化问题。Buf2 中的最大幅度为 1.6。如果将其量化为整数,则最终只能得到值 -2,-1,0,1,2,因此会产生大量量化噪声。您只是量化这两个 2 或 3 位。将其转换为固定点的正确方法是应用适当的缩放比例,即使用小数、Q 表示法或一些合理的归一化方案。

添加偏移量只会改变问题。您获得的唯一数字将是 3275、3276、3277 和 3278。

Buf1 中较大的幅度仅仅是来自非常大的附加直流分量的量化噪声。