matlab如何进行低通滤波?

matlab如何进行低通滤波?,第1张

楼主你好

滤波要先设计滤波器,b,a代表滤波器设计的参数。一般可以使用巴特沃斯滤波器。

例如低通滤波器的设计代码为:

data = importdata('t2txt');

Time = data(:,1);

SA = data(:,2);

dtt=diff(Time);

dt=sum(dtt)/length(dtt);

Fs=round(1/dt);%采样频率

Wp = 5/(Fs/2); %通带截止频率,这个自定大致定义

Ws = 10/(Fs/2);%阻带截止频率,这个自定大致定义

Rp = 2; %通带内的衰减不超过Rp,这个自定大致定义

Rs = 40;%阻带内的衰减不小于Rs,这个自定大致定义

[n,Wn] = buttord(Wp,Ws,Rp,Rs);%巴特沃斯数字滤波器最小阶数选择函数

[b,a] = butter(n,Wn);%巴特沃斯数字滤波器

[h,w]=freqz(b,a,512,Fs); %计算滤波器的频率响应

plot(w,abs(h))%,'LineWidth',1绘制滤波器的幅频响应图

%

%对输入的信号进行滤波

RollAf=filtfilt(b,a,RollA);%filtfilt这个函数是0相位滤波,没有偏移。filter有偏移。

%% 滤波结果绘图

figure

subplot(2,2,1)

H=plot(Time,RollA,Time,RollAf,'r--');%,'linewidth',3

set(H(2),'linewidth',2)

其中;Wp,Ws是一元向量时,则设计的是低通或高通滤波器,若Wp,Ws是二元向量,则设计带通或带阻滤波器。

可以使用fft函数。

希望对你有帮助,

conv 是卷积,比如说conv(a,b)就是说 a卷积b;

filter是设计滤波器的一种函数,y=filter(b,a,x)表示的是

y(n) = b(1)x(n) + b(2)x(n-1) + + b(nb+1)x(n-nb)

- a(2)y(n-1) - - a(na+1)y(n-na)

filter2函数

功能:计算二维线型数字滤波,它与函数

fspecial

连用

格式:Y=filter2(B,X)

Y=filter2(B,X,'shape')

说明:对于

Y=filter2(B,X)

,filter2

使用矩阵

B

中的二维

FIR

滤波器对数据

X

进行滤波,结果

Y

是通过二维互相关计算出来的,其大小与

X

一样;对于

Y=filter2(B,X,'shape')

,filter2

返回的

Y

是通过二维互相关计算出来的,其大小由参数

shape

确定,其取值如下:

》full

返回二维相关的全部结果,size(Y)>size(X);

》same

返回二维互相关结果的中间部分,Y

X

大小相同;

》valid

返回在二维互相关过程中,未使用边缘补

0

部分进行计算的结果部分,有

size(Y)<size(X)

里面根本就没有filter,不过呢,你这个程序中好几个画图都有问题,改为

plot(xc(1:(length(xc)-1)/10),F(1:(length(F)-1)/10));

filter2函数

功能:计算二维线型数字滤波,它与函数 fspecial 连用

格式:Y=filter2(B,X)

Y=filter2(B,X,'shape')

说明:对于 Y=filter2(B,X) ,filter2 使用矩阵 B 中的二维 FIR 滤波器对数据 X 进行滤波,结果 Y 是通过二维互相关计算出来的,其大小与 X 一样;对于 Y=filter2(B,X,'shape') ,filter2 返回的 Y 是通过二维互相关计算出来的,其大小由参数 shape 确定,其取值如下:

》full 返回二维相关的全部结果,size(Y)>size(X);

》same 返回二维互相关结果的中间部分,Y 与 X 大小相同;

》valid 返回在二维互相关过程中,未使用边缘补 0 部分进行计算的结果部分,有 size(Y)<size(X) 。

题主所说的卷积函数应该是conv:运算后的数据长度为length(x)+length(h)-1

如果你选用filter函数的话,它是一个滤波器性质的函数,输出长度与信号输入长度相同。

b=1

a=[1 -09 05]

x=[zeros(1,10),1,zeros(1,50)];

y=filter(b,a,x);

n=[-10:50];

stem(n,y)

稳定

在MATLAB中,可以用函数y=filter(p,d,x)实现差分方程的仿真,也可以用函数 y=conv(x,h)计算卷积,用y=impz(p,d,N)求系统的冲激响应。

实现差分方程

先从简单的说起:

filter([1,2],1,[1,2,3,4,5])

实现 y[k]=x[k]+2x[k-1]

y[1]=x[1]+20=1%(x[1]之前状态都用0)

y[2]=x[2]+2x[1]=2+21=4

a 下面程序是用来实现h和x的卷积得,分别用了filter和conv函数,两者函数得出的结果一样。

h = [3 2 1 -2 1 0 -4 0 3]; % impulse response

x = [1 -2 3 -4 3 2 1]; % input sequence

y = conv(h,x);

n = 0:14;

subplot(2,1,1);

stem(n,y);

xlabel('Time index n'); ylabel('Amplitude');

title('Output Obtained by Convolution'); grid;

x1 = [x zeros(1,8)];

y1 = filter(h,1,x1);

subplot(2,1,2);

stem(n,y1);

xlabel('Time index n'); ylabel('Amplitude');

title('Output Generated by Filtering'); grid;

要实现下式的冲击响应和阶跃响应,可以分别采用三种方法。

y[n]+075y[n-1]+0125y[n-2]=x[n]-x[n-1]。

b 单位冲激响应:

(1)用filter函数

a1=[1,075,0125];

b1=[1,-1];

n=0:20;

x1=[1 zeros(1,20)];

y1filter=filter(b1,a1,x1);

stem(n,y1filter);

title('y1filter');

xlabel('x');

ylabel('y');

(2)用conv函数

a1=[1,075,0125];

b1=[1,-1];

x1=[1 zeros(1,10)];

[h]=impz(b1,a1,10);

y1conv=conv(h,x1);

n=0:19;

stem(n,y1conv,'filled')

(3)用impz函数

a1=[1,075,0125];

b1=[1,-1];

impz(b1,a1,21);

c 单位阶跃响应:

(1)用filter函数

a1=[1,075,0125];

b1=[1,-1];

n=0:20;

x2=ones(1,21);

y1filter=filter(b1,a1,x2);

stem(n,y1filter);

title('y1filter_step');

xlabel('x');

ylabel('y');

(2)用conv函数

a1=[1,075,0125];

b1=[1,-1];

x2=ones(1,21);

[h]=impz(b1,a1,20);

y1=conv(h,x2);

y1conv=y1(1:21); %为何y1conv要取y1中1:21的值,解释见

n1=0:20; %y2à单位阶跃响应à用conv函数中注释

stem(n1,y1conv,'filled');

title('y1conv');

xlabel('n');

ylabel('y1[n]');

(3)用impz函数

a=[1,075,0125];

b=1;

impz(b,a)

即y=filter(p,d,x)用来实现差分方程,d表示差分方程输出y的系数,p表示输入x的系数,而x表示输入序列。输出结果长度数等于x的长度。

而y=conv(x,h)是用来实现卷级的,对x序列和h序列进行卷积,输出的结果个数等于x的长度与h的长度之和减去1。

y=impz(p,d,N)是用来实现冲击响应的,d和p的定义见filter,N表示冲击响应输出的序列个数。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12155545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存