通过自定义表单配置过滤器参数¶
让我们创建一个小程序(单元格掩码),帮助我们在不离开交互式脚本的情况下选择过滤器参数。
加载数据¶
假设我们有以下信号
In [ ]:
Pkg.add(["Statistics", "DSP", "CSV"])
In [ ]:
gr()
using CSV, DataFrames
d = CSV.read( "$(@__DIR__)/scope_data.csv", DataFrame );
取各时间步之间的平均差作为采样频率。
In [ ]:
using Statistics
Fs = 1 / mean(diff(d.Time)); # Частот дискретизации
Fn = Fs/2; # Частота Найквиста
L = length( d.Time ); # Количество отсчетов в сигнале
让我们尝试建立一个满足某些技术要求的滤波器。
In [ ]:
using FFTW, DSP
Fl = round.(Int, round(L/2)+1) # Количество точек в дискретном преобразовани Фурье
Fv = range(1/Fl, 1, length=Fl) .* Fn; # Вектор частот (исключая первую точку – 0)
Iv = 1:length(Fv); # Вектор индексов
In [ ]:
# @markdown ## Настройка параметров фильтра
# Значения по умолчанию
pT, pB, sT, sB, Rp, Rs = 20, 30, 18, 35, 1, 50;
# @markdown ### Границы пропускаемых частот фильтра
Нижняя_граница_пропускаемых_частот = 19 # @param {type:"slider", min:2, max:100, step:1}
Верхняя_граница_пропускаемых_частот = 45 # @param {type:"slider", min:2, max:100, step:1}
# @markdown ### Границы поглощаемых частот фильтра
Нижняя_граница_поглощамеых_частот = 12 # @param {type:"slider", min:2, max:100, step:1}
Верхняя_граница_поглощаемых_частот = 60 # @param {type:"slider", min:2, max:100, step:1}
# @markdown ### Параметры пиков
Пик_в_полосе_пропускания = 8 # @param {type:"slider", min:2, max:100, step:1}
Пик_в_полосе_поглощения = 39 # @param {type:"slider", min:2, max:100, step:1}
pB, pT = Нижняя_граница_пропускаемых_частот, Верхняя_граница_пропускаемых_частот
sB, sT = Нижняя_граница_поглощамеых_частот, Верхняя_граница_поглощаемых_частот
Rp = Пик_в_полосе_пропускания
Rs = Пик_в_полосе_поглощения
Wp = (pB, pT) ./ Fn;
Ws = (sB, sT) ./ Fn;
n,Ws = ellipord( Wp, Ws, Rp, Rs); # Найдем порядок фильтра с желаемыми характеристиками
designmethod = Elliptic( n, Rp, Rs ); # Создадим эллиптический фильтр
responsetype = Bandpass( Rp, Rs); # И полосной фильтр
# Сглаженный спектр
TF = fft( d.Measurement ) ./ L
TF1 = filt( digitalfilter(responsetype, designmethod; fs=Fn), TF );
plot(
plot( Fv, 20 .* log10.(abs.([TF[Iv] TF1[Iv]])), xscale=:log10, lw=[1 2] ),
plot( Fv, angle.([TF[Iv] TF1[Iv]]) .* 180/pi, xscale=:log10, lw=[1 2] ),
layout=(2,1)
)
plot!( ylabel=["Амплитуда (дБ)" "Фаза (град)"], leg=:false )
plot!( title=["ЛАФЧХ системы" ""], xlabel=["" "Частота (Гц)"] )
Out[0]:
如果我们隐藏代码并启用 "参数变化时自动播放单元格 "选项(按钮 到单元格掩码的左边),然后就可以交互式地调整筛选参数。
结论¶
代码单元掩码工具包允许我们创建自己的界面来定制算法。在它的帮助下,我们可以选择滤波器参数,以理想的方式影响某些链路的输出信号。