vc 6.0与matlab,MATLAB2010与VC++6.0混合编程详解

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

}

程序运行如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值