Engee 文档
Notebook

参数音频均衡器

在本演示中,我们将分析支持三个可配置频段的参数音频均衡器。 每个频带使用不同的biquadrate滤波器结构来实现。
image.png

均衡器是一种电子设备或计算机程序,允许您根据频率特性选择性地调整信号的幅度。

同样在本演示中,我们将比较EngeeMATLAB模型的操作。
要做到这一点,连接必要的库,并考虑实现的模型的设备。

In [ ]:
Pkg.add(["Statistics", "CSV"])
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
In [ ]:
using Plots
using MATLAB
using CSV
using DataFrames
using Statistics
In [ ]:
plotlyjs();
In [ ]:
mat"start_simulink"
mat"p = genpath('/user/start/examples'); addpath(p);"

该模型由两个主要块组成:均衡器本身,其包括3个在上层具有滤波器系数的滤波单元,以及离散传递函数估计器。 下图显示了检验员的模型和设置。

image.png image_2.png

如果我们考虑每个滤波器,它们以相同的方式实现,并包括离散滤波器,系数采样单元和双二阶滤波器。

image_3.png

现在让我们继续在EngeeSimulink中启动和比较此模型的实现。

启动和分析Engee模型

我们来看看Engee中的仿真结果:

In [ ]:
function rum_model(NemeModel,Path_to_folder)
Path = Path_to_folder * "/" * NemeModel * ".engee"
   if NemeModel in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
      model = engee.open(NemeModel) # Открыть модель
      engee.run(model, verbose=true); # Запустить модель
   else
      model = engee.load(Path, force=true) # Загрузить модель
      engee.run(model, verbose=true); # Запустить модель
      engee.close(NemeModel, force=true); # Закрыть модель
   end
end
Out[0]:
rum_model (generic function with 1 method)
In [ ]:
# Запуск модели
rum_model("Equalizer","/user/start/examples/dsp/equalizer")
Building...
Progress 0%
Progress 1%
Progress 32%
Progress 100%
Progress 100%
In [ ]:
function parse_csv_engee(filename :: String)
    file = open(filename)
    line = readline(file)
    name_idx = vcat(0,findall(',', line), length(line)+1)
    names = collect([line[(name_idx[it-1]+1):(name_idx[it]-1)] for it  2:length(name_idx)])
    data = collect([it for it  (line -> eval(Meta.parse(line)))(readline(file))])
    while !eof(file)
        data = ((a, b) -> [a;;;b]).(data, collect([it for it  (line -> eval(Meta.parse(line)))(readline(file))]))
    end
    close(file)
    return Dict(names .=> data)
end
Out[0]:
parse_csv_engee (generic function with 1 method)
In [ ]:
# Чтение CSV
out = parse_csv_engee("/user/start/examples/dsp/equalizer/out.csv");
out_t = out["time"];
out_data = out["1"];
In [ ]:
# Построение графиков
Eng_data = reshape(out_data,808)
plot(Eng_data[1:8:end])
plot!(Eng_data[2:8:end])
plot!(Eng_data[3:8:end])
plot!(Eng_data[4:8:end])
plot!(Eng_data[5:8:end])
plot!(Eng_data[6:8:end])
plot!(Eng_data[7:8:end])
plot!(Eng_data[8:8:end])
plot!(title = "Результаты моделирования в Engee", ylabel = "Данные", xlabel="Время, c")
Out[0]:

启动和分析Simulink模型

让我们比较一下EngeeSimulink中的仿真结果。 为此,首先运行模型的模拟。

In [ ]:
mat"run_test_model('Equalizer')";

让我们看看Simulink中的结果:

In [ ]:
mat"whos" # Вывести все переменные, хранящиеся в рабочей области
>> >> >>   Name                     Size                  Bytes  Class                             Attributes

  SimulationSteps        101x1                     808  double                                      
  SysOutput                1x1                    6800  timeseries                                  
  a                        1x6                      48  double                                      
  b                        1x6                      48  double                                      
  matlab_jl_has_ans        1x1                       8  double                                      
  n                        1x32                    256  double                                      
  out                      1x1                  847601  Simulink.SimulationOutput                   
  p                        1x585978            1171956  char                                        
  sig                      1x1                    7018  Simulink.SimulationData.Signal              

In [ ]:
# Чтение выхода модели
sim = mat"SysOutput.Data";
In [ ]:
# Построение графиков
Sim_data = reshape(sim,808)
plot(Sim_data[1:8:end])
plot!(Sim_data[2:8:end])
plot!(Sim_data[3:8:end])
plot!(Sim_data[4:8:end])
plot!(Sim_data[5:8:end])
plot!(Sim_data[6:8:end])
plot!(Sim_data[7:8:end])
plot!(Sim_data[8:8:end])
plot!(title = "Результаты моделирования в Simulink", ylabel = "Отклик", xlabel="Время, c")
Out[0]:

现在让我们绘制SimulinkEngee的输出数据之间的差异,并且还计算平均误差值。

In [ ]:
plot(Sim_data-Eng_data)
Out[0]:
In [ ]:
print("Погрешность: " * string((sum(abs.(Sim_data-Eng_data)))/length(Eng_data)))
Погрешность: 2.3758486926991814e-12

从上面的图表和计算平均误差的结果可以看出,模型的工作几乎相同。

结论

在这个例子中,我们实现了一个均衡器,并比较了EngeeSimulink中建模的能力,并展示了连接MATLAB核心以解决Engee开发环境中的问题的选项。