Matlab/Octave:用 FIR 插值给出按比例缩小的信号

Matlab/Octave: interpolating with FIR gives scaled down signal

给定 x(n),它被放大了 4 倍,我想用以下代码对其进行插值:

pkg load signal;
n = [1:100];
x = n.*cos(n);
upsampled = upsample(x,4);
b = fir1(30,0.25,'low');
interpolated = filter(b,1,upsampled)(16:end);
figure;
stem([1:4:400],x);
hold on;
stem(interpolated);

剧情是:

其中原始 x(n) 为蓝色,插值后为红色。

为什么插值信号按比例缩小?

这看起来更好:

pkg load signal;
n = [1:100];
x = n.*cos(n);
upsampled = upsample(x,4);
b = fir1(30,0.25,'low');
interpolated = filter(b,1,upsampled)(16:end);
figure;
stem([1:4:400],x);
hold on;
stem(interpolated*4); %notice the multiplication by 4 here

但为什么它有效?还是我运气好?

我可以看出以下各项之间存在明显的相关性:

upsample(x,4)

和;

stem(interpolated * 4)

upsample 在变量的每对值之间插入 3 个零。因此,您的过滤器功能将产生平滑的结果。如果你的结果让你满意,那很好。或者,尝试像这样规避问题:

pkg load signal;
n = 1:100;
x = n .* cos(n);
b = fir1(30,0.25,'low');
interpolated = filter(b,1,x)(4:end);
final = upsample(interpolated,4);
figure;
stem([1:4:400],x);
hold on;
stem(final);