Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 工程数学软件 > MATLAB论坛
MATLAB论坛 一切MATLAB相关问题在此讨论。
回复
 
主题工具 显示模式
旧 2008-07-11, 23:41   #1
幼之梨
初级会员
 
注册日期: 2008-07-11
年龄: 39
帖子: 2
声望力: 0
幼之梨 正向着好的方向发展
默认 [求助]这是怎么问题

Wp=30;Ws=50;Rp=1;As=30;
Ripple=10^(-Rp/20);
Attn=10^(-As/20);
[b,a]=afd_butt(Wp,Ws,Rp,As)
[C,B,A]=sdir2cas(b,a)
[db,mag,pha,w]=freqs_m(b,a,50);
[ha,x,t]=impulse(b,a);
figure(1);clf;
subplot(2,2,1);plot(w,mag);title('Magnitude Response');
xlabel('Analog frequency in rad/s');
ylabel('H');
%
axis([0,50,0,1.1])
set(gca,'Xtickmode','manual','Xtick',[0,30,40,50]);
set(gca,'Ytickmode','manual','Ytick',[0,Attn,Ripple,1]);
grid
subplot(2,2,2);plot(w,db);title('Magnitude in dB');
xlabel('Analog frequency in rad/s');
ylabel('decibels');
%
axis([0,50,-40,5])
set(gca,'Xtickmode','manual','Xtick',[0,30,40,50]);
set(gca,'Ytickmode','manual','Ytick',[-40,-As,-Rp,0]);
grid
subplot(2,2,3);plot(w,pha/pi);title('Phase Response');
xlabel('Analog frequency in rad/s');
ylabel('radians');
%
axis([0,50,-1.1,1.1])
set(gca,'Xtickmode','manual','Xtick',[0,30,40,50]);
set(gca,'Ytickmode','manual','Ytick',[-1,-0.5,0,0.5,1]);
grid
subplot(2,2,4);plot(t,ha);title('Impulse Response');
xlabel('time in seconds');
ylabel('ha(t)');
axis([0,max(t)+0.05,min(ha),max(ha)+0.025]);
set(gca,'Xtickmode','manual','Xtick',[0,0.1,max(t)]);
set(gca,'Ytickmode','manual','Ytick',[0,0.1,max(ha)]);
grid
%巴特沃兹模拟滤波器的设计程序
function[b,a]=afd_butt(Wp,Ws,Rp,As);
if Wp<=0
error('Passband edge must be larger than 0')
end
if Ws<=Wp
error('Stopband edge must be larger than Passed edge')
end
if(Rp<=0)|(As<0)
error('PB ripple and /Or SB attenuation must be larger than 0')
end
N=ceil((log10((10^(Rp/10)-1)/(10^(As/10)-1)))/(2*log10(Wp/Ws)));
OmegaC=Wp/((10^(Rp/10)-1)^(1/(2*N)));
[b,a]=u_buttap(N,OmegaC);
%设计非归一化巴特沃兹模拟低通滤波器原型子程序
function [b,a]=u_buttap(N,OmegaC);
[z,p,k]=buttap(N);
p=p*OmegaC;
k=k*OmegaC^N;
B=real(poly(z));
b0=k;
b=k*B;
a=real(poly(z));
%计算系统函数的幅度响应和相位响应子程序
function [db,mag,pha,w]=freqs_m(b,a,wmax);
w=[0:1:500]*wmax/500;
H=freqs(b,a,w);
mag=abs(H);
db=20*log10((mag+eps)/max(mag));
pha=angle(H);
%直接形式转换成级联形式子程序
function [C,B,A]=sdir2cas(b,a);
Na=length(a)-1;Nb=length(b)-1;
b0=b(1);b=b/b0;
a0=a(1);a=a/a0;
C=b0/a0;
p=cplxpair(roots(a));K=floor(Na/2);
if K*2==Na
a=zeros(K,3);
for n=1:2:Na
Arow=p(n:1:n+1,;Arow=poly(Arow);
A(fix((n+1)/2),=real(Arow);
end
elseif Na==1
A=[0 real(poly(p))];
else
A=zeros(K+1,3);
for n=1:2:2*K
Arow=p(n:1:n+1,;Arow=poly(Arow);
A(fix((n+1)/2),=real(Arow);
end
A(K+1,=[0 real(poly(p(Na)))];
end
z=cplxpair(roots(b));K=floor(Nb/2);
if Nb==0
B=[0 0 poly(z)];
elseif K*2==Nb
B=zeros(K,3);
for n=1:2:Nb
Brow=z(n:1:n+1,;Brow=poly(Brow);
B(fix((n+1)/2),=real(Brow);
end
elseif Nb==1
B=[0 real(poly(z))];
else
B=zeros(K+1,3);
for n=1:2:2*K
Brow=z(n:1:n+1,;Brow=poly(Brow);
B(fix((n+1)/2),=real(Brow);
end
B(K+1,=[0 real(poly(z(Nb)))];
end

这是一个巴特沃兹滤波器的设计,执行后出现??? One or more output arguments not assigned during call to 'sdir2cas'.
请教高手这是什么问题呢?怎么解决?谢谢!!!!
幼之梨 当前离线   回复时引用此帖
旧 2008-07-14, 10:48   #2
remnant
普通会员
 
注册日期: 2008-04-12
年龄: 46
帖子: 67
声望力: 19
remnant 正向着好的方向发展
默认

进入到sdir2cas的a,b都是double类型的数,而非数组
Na=length(a)-1;Nb=length(b)-1;
那么Na=0,Nb=0;
而K=floor( Na/2 ),说明K=0,
那下面求A的if控制流必然走入
a=zeros(K,3);
for n=1:2:Na
Arow=p(n:1:n+1,;Arow=poly(Arow);
A(fix((n+1)/2),=real(Arow);
end
这里我不明白你为什么定义了个a=zeros(K,3),由于K=0, a必然为empty,而且这个a在后面根本没有用到过,猜想也许是A.
你的for n=1:2:Na由于Na=0该循环一次也不会执行,A必然为Empty,不会有值.
下面求B的过程,由于Nb=0,首先你的if ... elseif ... else ... end
根本就不是互斥的分支语句.控制流会按照优先级来走,只会走入
if Nb==0这一分支,所以,B也是有问题的.
因此,你的Error信息提示在sdir2cas中有1个或更多输出参数未被赋值,这里指的就是A了.
你的B得到了个值算是个运行异常,能出结果但不一定正确.
remnant 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码


相似的主题
主题 主题作者 版面 回复 最后发表
求助:双大括号与单大括号的区别! wupeng0618 MATLAB论坛 1 2008-07-14 19:31
[求助]想利用matcom在VC.net中绘制静态三维曲线的疑问 lmmf MATLAB论坛 0 2008-05-14 15:42
[求助]求取样调函数基准点曲率问题 payson MATLAB论坛 0 2008-05-01 08:24
【求助】如何用MATLAB读出图片信息? flp5521 MATLAB论坛 4 2008-04-03 10:29
【求助】急!求助 riderwei MATLAB论坛 1 2007-05-29 18:43


所有时间均为北京时间。现在的时间是 14:22


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.