我想在MATLAB中使用上采样然后使用低通滤波器来模拟插值器。首先,我通过引入0来对信号进行上采样。
现在我想应用低通滤波器进行插值。我设计了以下过滤器:
滤波器恰好是标准化频率的1/8,因为我需要在之后进行下采样。 (这是以特定顺序对上采样插值和下采样的特定例外。)
但是,当我使用函数filter(myfilter, data)
将此过滤器应用于我的数据时,会生成以下信号:
我真的不知道我的信号发生了什么,因为理论上我知道应该出现插值信号。这是我第一次在MATLAB中使用滤波器,因为到目前为止我们只有理论并且必须假设理想的滤波器和分析解决方案。
有人可以告诉我可能出错的地方吗?我使用以下代码:
clear all; close all;
% Settings parameters
fs=10e6;
N=10;
c=3/fs;
k=3;
M=8;
% Settings time and signal
t=0:fs^-1:N*fs^-1;
x=exp(-(t.^2)./(2.*c.^2)); % Gaussian signal
% Upsampling
tu=0:(fs*M)^-1:N*fs^-1;
xu=zeros(1,size(tu,2));
sample_range=1:M:size(xu,2);
for i=1:size(x,2);
xu(sample_range(i))=x(i);
end;
%% Direct Method
xf=filter(lpf5mhz,xu);
答案 0 :(得分:3)
正如hotpaw2's answer所建议的那样,低通滤波器需要一些时间来提升输入信号值。对于具有诸如你的尖锐步骤的信号,这尤其明显(由于filter
调用假定过去的样本为零,因此信号隐含地包括第一个样本的大步长)。此外,根据您的设计参数,滤波器的延迟大于输出图(1e-6
)上显示的最大时间范围,相应地,输出在显示的时间范围内仍然非常小。
为了说明这一点,我们可以使用fir1(length,0.125)
生成的过滤器来查看滤波器长度较小的过滤输出(以及相应较小的延迟):
给定一个具有更平滑过渡的信号,例如已被充分延时的高斯脉冲:
delay = 10/fs;
x=exp(-((t-delay).^2)./(2.*c.^2)); % Gaussian signal
滤波器可以更好地提升到信号值:
接下来您可能会注意到,滤波后的输出具有1/M
th 幅度作为未滤波信号。要获得与未滤波信号具有相似幅度的插值信号,您必须使用以下方法缩放滤波器输出:
xf=M*filter(lpf5mhz,1,xu);
最后,通过滤波操作延迟信号。因此,为了进行比较,您可能需要绘制时移版本:
filter_delay = (1/(M*fs))*(length(lpf5mhz)-1)/2;
plot(tu-(1/(M*fs))*(length(b)-1)/2, xf);
答案 1 :(得分:1)
低通滤波器仅有助于插入比低通滤波器的脉冲响应长度长得多的信号。否则输出可以由滤波器瞬态控制。