找回密码
 注册
Simdroid-非首页
查看: 284|回复: 17

[已解决]用mcc指令翻译出来的代码在vc6中不能用(resample)

[复制链接]
发表于 2009-11-4 20:14:33 | 显示全部楼层 |阅读模式 来自 西安交通大学
本帖最后由 messenger 于 2010-1-5 22:06 编辑

数据重采样的函数resample是数据处理工具箱里的函数

6.5的库函数中没有,所以想用mcc指令将其翻译成cpp和h加入工程中来使用

我首先用mcc -t -L Cpp resample.m

因为该函数牵扯到调用其它函数,所以生成的代码包含好几个函数

但是除了resample有cpp和hpp文件以外,其他几个相关函数值生成了hpp文件

我将其包含到vc工程中,编译不通过

之后查了查mcc的帮助,将代码改为如下

mcc -T codegen -B sglcpp resample.m

生成的文件齐全,既有cpp也有hpp,包含到工程内编译通过

但是运行出错

我不知道是不是我的用法出了问题,希望各位大虾不吝赐教



如果需要我可以把工程传上来


-----问题解决方案--------------------------------------------------------------------------------------

问题最终解决了。最近一直忙,没时间发上来结果

在resample函数中有这样一行代码是问题的关键

  1. % ----  HERE'S THE CALL TO UPFIRDN  ----------------------------
  2. y = upfirdn(x,h,p,q);
复制代码
upfirdn函数没有对应的m文件,只有一个upfirdn.dll,也找不到头文件
所以导致了在VC中mcc翻译的resample函数无法正常被调用

解决方案,研究了软件重采样的原理后,发现upfirdn对应的功能就是
提高采样频率(upsample)->FIR滤波->消除滞后->降低采样频率(downsample)

写成代码就是
  1. y = UPSAMPLE(x,p);
  2. y = [y zeros(1,delay*q)];
  3. y = filter(h,1,y);
  4. y = DOWNSAMPLE(y,q);
复制代码
用这段代码替换掉upfirdn函数后在matlab中运行的结果完全一致,
用mcc翻译后在vc中也可以调用

至此,问题终于顺利解决

评分

1

查看全部评分

 楼主| 发表于 2009-11-4 20:16:56 | 显示全部楼层 来自 西安交通大学
Simdroid开发平台
调试了很久后发现运行到这句话后过不去了
查了查好像是贝塞尔函数,不是很懂
return mlfBesseli(NULL, prhs[0], prhs[1], prhs[2]);
回复 不支持

使用道具 举报

发表于 2009-11-4 23:25:54 | 显示全部楼层 来自 广西贵港
本帖最后由 shunfly 于 2009-11-4 23:33 编辑

1。发帖,尤其是混编贴,请看版面置顶的FAQ关于如何提问。谢谢
2。VC编译不通过,出错信息是什么。运行出错,信息是什么?
3。Besseli不可能有问题,很成熟的简单的函数,FORTRAN POWAR STATION中就有大批的源代码。很多数值程序书上都有源代码
4。关于你提到的编译语句的问题,其实区别不大。有CPP,HPP,你直接全部包含入VC即可。

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-5 10:38:01 | 显示全部楼层 来自 西安交通大学
谢谢楼上的

我后来又做了点小实验,编写了一个调用besseli函数的自定义函数

代码如下
function testbesseli
z=(0:.2:1)'
x=besseli(1,z)
c=input('请输入')%%使控制台停止

在matlab中运行没有问题得到正常结果

但是使用mcc -T codegen -B sglcpp testbesseli.m生成的可执行文件无法运行

然后又查了查c++库函数的手册,发现里边没有besseli函数

但是我昨天调试的时候头文件里却有,我很是纳闷。

C++函数库用户手册上说无法调用toolbox和simuilink的函数,不知道是不是这个原因
回复 不支持

使用道具 举报

发表于 2009-11-5 13:44:20 | 显示全部楼层 来自 广西贵港
抱歉,我这里可以运行。
MATLAB6.5,winXP
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-6 08:31:36 | 显示全部楼层 来自 西安交通大学
啊~!我晕

那您给分析分析可能是哪里出问题了

我也是xp sp3 + matlab6.5 + vc6啊
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-6 09:30:24 | 显示全部楼层 来自 西安交通大学
终于找到原因了,原来是我没有把mglinstaller.exe释放出来的toolbox文件夹放入dll库中

