1. ctf2st

ctf2st是一个Matlab的GUI包,用于进行Stockwell 时频分析,也即S变换。其软件包的链接为 https://kurage.nimh.nih.gov/meglab/Meg/Ctf2st , 该网站上还能找到其他语言版本的S变换版本。

2. 安装

下载该软件包ctf2st.tgz后,先用winrar对该压缩包ctf2st.tgz进行解压。解压之后,进入到st目录下,会发现里面有fftw3.hst.cst_wrapper.cstest.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文件夹中。然后键入:

1
lib /machine:x64 /def:libfftw3-3.def

这一步可能报错,需要从系统中找到(比如可以用everything来搜索)mspdbcore.dll, 然后将其拷贝到fftw-3.3.5-dll64文件夹中,或者在Windows的系统环境变量中添加上mspdbcore.dll的路径(这种方案我未验证)。即可解决该问题。成功运行的结果是

1
2
3
4
5
6
7
C:\Users\Admin\Desktop\fftw-3.3.5-dll64>lib /machine:x64 /def:libfftw3-3.def
Microsoft (R) Library Manager Version 14.28.29913.0
Copyright (C) Microsoft Corporation.  All rights reserved.

   Creating library libfftw3-3.lib and object libfftw3-3.exp

C:\Users\Admin\Desktop\fftw-3.3.5-dll64>

到此,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的命令行里输入:

1
mex -setup

然后matlab默认会选择VS 2019 (对于我的电脑而言) C++编译器。然后接下来就是用mex编译st.c文件。具体如下

1
mex st.c st_wrapper.c -I. -llibfftw3-3.lib

这一步可能会报错,因为st.c没有对M_PI的定义,可以在st.c#include <fftw3.h> 后面一行加上一句#define M_PI 3.1415926535897932. 之后再运行上面的命令就不会报错了。这里还需要注意的是st.cst_wrapper.c的顺序,st.c在前,这样最后出来的是st.mexw64

3. 验证

验证直接在Matlab的命令行中输入

1
>> stest

这时,可能会报下面的错误

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.

depends.png

4 参考资料