写在前面
这个问题我在2023年初的寒假第一次遇到,这个时候闫老师给出的解释如下图所示,

这时我勉强明白是怎么回事,但是没有完全搞懂,现在我通过MATLAB建模的方式,彻底搞清楚了这个的原因。做这件事的动机在于一个学妹的MATLAB代码,其中有量化的片段,这个量化的片段执行完成之后,将量化后的数字码进行FFT分析,却在图中获得不到最终的频谱图,这个现象非常诡异,是我从来没有遇到过的。仔细查看其中的结果发现,频谱中的结果如下图所示,出现了zero interlacing的情况。

我称这种情况为Spectrum Zero Interpolation。
Spectrum Zero Interpolation会发生什么?
我起初上网搜索的时候,发现大部分的人在频谱中加0的方式都是所谓的zero padding,这种zero padding本质上就是在频谱的最后插零。
Zero Padding
为了验证频域中进行zero padding对时域信号有什么影响,我们采用下面方法进行验证。第一步先产生如下的时域信号,

这个时域信号产生的代码如下所示,
Signal = cos(2*pi*fin*t);
Signal_quantized = floor(Signal.*2^(bit));
可以看到,这个信号是量化过后的信号。第二步我们将这个信号做fft之后获取到了复数频谱数列,再对该序列的尾部进行zero padding(尾部插零),代码如下所示,
Spectrum = fft(Signal_quantized);
Spectrum_interpolated = zeros(1,N*10);
for i = 1:N
Spectrum_interpolated(i) = Spectrum(i);
end
最后使用ifft函数对得到的数据进行逆变换,代码如下所示,
Signal_interpolated = ifft(Spectrum_interpolated,'symmetric');
注意到这里有添加symmetric
的选项,这里是保证输出一定为实数信号。最后变换的结果如下所示,

可以频谱的周期并没有变,变的只是采样点数变大了,所以时域分辨率变高了。
Zero Interlacing
这里还有一种情况是在两根谱线的中间插零,会遇到什么情况呢?同样我们采用上述的方法进行验证,得到如下的Zero Interlacing之后的频谱,如下所示,

可以发现,时域谱数据的周期数量变多了,变为了原先的2倍,并且仔细观察后可以发现,增加的周期和原始的周期的数据是重复的。
结合我在做MATLAB模型时看到的数据
读者应该可以明白了,为什么我在量化后会遇到间断出零的情形,这是因为量化导致两个周期变一样了,因为实际上两个周期应该是有一定的相位差的,只是相位差非常小,量化误差导致了相位差被忽略,在这种情形下,自然就会出现频谱插零的情形了。
结论
频谱插零基本的原因是时域序列中出现了周期重复的情形,一般需要先排查时域中是否出现周期重复的量。针对我的模型,解决方案有三种:
- 提高量化位数,减小量化误差将两个周期量化为同一个的情形;
- 将第二个周期的数据删去;
- 加入噪声。
以上内容都是我的个人想法,没有经过其他人的验证。