无法在matlab中获得过滤后的带通信号

Unable to get filtered bandpass signal in matlab

我正在尝试使用 15hz(bandpass filter) 分量提取信号但没有得到 answer.However 我可以得到 10hz(lowpass filter).

我有3个信号,分别是三个不同的频率10 15 and 30hz

我将它们设计如下:

x=0:1/fs:1;
f1=10;
f2=15;
f3=30;
s1=sin(2*pi*f1*x);
s2=sin(2*pi*f2*x);
s3=sin(2*pi*f3*x);

现在我已经添加了所有的...

s=s1+s2+s3;

我得到了正确的傅里叶变换:

Butter 命令在这里不起作用

这是我试过的:

[b,a]=butter(10,[12 18]/500); % 500 is fs/2
filtered=filter(b,a,s);

我得到以下过滤条件:

它的傅立叶变换是这样的:

我什至无法猜到为什么我会在 0

达到峰值

如果是低通,我会得到完美的输出:

[b,a]=butter(10,10/500);
filtered=filter(b,a,s);

这背后的原因是什么?请告诉我是否有另一种方法可以解决这个问题..谢谢:)

编辑:

这是完整的代码:

clc;
close all;
fs=1000;
x=0:1/fs:1;
f1=10;
f2=15;
f3=30;
s1=sin(2*pi*f1*x);
s2=sin(2*pi*f2*x);
s3=sin(2*pi*f3*x);
s=s1+s2+s3;
figure
x_axis=linspace(-fs/2,fs/2,numel(x));
plot(s)
fourier=fft(s);
answer=fftshift(fourier);
plot(x_axis,abs(answer));
figure
[b,a]=butter(10,10/500);
filtered=filter(b,a,s);
plot(filtered);
figure
plot(x_axis,abs(fftshift(fft(filtered))));

第十 订单巴特沃斯在这里(一般而言)太大了。如果您查看滤波器系数 b,您会发现它们处于机器精度的顺序(即 ~1e-16)。从二阶或三阶巴特沃斯滤波器开始!查看 butter(2, 10/500) 是否提供足够的衰减,然后 小心地 从那里增加滤波器阶数。