关于 Matlab 中 FFT 的零填充

问题描述

我有一个关于 fft 的零填充的问题。我用零填充和不使用零填充运行 fft 并进行了比较。

sf = 100; %sampling frequency
dt=1/sf; %time sampling interval
L = 10; %Length of signal
t = linspace(0,L,L/dt+1);

%zero-padding
nfft = 2^nextpow2(length(t)); %expansion of the data length for fft
t(length(t)+1:nfft) = 0; L = dt*nfft; t = linspace(0,L/dt+1);
t(end)=[];

fr = 4; %frequency
data = cos(2*pi*fr1*t);
df = sf/length(data); %frequency increment
f = (0:length(data)/2)*df;
fft_result =fft(data)/length(data);
spec_fft = 2*abs(fft_result); %spectrum
pha_fft = angle(fft_result); %phase
pha_fft = rad2deg(pha_fft);

subplot(2,1,1);
stem(f,spec_fft(1:length(f)));
subplot(2,2);
stem(f,pha_fft(1:length(f)));

我可以看到两个结果图像之间的差异。

enter image description here

enter image description here

当我在没有零填充的情况下执行 fft 时,幅度显示清晰,相位也清晰(我认为其他频率的相位是由于幅度值非常小而不是零)。但是当我使用零填充时,我可以看到我输入的附近频率的幅度(4Hz)显示出不同的方面,并且相位的结果在我看来很奇怪。当我使用零填充时,我的代码有问题吗?

*Cris Luengo 评论的附加问题

我试图通过扩展长度向数据填充零。

nfft = 2^nextpow2(length(t)); %expansion of the data length for fft
data(length(t)+1:nfft) = 0;

当我绘制数据时,我得到了

enter image description here

如您所见,超过 10 的值为零。

我得到了这个结果。

enter image description here

我想知道我的结果是否正常。

解决方法

如果 FFT 幅度结果接近于零,则可能只是数值噪声(随机量化和舍入误差)。这个数字噪声的相位是无稽之谈。我通常将相位设置为零,除非相应的幅度高于实际非零频谱的某个阈值。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...