1:编写M文件如下
function fwav(wav,wav1)
[x,ft,bit]=wavread(wav);
n=length(x);
if mod(n,2)==0;n=n;else x(n)=[];n=n-1;end;
t=[0:n-1]/ft;
f=[0:n-1]*ft/n;
FF=fft(x);
hm=abs(FF);
[x1,ft1,bit1]=wavread(wav1);
n1=length(x1);
t1=[0:n1-1]/ft1;
f1=[0:n1-1]*ft/n1;
FF1=fft(x1);
hm1=abs(FF1);
subplot(2,2,1);
plot(t,x);
%axis([0 200 0 3]);
xlabel('时间(s)');
ylabel('幅度');
title('原始信号的时域波形');
subplot(2,2,2);
plot(f,hm,'-r');
%axis([0 50000 0 10000])
xlabel('频率(HZ)');
ylabel('幅度');
title('原始信号频域波形');
subplot(2,2,3);
plot(t1,x1);
%axis([0 200 0 3]);
xlabel('时间(s)');
ylabel('幅度');
title('麦克风信号的时域波形');
subplot(2,2,4);
plot(f1,hm1,'-r');
%axis([0 50000 0 10000])
xlabel('频率(HZ)');
ylabel('幅度');
title('麦克风信号频域波形');
2:在MATLAB命令行输入deploytool启动Deployment Project对话框,工程名为test1.prj ,在TARGET列表框中选择:Genneric COM Component 单击OK 就选定了COM组建编译
3:在Deployment Tool对话框 单击[Add Class]添加一个类 类名xing,单击[Add files] 添加一个 fwav.m文件单击Build编译COM组建,在单击package,编译生成test1_pkg,打包文件。
4:将test1_pkg,复制在C盘根目录下运行自动安装MCR,并注册动态连接库,
用VC++创建一个单文档,单击查看-建立类向导 单击ADD CLASS 选择From a type Library 选择C盘根目录下Ctest1_1_0.dll,
点击打开和确定,就会为工程自动添加一个类如如下
class Ixing : public COleDispatchDriver
{
public:
Ixing() {} // Calls COleDispatchDriver default constructor
Ixing(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
Ixing(const Ixing& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}
// Attributes
public:
// Operations
public:
LPDISPATCH GetMWFlags();
void SetMWFlags(LPDISPATCH newValue);
void fwav(const VARIANT& wav, const VARIANT& wav1);
void MCRWaitForFigures();
};
这个类Ixing就是MATLAB COM组件对应的xing类,为需要使用Ixing类的视类添加一个成员变量
public:
Ixing m_xing;
由于类Ixing的void fwav(const VARIANT& wav, const VARIANT& wav1);函数需要VARIANT类型变量,所以视类需要包含#include"COMDEF.H"
核心代码如下
void CMyView::OnFileOpen()
{
if(m_hWndMCIWnd==NULL)
{
m_hWndMCIWnd = MCIWndCreate(this->m_hWnd,::AfxGetApp()->m_hInstance,WS_CAPTION,NULL);
MCIWndNew(m_hWndMCIWnd,"waveaudio");
}
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY, "WAVEÎļþ(*.wav)|*.wav||");
if(dlg.DoModal() == IDOK)
{
CString strPathName = dlg.GetPathName();
sm=strPathName;
// MCIWndOpen(m_hWndMCIWnd, (LPCTSTR)strPathName, 0);
// MCIWndPlay(m_hWndMCIWnd);
MCIWndRecord(m_hWndMCIWnd);
PlaySound(strPathName,NULL,SND_SYNC |SND_FILENAME );
MCIWndStop(m_hWndMCIWnd);
}
else return;
// TODO: Add your command handler code here*/
CFileDialog dlg1(FALSE,NULL,NULL,OFN_ALLOWMULTISELECT,"wav File (*.wav)|*.wav");
UINT nRetVal = dlg1.DoModal();
if(nRetVal != IDOK)
{m_hWndMCIWnd=NULL;return;}
CString strPath = dlg1.GetPathName();
strPath += ".wav";
if(MCIWndCanSave(m_hWndMCIWnd))
{
WCHAR swFileName[MAX_PATH];
memset(swFileName, 0, MAX_PATH*sizeof(WCHAR));
LPCTSTR lpszFilePath = strPath.GetBuffer(0);
int nLength = MultiByteToWideChar(CP_ACP, 0, lpszFilePath, -1, NULL, 0);
MultiByteToWideChar(CP_ACP, 0, lpszFilePath, -1, swFileName, nLength);
MCIWndSave(m_hWndMCIWnd, (LPCTSTR)swFileName);
st=strPath;
m_hWndMCIWnd=NULL;
}
if(sm==""|st==""|sm==st)
{MessageBox("ÎļþÃû²»ÄÜÏàͬ£¬»òÎÞ¼ÒôÎļþ");return;}
_variant_t at,a1;static BOOL bi=FALSE,b2=FALSE;
at=sm;a1=st;
if(b2==FALSE|bi==FALSE)//用一个判断防止重复初始化OLE和创建COM接口
{
b2=AfxOleInit();//初始化OLE
bi=m_xing.CreateDispatch(_T("test1.xing"));//创建COM接口
}
// TODO: Add your command handler code here
m_xing.fwav(at,a1); //调用COM接口函数
// TODO: Add your command handler code here
}
void CMyView::OnFileSave()
{ if(m_hWndMCIWnd==NULL)
{
m_hWndMCIWnd = MCIWndCreate(this->m_hWnd,::AfxGetApp()->m_hInstance,WS_CAPTION,NULL);
MCIWndNew(m_hWndMCIWnd,"waveaudio");
}
if(MCIWndCanRecord(m_hWndMCIWnd))
{
MCIWndRecord(m_hWndMCIWnd);
//m_hWndMCIWnd=NULL;
}
else
{
AfxMessageBox("Æô¶¯Â¼Òô¹¦ÄÜʧ°Ü!");
}
// TODO: Add your command handler code here
}
void CMyView::OnFileSaveAs()
{ if(MCIWndCanPlay(m_hWndMCIWnd))
{
MCIWndPlay(m_hWndMCIWnd);
}
else
{
AfxMessageBox("Äú»¹Ã»Óдò¿ªÒª²¥·ÅµÄWAVEÎļþ");
}
// TODO: Add your command handler code here
}
int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
}
程序运行如下: