MWORKS.Syslab 使用总结
运行平台:
Windows11
;版本:MWORKS.Syslab 2024b
以下内容基于实验3~7
中的MATLAB代码移植到Syslab平台过程中总结的问题。
Syslab无法读取音频解决思路
一开始是想直接将matlab里的audioread
函数复制过来用,但是发现他的函数封装层层嵌套,比如套了readaudio()
等,而进一步查看这个函数则发现无法查看。毕竟这是因为Mathwork的吃饭的家伙事儿,怎么可能让人随便获取。MATLAB加密自己的部分函数文件,对其库的移植难度极大。
然后想到查看同元的库dsp_AudioFileReader
,也随即发现他的函数都是调用API,在本地貌似无法获取。
解决思路有以下三种:
1. 将.m文件移植到.jl文件中
在Julia中可以使用同元官方提供的函数库处理音频信号,但移植过程中需注意二者语法差异。
2. 在.m文件中调用.jl函数
同元syslab缺少音频读取函数,可以调用Julia函数来读取。
高阶 - M 语言调用 Julia 函数 | Syslab使用手册
3. 在.m文件调用c/c#函数库
可以使用网上开源的读取 .wav
文件的函数。但是没有接触过接口调用不是很了解。
综合考虑,最终采用方法
1. 将.m文件移植到.jl文件中
实现代码如下:
1 | using TySignalProcessing |
操作符相关差异
主要还是一些对数组的操作和运算上,Julia相对matlab会麻烦一些。详情可见:与 MATLAB 的显著差异
函数相关差异
在MWORKS中运行.m文件
imread
函数
平台 | MATLAB | MWORKS |
---|---|---|
差异 | 能够根据图片的特征(RGB/灰度)调整存储的矩阵 | 全部以RGB格式存入矩阵中 |
在实验4中,读取lena
灰度图像时,使用如下代码可以解决:
1 | A = imread('lena.bmp'); % A 512*512*3 Matrix |
- 快速傅里叶反变换
ifft()
MATLAB中 ifft()
返回值可以是实数或复数,MWORKS中IFFT返回值只能为复数(a+bi)。故在实验5中,对原信号频谱采样后的信号作IFFT时,需要使用
real()
取实部才能作采样后恢复序列的图。
- 巴特沃斯滤波器设计
buttord()
平台 | MATLAB | MWORKS |
---|---|---|
差异 | 输入输出参数均为模拟参数 | 输入输出参数均为归一化的数字参数 |
故在实验6中,设计巴特沃斯滤波器时,需根据公式
1 | %% 设计一个巴特沃斯数字低通滤波器 |
在.jl中也同样有以上问题,参照示函数帮助改即可。
在MWORKS中运行.jl文件
- 数字滤波器的频率响应
freqz()
注意查看函数帮助,二者在输入参数中有所区别,视具体情况而定。
- 快速傅里叶变换
fft()
平台 | MATLAB | MWORKS |
---|---|---|
差异 | 输入参数具备选择作DFT的点数N(可以大于原序列长度), 长度不足的自动在序列后补零 |
只能对序列作对应长度的DFT |
参考以上思路,在MWORK中编写函数myfft()
1 | function myfft(xn::AbstractArray{T}, N::Int) where T <: Number |
放在同一文件目录下便可以调用。
- 没有
linespace()
函数(功能:生成线性间距向量)
替代方法如下:
1 | ## 实现0~fs的N点长序列 |
- 一维数字滤波器
filter()
函数
MWORKS中的 filter()
函数返回值不是我们需要的值,用其他函数 filter1()
代替。
平台 | MATLAB | MWORKS |
---|---|---|
函数名以及基本用法 | y=filter(b,a,x) | y,=filter1(b,a,x) |
注意事项 | / | 注意返回了两个参数, 故需要用 , 间隔开来接收 |
- 哈宁窗函数
平台 | MATLAB | MWORKS |
---|---|---|
函数名称 | hanning() | hann() |
故在实验7中,选取窗函数时需要注意。
绘图相关差异
在MWORKS中绘制多图时,容易出现标题文字重叠的情况。可以采用以下方法:
1 | % 在每张图结束结束绘图处加一句 |
在MWORKS中运行.m文件
- 绘图允许的数据范围
MWORKS中貌似是不能超过
10e307
。故在实验3,语音信号滤波实验中,绘制通过
解决办法:
1 | plot(t.+start_time, filteredAudio3./10); # filteredAudio3./10 防止超出绘图范围 |
impz()
函数
画出来的冲激响应xy标签和标题是英文,为什么不改成中文呢?这很难做到吗?我不是很理解。明明长得跟MATLAB的画出来几乎一模一样,但是别人画的图会随语言的变化而调整。
1 | impz(b, a, N); |
- 使用
zplane()
绘制的图线段颜色与plot绘制的颜色不一样
顺带说一句:颜色不一样真的很影响整体的观感。
figure()
中的数学公式需用 $$ 引用才能正确显示
1 | % 修改前 |
- 无法使用
set()
函数设置xticks
在设计滤波器时,需要绘制幅频特性曲线,加上这些ticks才能更直观地看出设计是否符合要求。没有
set()
语句的话,出的图效果不是很好。我看交互界面也没有相关的设置。
在MWORKS中运行.jl文件
打开网格
平台 MATLAB MWORKS 写法 grid on; grid("on"); (不能有空格) 标签中(如
title
,xlabel
,ylabel
)的文字需要用双引号" "
引用而不能用单引号‘ ’
示例:
1 | title("抽样信号幅度谱"); |
其实Julia语言只支持
双引号
引用。
- 无法使用LaTex对图表的label和title进行设置,但可以直接使用Φ,×,π等符号
整体对数学公式的兼容不够友好,出来的图不够美观。
<=The End=>
1 | Me:帮我总结一下本文提到了 MWORKS 的哪些不足,分点列出,并交代引用位置。 |
AI:
本文提到了 MWORKS 相对于 MATLAB 的一些不足之处,以下是分点列出的不足及引用位置:
音频读取问题:MWORKS 缺少音频读取函数,需要调用 Julia 函数来读取。
语法差异:在数组操作和运算上,Julia 相对于 MATLAB 会麻烦一些。
函数差异:
imread
函数在 MWORKS 中全部以 RGB 格式存入矩阵中,而 MATLAB 能根据图片特征调整存储的矩阵。ifft()
函数在 MWORKS 中返回值只能为复数,需要使用real()
取实部。buttord()
函数在 MATLAB 中输入输出参数为模拟参数,而在 MWORKS 中为归一化的数字参数。绘图问题:
- MWORKS 中绘图容易出现标题文字重叠的情况。
- 绘图允许的数据范围有限,不能超过
10e307
。impz()
函数的标签和标题是英文,不随语言变化而调整。zplane()
绘制的图线段颜色与plot
绘制的颜色不一致。figure()
中的数学公式需用$$
引用才能正确显示。- 无法使用
set()
函数设置xticks
。Julia 语言特性:
- 打开网格的写法与 MATLAB 不同,且不能有空格。
- 标签中的文字需要用双引号引用,而 MATLAB 支持单引号和双引号。
- 无法使用 LaTeX 对图表的 label 和 title 进行设置,虽然可以直接使用一些符号,但是整体对数学公式的兼容不够友好。
其他:
- MWORKS 中的
filter()
函数返回值与 MATLAB 不同,需要使用filter1()
代替。- 哈宁窗函数在 MWORKS 中为
hann()
,而 MATLAB 中为hanning()
。这些不足之处表明 MWORKS 在某些方面与 MATLAB 存在差距,但整体上仍能满足基本功能需求。随着用户的增加和软件的不断更新,MWORKS 有望逐渐完善,提高用户体验。
说在最后
总体来说,还是能够符合使用,移植的难度不大。虽然在某些方面能感受到与MATLAB仍有些差距,一些功能不够丰富,使用起来还不够优雅;但至少在基本的功能实现上达到了MATLAB的七八成,整体还算是瑕不掩瑜吧。希望以上提到的问题能够得到重视,我相信随着越来越多人的加入,MWORKS暴露出来的缺点和不足会不断完善,从而让使用体验不断优化。不久的将来随着越来越多人的加入,我们国产软件一定能够不断进步,完全替代MATLAB(doge)。