我正在 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 大得多。这是我所看到的。
我试着看pmtm
代码,但很快就迷路了。任何人都知道 MATLAB 在做什么,为什么它如此混淆它?