MATLAB 零填充信号究竟如何?

信息处理 matlab 信号分析 功率谱密度 零填充
2021-12-20 03:22:21

我正在 MATLAB 中进行一些大规模的数字运算,其中涉及数百万个 PSD 估计。每个数据段的长度为41。所以我一直在使用多锥度方法nfft=41(代码如下)。我的最后一次模拟花了八个多小时。代码经过优化和矢量化,我可以做到,所以我想如果我改变nfft=64它可能会加快速度。分析器确认这pmtm是迄今为止最慢的部分。

因此,查看 MATLAB 帮助页面,我看到在文档中它只说如果nfft大于数据段的长度,那么它是零填充的。我的问题是 MATLAB 到底在做什么?信号究竟是如何填充的?

我真的找不到任何用谷歌搜索的东西,我进行了自己的实验,但没有得到我应该得到的东西。在这里,我介绍我的代码和结果。


close all
clear all

dseg = [ 395.9640
  392.3630
  388.8230
  385.2820
  381.6130
  378.2600
  374.7470
  371.1860
  367.9920
  364.7830
  361.6630
  358.5660
  355.5620
  352.5820
  349.5530
  346.8110
  343.8130
  340.9010
  338.1460
  335.5110
  332.6300
  330.0470
  327.4020
  324.0930
  321.4680
  318.8760
  316.4470
  314.0850
  311.5310
  309.0600
  306.7570
  304.6690
  302.5820
  300.3890
  298.2480
  296.3650
  294.1660
  291.7610
  290.3300
  287.9700
  285.9850];

% Original signal with length=41
[ffty1,fftf1] = pmtm(dseg,4,41,1/30);
semilogy(fftf1,ffty1,'-o')
hold on

% Matlab "zeropads" to length=64
[ffty2,fftf2] = pmtm(dseg,4,64,1/30);
semilogy(fftf2,ffty2,'-or')

% Original zeropaded on both sides
dsegpad = [zeros(11,1); dseg; zeros(11,1); 0];
[ffty3,fftf3] = pmtm(dsegpad,4,64,1/30);
semilogy(fftf3,ffty3,'-ok')

% Original zeropadded at the end
dsegpad = [dseg; zeros(23,1)];
[ffty4,fftf4] = pmtm(dsegpad,4,64,1/30);
semilogy(fftf4,ffty4,'-og')

% Original signal just repeated
dsegpad = [dseg; dseg(1:23)];
[ffty5,fftf5] = pmtm(dsegpad,4,64,1/30);
semilogy(fftf5,ffty5,'-oc')

我将原始 PSD 与 MATLAB 的填充 PSD 进行比较,它们很接近。然后我自己做零填充,而不是让 MATLAB 来做。我在信号的两侧进行了零填充。我尝试在一侧进行零填充。我什至尝试定期重复信号以填充长度。但在所有三种情况下,我填充的 ​​PSD 都比原始的和 MATLAB 的 PSD 大得多。这是我所看到的。

MATLAB PSD 比较

我试着看pmtm代码,但很快就迷路了。任何人都知道 MATLAB 在做什么,为什么它如此混淆它?

1个回答

假设你有一个向量x=[1,2,3,4]T.
您想查看其 DFT 变换,然后对其应用 DFT 并对数据进行 4 点 DFT 变换。

在 MATLAB 中会是这样的:

vXDft = fft(vX);

但是,如果您想要相同数据的 64 点 DFT,会发生什么?
在 MATLAB 中会是这样的:

vXDft = fft(vX, 64);

那么会发生什么?
MATLAB 只是在向量的末尾添加零个元素,直到其大小为 64:

vXDft = fft([vX; zeros([60, 1])]);

这将匹配上面发生的情况(我假设是列向量)。

在实践中,您会在频域中获得更密集的网格(64 点)。
其中点由 Dirichlet Kernel(Sinc 函数的离散等效项)进行插值。