s_yjxu 发表于 2008-4-27 22:36:09

用matlab与labview混编设置一个高通滤波器调用出问题

matlab可以 完好执行,    但是在lavview里面 运行老是在close activX那里出错,望达人帮忙, 谢谢


matlab代码如下:

function butterwasD_H
fp=300;
fs=400;
rs=40;
rp=0.5;
Fs=1000;
=butterD(fp,fs,rp,rs,Fs);
plot(W*Fs/(2*pi),abs(H));
grid



function =butterD(fp,fs,rp,rs,Fs);
wp=2*fp*pi;
ws=2*pi*fs;
=buttord(wp,ws,rp,rs,'s');    %选择滤波器阶数
=buttap(N);
=zp2ss(z,p,k);
=lp2hp(A,B,C,D,Wn);    %实现低通到高通的转换
=ss2tf(At,Bt,Ct,Dt);
=bilinear(num1,den1,Fs);
=freqz(num,den);

[ 本帖最后由 s_yjxu 于 2008-4-27 22:45 编辑 ]

s_yjxu 发表于 2008-4-28 13:54:20

高手不要吝启金口啊 呵呵 ^_^

s_yjxu 发表于 2008-4-28 19:01:33

等高手来解答 ^_^

wdyjz 发表于 2008-4-28 20:17:56

从外形上看,没有问题。那么问题就是:COM组件打包的时候没有做好,第二个原因,注册控件有问题。第三,matlab版本不太好用,建议用matlab2006a及其以后的最新版本。

s_yjxu 发表于 2008-4-28 21:50:47

风定云远原来你的qq就是787053185阿^_^

后2个问题基本没有, 注册成功, 用的是matlab2008的.。   那么第一个问题 怎么判断COM组件有没有打包好呢(用了你的那份技术,貌似打包的时候都是成功的哩^_^)

s_yjxu 发表于 2008-4-29 11:41:12

麻烦高手调试下   万分感谢!

s_yjxu 发表于 2008-4-29 22:27:10

:L   ············· :L             ···········:L

wdyjz 发表于 2008-5-2 19:56:29

matlab程序你记得下面的原则才可以做COM:
1、写成多个函数,m文件;不要把子程序放在一个m文件内;
2、函数没有声明正确 ,应该将后面需要输出的数据作为定义,比如=function(a,b);如果没有输出,内部画图的话,则只需声明函数头即可;
3、不能将m文件的设置参数选择放在m程序内。

wdyjz 发表于 2008-5-2 19:59:42

算了,我自己去测试下吧,给你说的功夫让你思考,不知道什么时间可以出结果。你先等等。

wdyjz 发表于 2008-5-2 20:25:03

matlab 数字滤波器设计 简单示例
   频率滤波器大概分为带通、带阻、高通、低通。特性不同的模拟滤波器中经典滤波器有Butterworth 和 Chebyshev 。其中,Butterworth 滤波器特点是通带处幅值特性平坦,而 Chebyshev 滤波器则比前者的截至特性要好,但通带处的幅值有振荡。前面提到,对于数字滤波器而言,可以采用不同阶数逼近相应滤波器,滤波器性能还与滤波器的阶数有关,一般而言,阶数越高,则逼近越精确,但计算代价也随之上升,所以性能与代价总需要寻求一个平衡点。对性能要求一定的情况下,如果对频率截至特性没有特殊要求,考虑采用Butterworth IIR滤波器。因为 Chebeshev 滤波器的波纹可能大多数情况下不能忍受。
      Matlab 内建有设计Filter 的函数。例如 Butter,其语法格式为:

       = butter(N,Wn,S)
其中
      N为要求设计的滤波器阶数
      S为字符串,表明设计的滤波器类型,low低通/high高通/stop带阻
      Wn 为要求的标准化截至频率,单位为rad/sample,如果是带阻滤波器,则Wn为长度为2的向量。关于标准化的频率计算为:设要求的频率为f(Hz),采样率为Fs(Hz),则Wn = (2*pi*f/Fs)/pi = 2*f/Fs,所以,标准化截至频率在区间内。
      

一、巴特沃斯IIR滤波器的设计

在MATLAB下,设计巴特沃斯IIR滤波器可使用butter函数。

Butter函数可设计低通、高通、带通和带阻的数字和模拟IIR滤波器,其特性为使通带内的幅度响应最大限度地平坦,但同时损失截止频率处的下降斜度。在期望通带平滑的情况下,可使用butter函数。

butter函数的用法为:

=butter(n,Wn,/ftype/)
http://vfeng0123.spaces.live.com/
其中n代表滤波器阶数,Wn代表滤波器的截止频率,这两个参数可使用buttord函数来确定。buttord函数可在给定滤波器性能的情况下,求出巴特沃斯滤波器的最小阶数n,同时给出对应的截止频率Wn。buttord函数的用法为:

