Matlab S变换编译
文章目录
1. ctf2st
ctf2st
是一个Matlab的GUI包,用于进行Stockwell 时频分析,也即S变换。其软件包的链接为 https://kurage.nimh.nih.gov/meglab/Meg/Ctf2st , 该网站上还能找到其他语言版本的S变换版本。
2. 安装
下载该软件包ctf2st.tgz
后,先用winrar
对该压缩包ctf2st.tgz
进行解压。解压之后,进入到st
目录下,会发现里面有fftw3.h
,st.c
,st_wrapper.c
,stest.m
等文件。其中stest.m
为测试代码,用于测试是否安装成功。看stest.m
中的代码可以发现里面调用了st
函数,而该目录下只有st
的c代码,而没有matlab代码,因此,需要用mex
对其编译,从而才能使用。而由于st.c
里使用了fftw这个傅里叶变换库,因此还首先需要安装FFTW3.
2.1 FFTW3的安装
2.1.1 下载FFTW3
fftw3在windows下有自己的预编译版本,见http://www.fftw.org/install/windows.html ,因此可以直接从该网站下载64位的版本fftw-3.3.5-dll64.zip
。然后对其解压。
2.1.2 编译成lib
之前已经在电脑上安装了Visual Studio 2019和Intel oneAPI, 这里需要打开Intel oneAPI command prompt for Intel 64 for Visual Studio 2019
, 然后在终端先cd到刚才解压的fftw-3.3.5-dll64
文件夹中。然后键入:
|
|
这一步可能报错,需要从系统中找到(比如可以用everything来搜索)mspdbcore.dll
, 然后将其拷贝到fftw-3.3.5-dll64
文件夹中,或者在Windows的系统环境变量中添加上mspdbcore.dll
的路径(这种方案我未验证)。即可解决该问题。成功运行的结果是
|
|
到此,fftw3的准备工作已经完成。然后将libfftw3-3.lib
, libfftw3-3.dll
文件拷贝到st
目录下。
2.2 mex设置
mex的设置先需要匹配matlab的版本与Visual Studio的版本。由于Windows 11目前应该是只支持Visual Studio 2019以上的版本,所以我目前用的是VS 2019。Matlab与VS 2019搭配的话起码是Matlab 2019以上版本。我这里用的目前最新的Matlab 2021b。因此,这个配置是符合要求的。如果出现mex设置不成功,比如找不到合适的编译器,建议自己调整一下自己的VS 或者matlab的版本。
版本确认没有问题以后,可以在matlab的命令行里输入:
|
|
然后matlab默认会选择VS 2019 (对于我的电脑而言) C++编译器。然后接下来就是用mex编译st.c
文件。具体如下
|
|
这一步可能会报错,因为st.c
没有对M_PI
的定义,可以在st.c
的#include <fftw3.h>
后面一行加上一句#define M_PI 3.1415926535897932
. 之后再运行上面的命令就不会报错了。这里还需要注意的是st.c
和st_wrapper.c
的顺序,st.c
在前,这样最后出来的是st.mexw64
3. 验证
验证直接在Matlab的命令行中输入
|
|
这时,可能会报下面的错误
Invalid mex file 'C:\Users\Admin\Desktop\ctf2st\st\st.mexw64' The specified module could not be found
.
但是,你会发现在错误所显示的目录下,明明有st.mexw64
这个文件。这就需要使用一个工具dependencywalker
(https://www.dependencywalker.com/)。 下载Download Version 2.2.6000 for x64 [468k]
这个文件,然后解压。接着打开depends.exe
文件,然后选择File
,然后打开st.mexw64
这个文件。仔细地看里面地报错信息,你最后会注意到有几个dll库没找到(如图所示)。然后,我就抱着试试看地心态用everything搜了这几个库,接着把它们复制到st
这个文件夹中,再次运行stest
,最后成功地画出了图件。
复制到st
的dll文件如下:
libmx.dll
, libmex.dll
,libfftw3-3.dll
这三个dll.