零填充似乎改变了信号的 FFT!

信息处理 fft 零填充
2022-02-21 20:40:17

我在使用零填充时遇到了麻烦。据我了解,理论上,时域中的零填充应该“sinc-interpolate”频域中信号的 FFT。

这意味着,1)原始信号的值都没有改变。2) FFT 的整体轮廓没有改变——也就是峰值保持在同一点附近。

但是,在模拟中这不起作用。

例如,我对以下序列进行 FFT

x=[0 1 0 1 0 1 0 1]

在一个假想的相同频率下,Fs=1Hz。没有零填充(FFT-8),

|X(f=.3125)|=4。

使用 2x 零填充 (FFT-14),

|X(f=.3125)|=2.6。

作为 ,此外,FFT 的峰值从 0.3125 移动到 0.25 作为N|X(f=.3125)|0 N

这是我的代码。相关参数为ZP,控制补零量(N=8*ZP):

ZP=0;       % of times of original length of signal to ZP with

x=[0 1 0 1 0 1 0 1]; 
x=[x,zeros(1,length(x)*2^ZP-length(x))];
X=fft(x);

Fs=1;
L=length(x);
df=.5*Fs/L;
t=(1:L)*(1/Fs);
f=(1:L)*df;

figure(12), 
subplot(211), stem(x);
subplot(212), stem(f,abs(X)); xlim([-.02,.52])

test_pnt=.3125;
I=find(f==test_pnt);
title(['abs[X(' mat2str(test_pnt) ')]=' mat2str(abs(X(I)))]);
1个回答

你的问题是这两行:

t=(1:L)*(1/Fs);
f=(1:L)*df;

他们应该阅读:

t=(0:L-1)*(1/Fs);
f=(0:L-1)*df;

如果我如下修改您的脚本(对于 scilab,而不是 matlab),我会得到以下图。峰都正确排列。

FFT 的峰值在 0.25 而不是 0.3125。

在此处输入图像描述


for ZP=0:5       // of times of original length of signal to ZP with

    x=[0 1 0 1 0 1 0 1]; 
    x=[x,zeros(1,length(x)*2^ZP-length(x))];
    X=fft(x);

    Fs=1;
    L=length(x);
    df=.5*Fs/L;    
    t=(0:L-1)*(1/Fs);
    f=(0:L-1)*df;

    figure; 
    subplot(211), plot(x);
    subplot(212), plot(f,abs(X)); //xlim([-.02,.52])

    test_pnt=.3125;
    I=find(f==test_pnt);
    title('abs[X(' + string(test_pnt) +']='+ string(abs(X(I))));

end;