专栏
标签
MATLAB代码转mworks
一般问题
发布于 2024-12-25 16:57:39
查看 42过去550天

将下面的MATLAB代码转换到mworks运行时出现问题:
% 参数设置
K = 2;
Q = 10;
fp = 10e3; % 10kHz
fs = 2 * pi * fp;

% 计算元件值
R1 = 1e3; % 1kΩ
R2 = R1 / (K - 1);
C1 = 1 / (Q * fs * R1);
C2 = Q / (fs * R2);

% 显示计算结果
fprintf('R1 = %.6f Ω\n', R1);
fprintf('R2 = %.6f Ω\n', R2);
fprintf('C1 = %.6f pF\n', 1e12C1);
fprintf('C2 = %.6f pF\n', 1e12
C2);

% 绘制频率响应
f = logspace(1, 6, 1000);
s = 1j * 2 * pi * f;
H = K ./ (1 + s .* (R1 * C1 + R2 * C2) + (s.^2) .* (R1 * R2 * C1 * C2));

figure;
semilogx(f, 20 * log10(abs(H)));
grid on;
title('Sallen-Key低通滤波器频率响应');
xlabel('频率 (Hz)');
ylabel('增益 (dB)');

转到mworks后代码如下:

% 参数设置

K = 2;
Q = 10;
fp = 10e3; #% 10kHz
fs = 2 * pi * fp;

% 计算元件值

R1 = 1e3; #% 1kΩ
R2 = R1 / (K - 1);
C1 = 1 / (Q * fs * R1);
C2 = Q / (fs * R2);

% 显示计算结果

println("R1 = $R1 Ω\n");
println("R2 = $R2 Ω\n");
println("C1 = $C1 F\n");
println("C2 = $C2 F\n");

% 绘制频率响应

f = logspace(1, 6, 1000);

f = 10 .^ range(1, stop=6, length=1000)
s = 1im * 2 * pi * f;
H = K ./ (1 + s .* (R1 * C1 + R2 * C2) + (s.^2) .* (R1 * R2 * C1 * C2));

figure;
semilogx(f, 20 * log10(abs(H)));
grid(on);
title("Sallen-Key低通滤波器频率响应");
xlabel("频率 (Hz)");
ylabel("增益 (dB)");
现在出现的问题是:
1.mworks好像不支持logspace函数,需要改变方法否则报错
2.改变logspace函数表示方法之后报错:

ERROR: MethodError: no method matching +(::Int64, ::Vector{ComplexF64})
For element-wise addition, use broadcasting with dot syntax: scalar .+ array

Closest candidates are:
+(::Any, ::Any, ::Any, ::Any...)
@ Base operators.jl:578
+(::T, ::T) where T<:Union{Int128, Int16, Int32, Int64, Int8, UInt128, UInt16, UInt32, UInt64, UInt8}
@ Base int.jl:87
+(::Union{Int16, Int32, Int64, Int8, UInt16, UInt32, UInt64, UInt8}, ::VectorizationBase.VecUnroll{N, W, T, VectorizationBase.MM{W, X, T}}) where {N, W, T<:Union{Int16, Int32, Int64, Int8, UInt16, UInt32, UInt64, UInt8}, X}
@ VectorizationBase C:\Users\Public\TongYuan.julia\packages\VectorizationBase\jSp7w\src\base_defs.jl:103
...

Stacktrace:
[1] +(::Int64, ::Vector{ComplexF64}, ::Vector{ComplexF64})
@ Base .\operators.jl:578
[2] top-level scope
@ e:\mworks_code\Untitled-1.jl:24

所属专栏:Julia语言
产品信息:Syslab科学计算环境
科学计算

全部回答 1

发布于 2024-12-25 18:14:11

您好,修改代码如下

K = 2;
Q = 10;
fp = 10e3; #% 10kHz
fs = 2 * pi * fp;
R1 = 1e3; #% 1R2 = R1 / (K - 1);
C1 = 1 / (Q * fs * R1);
C2 = Q / (fs * R2);
println("R1 = $R1 Ω\n");
println("R2 = $R2 Ω\n");
println("C1 = $C1 F\n");
println("C2 = $C2 F\n");
f = logspace(1, 6, 1000);
f = 10 .^ range(1, stop=6, length=1000)
s = 1im * 2 * pi * f;
H = K ./ (1 .+ s .* (R1 * C1 + R2 * C2) + (s.^2) .* (R1 * R2 * C1 * C2));#s为向量,因此更改+为.+方可与1运算

figure;
semilogx(f, 20 * log10.(abs.(H)));#H为向量,因此需要使用abs.(H)而不是abs(H),log10同理
grid("on");
title("Sallen-Key低通滤波器频率响应");
xlabel("频率 (Hz)");
ylabel("增益 (dB)");

运行结果如下
image.png

用户
和原帖交流更多问题细节吧,去
我要发帖 我要发帖
资料中心 资料中心
查看更多>
热门帖子 热门帖子
主要贡献者 主要贡献者
过去7天