【问题标题】:Unable to get filtered bandpass signal in matlab在matlab中无法获得滤波的带通信号
【发布时间】:2023-03-12 15:03:01
【问题描述】:

我正在尝试使用15hz(bandpass filter) 组件提取信号但没有得到答案。但是我可以得到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))));

【问题讨论】:

  • 展示你如何做每一件事,包括情节
  • 好的,请稍等。我会编辑答案
  • @AnderBiguri 我已经发布了整个代码

标签: matlab filter fft lowpass-filter bandpass-filter


【解决方案1】:

10 次 阶的巴特沃斯在这里(和一般情况下)太大了。如果您查看滤波器系数b,您会发现它们处于机器精度级别(即~1e-16)。从二阶或三阶巴特沃斯滤波器开始!看看butter(2, 10/500) 是否提供了足够的衰减并小心从那里增加过滤器阶数。

【讨论】:

    猜你喜欢
    • 2011-10-26
    • 2012-09-22
    • 1970-01-01
    • 2013-10-09
    • 2020-11-28
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多