= buttord(Wp,Ws,Rp,Rs)

其中Wp和Ws分别是通带和阻带的拐角频率(截止频率),其取值范围为0至1之间。当其值为1时代表采样频率的一半。Rp和Rs分别是通带和阻带区的波纹系数。

不同类型(高通、低通、带通和带阻)滤波器对应的Wp和Ws值遵循以下规则:

1.高通滤波器:Wp和Ws为一元矢量且Wp>Ws;

2.低通滤波器:Wp和Ws为一元矢量且Wp<Ws;

3.带通滤波器:Wp和Ws为二元矢量且Wp<Ws,如Wp=,Ws=;

4.带阻滤波器:Wp和Ws为二元矢量且Wp>Ws,如Wp=,Ws=。

二、契比雪夫I型IIR滤波器的设计

在期望通带下降斜率大的场合,应使用椭圆滤波器或契比雪夫滤波器。在MATLAB下可使用cheby1函数设计出契比雪夫I型IIR滤波器。

cheby1函数可设计低通、高通、带通和带阻契比雪夫I型滤IIR波器,其通带内为等波纹,阻带内为单调。契比雪夫I型的下降斜度比II型大,但其代价是通带内波纹较大。

cheby1函数的用法为:

=cheby1(n,Rp,Wn,/ftype/)

在使用cheby1函数设计IIR滤波器之前,可使用cheblord函数求出滤波器阶数n和截止频率Wn。cheblord函数可在给定滤波器性能的情况下,选择契比雪夫I型滤波器的最小阶和截止频率Wn。

cheblord函数的用法为:

=cheblord(Wp,Ws,Rp,Rs)

其中Wp和Ws分别是通带和阻带的拐角频率(截止频率),其取值范围为0至1之间。当其值为1时代表采样频率的一半。Rp和Rs分别是通带和阻带区的波纹系数。
14:13 | 添加评论 | 发送消息 | 固定链接 | 查看引用通告 (0) | 写入日志Matlab内建滤波器函数filter
Matlab里已经内建了滤波器函数filter,其语法格式为:
      Y = filter(B,A,X)
其中
      B/A 提供滤波器系数,B为分子, A为分母

      X为滤波前序列,

      Y为滤波结果序列。
14:06 | 添加评论 | 阅读评论 (2) | 发送消息 | 固定链接 | 查看引用通告 (0) | 写入日志Matlab 提供的滤波器分析函数freqz
可以使用Matlab 提供的内建函数freqz,可以求得滤波器系统的频率相应特性。其使用语法格式为:
       = freqz(B,A,N,Fs)
其中
      B/A 提供滤波器系数 B为分子 A为分母    (b0 + b1Z^-1 +....)/(a0 + a1Z^-1 +....)
      N   表示选取单位圆的上半圆等间距的N个点作为频响输出;
      Fs为采样频率,该参数可以省略
      H   为N个点处的频率响应复值输出向量,其模即为频响幅值曲线幅值20log10(abs(H))DB,其幅角angle(H)即为频响相位曲线相位值。
      F   为与第N点处对应的频率值f(Hz),如果Fs 参数省略时,则频率值w为rad/sample,w = 2*pi*f/Fs

wdyjz 发表于 2008-5-2 21:14:07

用matlab 和matlab script跑了下你的程序。判断如下:
1、你的程序有问题,数据类型的转换上考虑下;
2、用COM组件前先用 matlab调试好 ,再用script跑下程序验证下,最后才做COM组件调用。因为COM的目的是为了实现脱离matlab环境,为了应用。script是为了调试的编辑情况。

wdyjz 发表于 2008-5-2 21:16:55

这个原则已经说的很明白了,我所发的资料包内容已经很清晰、详细,自己好好研究吧,我是不会给你再做一个现成的。给你提供一个方法和例子已经足够了。

s_yjxu 发表于 2008-5-3 22:30:37

这两天不在 原来师兄给我了 这么多建议哈谢谢^_^谢谢第二个建议非常的棒, 我试下先

原帖由 wdyjz 于 2008-5-2 21:14 发表 http://www.cpubbs.com/bbs/images/common/back.gif
用matlab 和matlab script跑了下你的程序。判断如下:
1、你的程序有问题,数据类型的转换上考虑下;
2、用COM组件前先用 matlab调试好 ,再用script跑下程序验证下,最后才做COM组件调用。因为COM的目的是为了实现 ...
页: [1]
查看完整版本: 用matlab与labview混编设置一个高通滤波器调用出问题