将下面的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', 1e12C2);
% 绘制频率响应
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