谢谢shunfly了

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-6 14:52:02 | 显示全部楼层 来自 西安交通大学
继续郁闷,resample还是不能用

function ceshi
data=sin(0:.5:10);
x=resample(data,15,1);
subplot(211)
plot(data)
subplot(212)
plot(x)

这段代码用mcc直接生成可执行程序是可以用的,但是我把源文件加到vc的工程里编译通过,生成出来的可执行文件一运行就报错,runtime error

我怀疑是我的方法有问题啊,有没有达人指导一下啊
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-6 14:58:16 | 显示全部楼层 来自 西安交通大学
这次是坏到upfirdn这个函数了,郁闷啊
回复 不支持

使用道具 举报

发表于 2009-11-6 21:45:04 | 显示全部楼层 来自 广西贵港
贴你的出错的VC工程文件出来
这样一来二去在论坛发帖真是浪费时间
比如7#错误原因,很早以前就说过把mglinstaller.exe释放出来的所有的DLL放在一个文件夹中。
出现这种不该有的错误,在论坛上,神也帮助不了你
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-8 20:52:46 | 显示全部楼层 来自 西安交通大学


工程在附件中

我想在ctestpage类中的onbutton1响应函数添加代码

实现matlab中的resample指令

一直无法实现

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2009-11-9 00:30:20 | 显示全部楼层 来自 广西贵港
确实有点小问题,改天帮你瞧瞧。
PS:楼主用的我很久以前写了MatGraph绘图类,呵呵
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-9 08:57:22 | 显示全部楼层 来自 西安交通大学
是啊,我就是在这里学习起家的,呵呵

现在已经开始混编写一些工程了

感谢shunfly 啊,呵呵

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2009-11-10 21:34:30 | 显示全部楼层 来自 广西贵港
初步查了下,感觉是

  1. *h
  2.               = times(
  3.                   mwVa(p, "p")
  4.                   * Nfirls(
  5.                       1,
  6.                       NULL,
  7.                       mwVv(L, "L") - _mxarray8_,
  8.                       horzcat(
  9.                         mwVarargin(
  10.                           _mxarray2_,
  11.                           _mxarray10_ * mwVv(fc, "fc"),
  12.                           _mxarray10_ * mwVv(fc, "fc"),
  13.                           _mxarray8_)),
  14.                       _mxarray11_),
  15.                   ctranspose(kaiser(mwVv(L, "L"), mwVa(beta, "beta"))));
复制代码
出了问题
楼主自己M函数写个kaiser和ctranspose函数利用,编译看看
回复 不支持

使用道具 举报

发表于 2009-11-10 21:53:12 | 显示全部楼层 来自 广西贵港
本帖最后由 shunfly 于 2009-11-10 22:01 编辑

ctranspose函数也有问题
http://www.codeproject.com/KB/cpp/matlab_c_api.aspx?msg=747778
回复 不支持

使用道具 举报

 楼主| 发表于 2009-11-11 16:25:48 | 显示全部楼层 来自 西安交通大学
谢了啊,我在研究研究,有结果了再放上来
回复 不支持

使用道具 举报

 楼主| 发表于 2010-1-5 20:20:25 | 显示全部楼层 来自 陕西西安
问题最终解决了。最近一直忙,没时间发上来结果

在resample函数中有这样一行代码是问题的关键

  1. % ----  HERE'S THE CALL TO UPFIRDN  ----------------------------
  2. y = upfirdn(x,h,p,q);
复制代码

upfirdn函数没有对应的m文件,只有一个upfirdn.dll,也找不到头文件
所以导致了在VC中mcc翻译的resample函数无法正常被调用

解决方案,研究了软件重采样的原理后,发现upfirdn对应的功能就是
提高采样频率(upsample)->FIR滤波->消除滞后->降低采样频率(downsample)

写成代码就是
  1. y = UPSAMPLE(x,p);
  2. y = [y zeros(1,delay*q)];
  3. y = filter(h,1,y);
  4. y = DOWNSAMPLE(y,q);
复制代码


用这段代码替换掉upfirdn函数后在matlab中运行的结果完全一致,
用mcc翻译后在vc中也可以调用

至此,问题终于顺利解决
回复 不支持

使用道具 举报

发表于 2010-1-5 21:29:38 | 显示全部楼层 来自 广西桂林
解决方案很简单容易
难的是找到问题根源所在
赞楼主一个
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-23 16:21 , Processed in 0.066099 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表