C#windows窗体上做了一个按钮,调用matlab执行小波包分析功能的函数,按第一下时正常,从第二下以后就会发出一声提示音,貌似缺少文件。请各位高手们指点迷津。matlab源代码如下:%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%小波包变换示范程序%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function xbotezheng(inputfilename,resultfilename);%inputfilename='7.wav'%resultfilename='result.txt'%clear all %clc%%%%%%%首先,把一个信号读入Matlab%%%%%%%% s0=wavread(inputfilename);%%%%%“wavread”是一个Matlab的函数,他的目的是把声音文件1_1.wav读入Matlab,储存在s0这个数组中。 %%%%%%%接着,取s0数组的前8000点,放在另一个数组s中。 for i=1:4800 s(i)=s0(i); end %%%%%%%然后,对s数组进行小波包的变换%%%%%%%% T=wpdec(s,3,'db2','shannon');%%%%%“wpdec”也是一个Matlab的函数,他的作用是对信号(也可以称为数组)s做3阶的小波包分析,他的用法 %%%%%如下:小波包树形对象=wpdec(信号数组,小波包分析的阶数,‘小波名称’,‘熵的名称’)。 %%%%%这个函数的输出是小波包树形对象(就是程序中的T),他是一个很复杂的东西,小波包变换 %%%%%的所有信息都在他的里面,做小波包分析的逆变换就是基于对小波包树形对象处理得到的。 %%%%%%这样我们就完成了一个信号的小波包变换% %%%%%%下面,我们要对小波包变换之后的小波包树形对象做"逆变换",恢复出原始的信号%%%%%%% s130=wprcoef(T,[3,0]);%%%%%“wprcoef”是一个Matlab的函数,他的作用是根据小波包树形对象,来分支重构原始信号,3阶的小波包变换就会产生2的3次方个 %%%%%支路信号,把所有的这些支路信号相加才能得到总的信号 s131=wprcoef(T,[3,1]); s132=wprcoef(T,[3,2]); s133=wprcoef(T,[3,3]); s134=wprcoef(T,[3,4]); s135=wprcoef(T,[3,5]); s136=wprcoef(T,[3,6]); s137=wprcoef(T,[3,7]); %%%%%%%注意,这就是小波包分析的有用之处,他可以把一个信号无损地分成不同的几个信号,这几个信号s130,s131,s132,s133,s134,s135,s136,s137, %%%%%%%分别反映了原始信号在8个互相不重叠的频率段上的信息,小波包分析来识别不同信号就是根据小波包的这个属性。 %%%%%%%最后,寻找区分不同信号的特征量,小波包分解的方法是把小波包重构后得到的几个支路信号计算能量,得到8个能量值,再把这些能量值归一化, %%%%%%%得到的8个归一化能量值作为识别不同信号的特征量。 E130=sum(abs(s130).^2);%%%%%“sum”是求和的函数,“abs”是取绝对值,这条命令就是计算支路信号s130的能量的 E131=sum(abs(s131).^2); E132=sum(abs(s132).^2); E133=sum(abs(s133).^2); E134=sum(abs(s134).^2); E135=sum(abs(s135).^2); E136=sum(abs(s136).^2); E137=sum(abs(s137).^2); E1=[E130 E131 E132 E133 E134 E135 E136 E137 ];%%%%%这几个支路信号的能量形成一个数组E1 E=(abs(E130).^2+abs(E131).^2+abs(E132).^2+abs(E133).^2+abs(E134).^2+abs(E135).^2+abs(E136).^2+abs(E137).^2).^0.5;%%%%%归一话 Result=E1/E;%%%%%Result就是我们要的特征量的数组,到此收工! save (resultfilename, 'Result', '-ascii') inputfilename表示输入的wav文件名,resultfilename表示输入的文本文件名提示音表示缺少什么文件吧,