想要实现的功能是打开windows的公用对话框选取wav文件,对这个文件分析。
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.ppclassCall 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 & "平均持续时间" & cend submatlab 的代码:
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);
困扰了好几天了,哪位大大能够指点一下呢,小弟不胜感激!