matlab部分在matlab上可以使用,但是用combuild生成com组件后,用VB调用就会直接卡死,不知道是什么原因。
vb调用matlab打开系统共用的对话框的时候程序假死!下面是代码
vb:
Private Sub Command1_Click()
Dim i As Integer
Dim a As String
Dim b As Integer
Dim c As String
Dim fso As New FileSystemObject
Dim t As TextStream
Set t = fso.OpenTextFile(App.Path & "\t.txt", ForReading)
Dim pi As pp.ppclass
Set pi = New pp.ppclass
Call pi.pipei
For i = 1 To 3
If i = 1 Then
a = t.ReadLine
ElseIf i = 2 Then
b = t.ReadLine
Else: c = t.ReadLine
End If
Next i
Text1.Text = "最大幅值" & a & vbCrLf & "次数" & b & vbCrLf & "平均持续时间" & c
end sub
matlab 的代码:
function pipei
%读取文件,转换矩阵
[fname, pathname]=...
uigetfile({'*.wav'},'filename');%读文件
str=[pathname fname];
% [w,SR] = wavread('F:\毕设\de\中年男人连续的咳嗽声.wav');
[w,SR]=wavread(str);
s1=w(:,1);
%滤波
f1=300;
f2=500;
Rp=0.1;
Rs=30;
fs=5000;
wp=[f1 f2]/fs*2;
ws=[f1-50 f2+50]/fs*2;%设置参数
[N,Wn]=cheb1ord(wp,ws,Rp,Rs);
[b,a]=cheby1(N,Rp,Wn);
[h,w]=freqz(b,a); %进行滤波
n=size(s1);
t=0:1/fs:n/fs-1/fs;
y=filter(b,a,s1);
%能量分析
N=2000; %一帧的点数
x=y;
frame=length(x)/N; %分析的帧数
ener=[];
for ii=1:frame
xn=x((ii-1)*N+1:ii*N);
en=sum(abs(xn));
ener=[ener en];%求和获得能量值
end
ener=ener/max(ener);%归一化
%匹配
amax=max(abs(s1));
flag=0;
times=0;%计次数
th=0.1; %能量门限 大于为咳嗽
thtime=0.03; %持续时间的门限
for ii=1:length(ener)
if ener(ii)>th
if flag==0
times=times+1;
flag=1;
end
else
if flag==1
flag=0;
end
end
end
x=find(abs(s1)>thtime);
timehold=length(x)/SR;
d=[amax,times,timehold/times];%最大幅值,次数,持续时间
fy=fopen('t.txt','wt');
fprintf(fy,'%f\n',d);
fclose(fy);
困扰了好几天了,哪位大大能够指点一下呢,小弟不胜感激!
4 个解决方案
#1
加doevents试试
#2
实在不行就加进度条
#3
加doevents试试
#4
恩我试试先
#1
加doevents试试
#2
实在不行就加进度条
#3
加doevents试试
#4
恩我试试先