MWORKS.Syslab 使用总结

运行平台:Windows11 ;版本:MWORKS.Syslab 2024b

以下内容基于实验3~7中的MATLAB代码移植到Syslab平台过程中总结的问题。


Syslab无法读取音频解决思路

一开始是想直接将matlab里的audioread函数复制过来用,但是发现他的函数封装层层嵌套,比如套了readaudio()等,而进一步查看这个函数则发现无法查看。毕竟这是因为Mathwork的吃饭的家伙事儿,怎么可能让人随便获取。MATLAB加密自己的部分函数文件,对其库的移植难度极大。

然后想到查看同元的库dsp_AudioFileReader,也随即发现他的函数都是调用API,在本地貌似无法获取。

解决思路有以下三种:

1. 将.m文件移植到.jl文件中

​ 在Julia中可以使用同元官方提供的函数库处理音频信号,但移植过程中需注意二者语法差异。

与MATLAB的显著差异 | Syslab使用手册

2. 在.m文件中调用.jl函数

​ 同元syslab缺少音频读取函数,可以调用Julia函数来读取。

高阶 - M 语言调用 Julia 函数 | Syslab使用手册

3. 在.m文件调用c/c#函数库

​ 可以使用网上开源的读取 .wav 文件的函数。但是没有接触过接口调用不是很了解。

综合考虑,最终采用方法 1. 将.m文件移植到.jl文件中

实现代码如下:

1
2
3
4
5
using TySignalProcessing
using TyPlot
afr = dsp_AudioFileReader(Filename = "motherland.wav", SamplesPerFrame = 80000);
xn = step(afr);
plot(xn);

操作符相关差异

主要还是一些对数组的操作和运算上,Julia相对matlab会麻烦一些。详情可见:与 MATLAB 的显著差异

函数相关差异

在MWORKS中运行.m文件

  1. imread 函数
平台 MATLAB MWORKS
差异 能够根据图片的特征(RGB/灰度)调整存储的矩阵 全部以RGB格式存入矩阵中

在实验4中,读取lena灰度图像时,使用如下代码可以解决:

1
2
A = imread('lena.bmp'); % A 512*512*3 Matrix
grey_A = A(:,:,1); % grey_A 512*512 Matrix
  1. 快速傅里叶反变换 ifft()

MATLAB中 ifft() 返回值可以是实数或复数,MWORKS中IFFT返回值只能为复数(a+bi)。故在实验5中,对原信号频谱采样后的信号作IFFT时,需要使用 real() 取实部才能作采样后恢复序列的图。

  1. 巴特沃斯滤波器设计buttord()
平台 MATLAB MWORKS
差异 输入输出参数均为模拟参数 输入输出参数均为归一化的数字参数

故在实验6中,设计巴特沃斯滤波器时,需根据公式对参数进行转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
%% 设计一个巴特沃斯数字低通滤波器

wp=0.2*pi; %滤波器的通带截止频率
ws=0.35*pi; %滤波器的阻带截止频率
Rp=1; As=15; %滤波器的通阻带衰减指标
ripple=10^(-Rp/20); %滤波器的通带衰减对应的幅度值
Attn=10^(-As/20); %滤波器的阻带衰减对应的幅度值
Fs=10; T=1/Fs;
Omgp=(2/T)*tan(wp/2); %原型通带频率的预修正
Omgs=(2/T)*tan(ws/2); %原型阻带频率的预修正
% ==================================================
% 修改前
[n,Omgc]=buttord(Omgp,Omgs,Rp,As,'s'); %计算阶数n和截止频率
[z0,p0,k0]=buttap(n); %设计归一化的巴特沃思模拟滤波器原型

% 修改后
[n,wc]=buttord(wp/pi,ws/pi,Rp,As); %计算阶数n和截止频率
Omgc=(2/T)*tan(wc/2)*pi; %原型截止频率的预修正
[z0,p0,k0]=buttap(n); %设计归一化的巴特沃思模拟滤波器原型
% ==================================================
ba1=k0*real(poly(z0)); %求原型滤波器的系数 b
aa1=real(poly(p0)); %求原型滤波器的系数 a
[ba,aa]=lp2lp(ba1,aa1,Omgc); %变换为模拟低通滤波器

在.jl中也同样有以上问题,参照示函数帮助改即可。

在MWORKS中运行.jl文件

  1. 数字滤波器的频率响应 freqz()

注意查看函数帮助,二者在输入参数中有所区别,视具体情况而定。

  1. 快速傅里叶变换 fft()
平台 MATLAB MWORKS
差异 输入参数具备选择作DFT的点数N(可以大于原序列长度),
长度不足的自动在序列后补零
只能对序列作对应长度的DFT

参考以上思路,在MWORK中编写函数myfft()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function myfft(xn::AbstractArray{T}, N::Int) where T <: Number
"""
这个函数用于对输入数组 `xn` 进行快速傅里叶变换(FFT)。

参数:
- xn: 输入的数组,其元素类型应为数值类型。
- N: 期望的变换长度。如果 `xn` 的长度小于 `N`,将会在 `xn` 后面补零到长度为 `N`。

返回值:
- 对补零后的数组执行N点FFT后的结果。
"""
xn_padded = [xn; zeros(T, N - length(xn))];
# 对补零后的数组执行 FFT
Xn_padded = fft(xn_padded)
return Xn_padded
end

放在同一文件目录下便可以调用。

  1. 没有linespace()函数(功能:生成线性间距向量)

替代方法如下:

