为什么当窗口输入被零填充时,Matlab 频谱图看起来是条纹的?

信息处理 matlab 频谱图 窗函数 stft 零填充
2022-01-28 04:02:39

我正在做一个小项目,偶然发现了一些我还无法理解的东西。我正在学习认知科学,没有DSP知识背景,只是从我在互联网上找到的东西学习。我有一个 46380x1 双数组,其中包含我的信号。我想像这样画出一个很好的频谱图:

%%signal = %%too long to put here, 46380x1 double array
winsize = ceil(length(signal)/10); %% =4639
win = rectwin(winsize);
shift = ceil(length(signal)/150); %% =310
nfft = winsize;
srate = 78;

spectrogram(signal, win, winsize-shift, nfft, srate, 'yaxis');
ylim([0.015 2]);

它工作正常,并显示:

nfft = winsize

但是,如果我想对窗口信号进行零填充(Matlab 文档说,增加 nfft 会做到这一点),输出会在其中包含这些条纹,无论我按什么因素缩放“winsize”,它总是会显示某种频谱图中的失真。例如,我nfft=round(1.5*winsize)在制作频谱图之前设置,其输​​出变为:

nfft = 圆形(1.5*winsize)

为什么会这样?我知道我不能通过零填充来增加信号中的信息量,但如果不是那么像素化,它可能对人眼来说更具可读性,这就是我尝试在这里应用零填充的原因。你能帮忙吗,我应该在没有这些线路的情况下尝试实现这一目标吗?

无论如何,如果我查看从 0hz 开始的轨迹,在整个时间轴上,频谱图的输出分量非常大,频率非常接近于零。view(-135,65); ylim([0 2]);这是为什么?

巨大的接近于零的频率输出

提前致谢!

2个回答

正如@ZR Han 已经说过的那样,强的 0 Hz 内容或 DC(直流电)表示信号中具有强能量的潜在偏移。在其他地方,第一个频谱图没有显示很多变化,就好像信号非常稳定一样。另一个相当稳定的内容是 0.22 Hz 左右的稳定频率。

因此,如果信号能量的很大一部分停留在“正弦加偏移”中,则零填充可能会产生大量伪影。下图显示了 FFT 的它们,当然您会在频谱图中发现傅立叶峰值和波纹作为线。

零填充对偏移和正弦/余弦的影响

因此,如果 0.22 Hz 左右的恒定频率令人讨厌,建议的预处理是:

  • 去除全局平均值,
  • 用陷波滤波器去除后一个恒定频率,
  • 然后在一个框架内
    • 从框架中删除局部平均值(中值/平均值)(在局部趋势变化或异常值的情况下)
    • 用轻轻变为零的窗口轻敲框架

然后填充的频谱图应该表现出其他有趣的非平稳特征。

由于我没有你的原始数据,我将根据我的直觉给出答案。试试 Hann 窗函数和 50% 的重叠,看看会发生什么。

我已经尝试将人类语音信号作为输入,是否应用零填充不会改变结果。

% signal = ...
winsize = 512;
win = hann(winsize, 'periodic'); % use hann window instead of rectangular window
shift = winsize/2; % 50% overlap 
nfft = winsize;
% nfft=round(1.5*winsize);
srate = 48e3;
figure;
spectrogram(signal, win, winsize-shift, nfft, srate, 'yaxis');

结果如下:

在此处输入图像描述

请原谅我的中文xlabel和ylabel,它们分别是“时间(s)”和“频率(kHz)”,颜色条标签代表“功率/频率(dB/Hz)”。我看不出这两个数字之间有任何明显的区别。

此外,您可以使用更小的 FFT 大小。通常,使用如此长的 FFT 大小意味着您需要极高的频率分辨率。

Δf=fsNFFT

在哪里Δf是频率分辨率,为 0.0168 Hz 时fs= 78 Hz 和 NFFT = 4639。虽然超高频分辨率意味着超低时间分辨率,但事实是ΔT=1/Δf. 在您的情况下,您只有 10 个时间样本结果。


对于第二个问题,0 Hz 表示直流 (DC) 分量。也许您应该添加一些有关您正在分析哪种信号的信息。