零中心和因果零填充

信息处理 fft 离散信号 傅里叶变换 自由度 零填充
2022-02-06 11:34:46

我按照下面的链接模拟了两种不同的零填充方法(零中心和因果)

https://ccrma.stanford.edu/~jos/mdft/Zero_Padding.html

示例代码

close all;
clear all;

x           = [3 2 1 1 2];
n           = length(x);

fft_len     = 32;

zeropadd    = fft_len - n;

y           = [x(1:(n-1)/2+1) zeros(1,zeropadd) x((n-1)/2+2:end)];

y_normal    = [y(fft_len/2+2:fft_len) y(1:fft_len/2)];

x_zeropad   = [x zeros(1,zeropadd)];

y_fft       = fft(y);

y_normal_fft = fft(y_normal);

x_fft       = fft(x, fft_len);

x_zp_fft    = fft(x_zeropad);

subplot(421)
stem(y)
xlabel 'n',
ylabel 'y'

subplot(422)
stem(y_fft)
xlabel 'n',
ylabel 'fft(y)'

subplot(423)
stem(y_normal)
xlabel 'n',
ylabel 'y-normal'

subplot(424)
stem(y_normal_fft)
xlabel 'n',
ylabel 'fft(y-normal)'

subplot(425)
stem(x)
xlabel 'n',
ylabel 'x'

subplot(426)
stem(x_fft)
xlabel 'n',
ylabel 'fft(x, fft_len)'

subplot(427)
stem(x_zeropad)
xlabel 'n',
ylabel 'x-zp'

subplot(428)
stem(x_zp_fft)
xlabel 'n',
ylabel 'fft(x-zp)'

输出是

在此处输入图像描述

我的问题是为什么 , 的fft(y)频谱fft(y_normal)不同于fft(x)fft(x_zp)

2个回答

x和信号的 DFT 不同的明显原因y是信号本身不同。不同版本的零填充导致不同的 DFT。

您可能想要展示的是原始信号的两个零填充版本的 DFT 是原始未填充信号的 DFT 的插值版本。确实如此。但是为了看到这一点,您必须计算x没有零填充的 DFT,然后将其与 的两个零填充版本的 DFT 进行比较x

X = fft(x);

此外,您需要选择一个 FFT 长度,它是 的长度的整数倍x,否则零填充信号的 FFT 值不会与原始信号的 FFT 完全匹配:

n = length(x);
fft_len = 4*n;
zeropadd = fft_len - n;
y = [x(1:(n-1)/2+1) zeros(1,zeropadd) x((n-1)/2+2:end)];
Xz = fft(x, fft_len);
Y = fft(y);

请注意,由于两个信号的对称性,x和的 DFTy是实值(直至舍入误差)。在末尾添加零的信号的 DFTXz是复值,因为零填充信号不再是对称的。然而,XzY都是 的插值版本X,即对于给定的 FFT 长度,Xz和 的每第四个值Y等于 的对应值X

如下图所示。它显示X(由一个因子展开4),Y和 的实部Xz请注意,对于是的倍数的索引4(因为我们选择了fft_len = 4*n), 和 的值相等,Xz并且Y它们对应于 的值XXz以及以下的插值Y版本X

在此处输入图像描述

您正在绘制 FFT 结果的实部。而不是这样做,您应该绘制 FFT 结果的绝对值。例如,使用 'stem(abs(y_normal_ff))' 代替 'stem(y_normal_fft)'。