Engee 文档
Notebook

实现低通和高通滤波器

本演示展示了由以下差分方程给出的两个滤波器的实现: 1.低通滤波器y(n) = 0.5x(n) + 0.5x(n-1) (平均) 2.高频滤波器y(n) = 0.5x(n) - 0.5x(n-1) (有限差分)

下图显示了这一模型,从中我们可以看出,这些滤波器具有共同的系数,它们的主要区别在于最后一个加法器。

image.png

接下来,我们应用辅助函数来运行模型。

In [ ]:
function run_model( name_model)
    
    Path = (@__DIR__) * "/" * name_model * ".engee"
    
    if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
        model = engee.open( name_model ) # Открыть модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
    else
        model = engee.load( Path, force=true ) # Загрузить модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
        engee.close( name_model, force=true ); # Закрыть модель
    end
    sleep(5)
    return model_output
end

run_model("hipass_lopass") # Запуск модели.
Building...
Progress 25%
Progress 100%
Progress 100%
Progress 100%
Out[0]:
Dict{String, DataFrames.DataFrame} with 2 entries:
  "hipass" => 20001×2 DataFrame…
  "lopass" => 20001×2 DataFrame

让我们通过绘制信号的时域和频域图来分析记录的结果。

In [ ]:
hipass = collect(simout["hipass_lopass/hipass"]);
lopass = collect(simout["hipass_lopass/lopass"]);

plot(hipass.time[1:500], [hipass.value[1:500], lopass.value[1:500]],label=["Фильтр нижних частот" "Фильтр верхних частот"])
Out[0]:

从时域数据中我们可以看到,高频和低频滤波器输出数据的主要区别在于信号振幅的不同和振荡脉冲的不均匀性,我们在使用高频滤波器时观察到了这一趋势。

In [ ]:
using FFTW

Comp_hipass = ComplexF64.(hipass.value);
Comp_lopass = ComplexF64.(lopass.value);

spec_hipass = fftshift(fft(Comp_hipass));
spec_lopass = fftshift(fft(Comp_lopass));

x = [10log10.(abs.((spec_hipass/3e6))),10log10.(abs.((spec_lopass/3e6)))];
plot(x, label =["Фильтр нижних частот" "Фильтр верхних частот"])
ylabel!("Мощность дБВт")
xlabel!("Частота МГц")
Out[0]:

根据信号频谱,我们可以看出滤波器工作正常。

结论

在本例中,我们分析了高通滤波器和低通滤波器在使用相同系数时的差异,从而表明这些滤波器在实现方面的差异非常小。