作业帮 > 综合 > 作业

为什么这个用matlab设计的高通滤波器设计出来了,滤波结果却是错的?

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/10 23:56:37
为什么这个用matlab设计的高通滤波器设计出来了,滤波结果却是错的?
这是我写的代码,我发现运行后前面4个图是正确的,后面两个图就不是我预想中的那样的,
wp=2*pi/3;
ws=pi/4;
ap=3;
as=80;
M=256;
fs=1;
n=0:1/fs:M-1;
t=n*fs;
w=linspace(0,2*pi,1024);
w1=2*pi/M*n;
[N,wc]=buttord(wp,ws,ap,as,'s')
[B,A]=butter(N,wc,'high','s')%B为分子
Hf=freqs(B,A,w);
subplot(3,2,1);
plot(w(1:512)/pi,abs(Hf(1:512)));
xlabel('频率w/2*pi');
ylabel('|H(e^jw)|');
title('高通滤波器的频幅特性');
subplot(3,2,2);
plot(w(1:512)/pi,angle(Hf(1:512)));
xlabel('频率w/pi');
ylabel('相位');
title('高通滤波器的相频特性');
xn=1+cos(pi*n/4)+cos(2*pi*n/3);
subplot(3,2,3);
stem(n,xn,'.');
xlabel('时间n');
ylabel('x(n)');
title('序列x(n)');
X=fft(xn);
magX=abs(X);
subplot(3,2,4);
plot(w1/pi,magX/max(magX));
xlabel('频率w/pi');
ylabel('|X(e^jw)|');
title('序列x(n)的幅频特性');
x=1+cos(pi*n/4)+cos(2*pi*n/3);
y=filter(B,A,x);%B为分子,A为分母
Y=fft(y);
subplot(3,2,5);
stem(n,y,'.');
xlabel('序号n');
ylabel('y(n)');
title('滤波后的序列y(n)');
subplot(3,2,6);
plot(w1/pi,abs(Y)/max(abs(Y)));
xlabel('频率w/pi');
ylabel('|Y(e^jw)|');
title('序列y(n)的幅频特性');
你的buttord的输入参数搞错了.wp和ws是normalized之后的,取值范围只从0到1,1代表pi.
所以需要将代码改为
wp=2/3;
ws=1/4;
然后就好了
再问: 这个问题解决了,非常感谢你,但我还想问一下这个[N,wc]=buttord(wp,ws,ap,as,'s')后面那个's’什么情况下要,这个看书上讲的有点不懂
再答: finds the minimum order n and cutoff frequencies Wn for an analog Butterworth filter. 所以's'的意思是让butterworth滤波器的阶数尽可能小。 第一个图总感觉有问题,和后面的不协调。因为在matlab中毕竟用的是离散的数据,求频谱时会发生以2pi为周期的延拓,并且0到pi和pi到2pi之间是对称的,所以在butterworth滤波器的幅频响应那个画出0到pi之间的就好了,pi到2pi那段反倒不对了