1
2
3
4
5
## 实现0~fs的N点长序列
# 修改前
f = linspace(0, fs, N);
# 修改后
f = 0:fs/N:fs-1;
  1. 一维数字滤波器filter()函数

MWORKS中的 filter() 函数返回值不是我们需要的值,用其他函数 filter1() 代替。

平台 MATLAB MWORKS
函数名以及基本用法 y=filter(b,a,x) y,=filter1(b,a,x)
注意事项 / 注意返回了两个参数,
故需要用 , 间隔开来接收
  1. 哈宁窗函数
平台 MATLAB MWORKS
函数名称 hanning() hann()

故在实验7中,选取窗函数时需要注意。

绘图相关差异

在MWORKS中绘制多图时,容易出现标题文字重叠的情况。可以采用以下方法:

1
2
% 在每张图结束结束绘图处加一句
tightlayout();

在MWORKS中运行.m文件

  1. 绘图允许的数据范围

MWORKS中貌似是不能超过 10e307。故在实验3,语音信号滤波实验中,绘制通过不稳定系统的输出信号时,因其无限增长的幅值可能会导致报错。

解决办法:

1
plot(t.+start_time, filteredAudio3./10); # filteredAudio3./10 防止超出绘图范围
  1. impz() 函数

画出来的冲激响应xy标签和标题是英文,为什么不改成中文呢?这很难做到吗?我不是很理解。明明长得跟MATLAB的画出来几乎一模一样,但是别人画的图会随语言的变化而调整。

1
2
impz(b, a, N); 
title('冲激响应');xlabel('n(采样)');ylabel('幅度');
  1. 使用 zplane() 绘制的图线段颜色与plot绘制的颜色不一样

顺带说一句:颜色不一样真的很影响整体的观感。

  1. figure() 中的数学公式需用 $$ 引用才能正确显示
1
2
3
4
5
% 修改前
plot(linspace(0, 2, 1024),abs(Xw)); xlabel('\omega/\pi');

% 修改后
plot(linspace(0, 2, 1024),abs(Xw)); xlabel('$\omega/\pi$');
  1. 无法使用 set() 函数设置 xticks

在设计滤波器时,需要绘制幅频特性曲线,加上这些ticks才能更直观地看出设计是否符合要求。没有 set() 语句的话,出的图效果不是很好。我看交互界面也没有相关的设置。

在MWORKS中运行.jl文件

  1. 打开网格

    平台 MATLAB MWORKS
    写法 grid on; grid("on"); (不能有空格)
  2. 标签中(如title , xlabel , ylabel)的文字需要用 双引号" "引用而不能用单引号‘ ’

示例:

1
2
3
title("抽样信号幅度谱");
xlabel("f(Hz)");
ylabel("幅度");

其实Julia语言只支持 双引号 引用。

  1. 无法使用LaTex对图表的label和title进行设置,但可以直接使用Φ,×,π等符号

整体对数学公式的兼容不够友好,出来的图不够美观。


<=The End=>

1
Me:帮我总结一下本文提到了 MWORKS 的哪些不足,分点列出,并交代引用位置。

AI:

本文提到了 MWORKS 相对于 MATLAB 的一些不足之处,以下是分点列出的不足及引用位置:

  1. 音频读取问题:MWORKS 缺少音频读取函数,需要调用 Julia 函数来读取。

  2. 语法差异:在数组操作和运算上,Julia 相对于 MATLAB 会麻烦一些。

  3. 函数差异

    • imread 函数在 MWORKS 中全部以 RGB 格式存入矩阵中,而 MATLAB 能根据图片特征调整存储的矩阵。
    • ifft() 函数在 MWORKS 中返回值只能为复数,需要使用 real() 取实部。
    • buttord() 函数在 MATLAB 中输入输出参数为模拟参数,而在 MWORKS 中为归一化的数字参数。
  4. 绘图问题

    • MWORKS 中绘图容易出现标题文字重叠的情况。
    • 绘图允许的数据范围有限,不能超过 10e307
    • impz() 函数的标签和标题是英文,不随语言变化而调整。
    • zplane() 绘制的图线段颜色与 plot 绘制的颜色不一致。
    • figure() 中的数学公式需用 $$ 引用才能正确显示。
    • 无法使用 set() 函数设置 xticks
  5. Julia 语言特性

    • 打开网格的写法与 MATLAB 不同,且不能有空格。
    • 标签中的文字需要用双引号引用,而 MATLAB 支持单引号和双引号。
    • 无法使用 LaTeX 对图表的 label 和 title 进行设置,虽然可以直接使用一些符号,但是整体对数学公式的兼容不够友好。
  6. 其他

    • MWORKS 中的 filter() 函数返回值与 MATLAB 不同,需要使用 filter1() 代替。
    • 哈宁窗函数在 MWORKS 中为 hann(),而 MATLAB 中为 hanning()

这些不足之处表明 MWORKS 在某些方面与 MATLAB 存在差距,但整体上仍能满足基本功能需求。随着用户的增加和软件的不断更新,MWORKS 有望逐渐完善,提高用户体验。

说在最后

总体来说,还是能够符合使用,移植的难度不大。虽然在某些方面能感受到与MATLAB仍有些差距,一些功能不够丰富,使用起来还不够优雅;但至少在基本的功能实现上达到了MATLAB的七八成,整体还算是瑕不掩瑜吧。希望以上提到的问题能够得到重视,我相信随着越来越多人的加入,MWORKS暴露出来的缺点和不足会不断完善,从而让使用体验不断优化。不久的将来随着越来越多人的加入,我们国产软件一定能够不断进步,完全替代MATLAB(doge)。