使用命令控制生成FIR滤波器
在本演示中,我们将向您展示如何使用命令控制来实现单类型操作,以及共享方法来简化建模过程。
让我们从连接实现项目所需的库开始。
In [ ]:
Pkg.add(["DSP"])
In [ ]:
using Plots, DSP; # 连接绘图和DSP库
现在,使用DSP库,我们将为我们的滤波器生成系数。
In [ ]:
st = 0.0001;
fc = [500 1200]'; # Частоты сигнала
fs = 6000; # 信号的采样率
t = [0:1/fs:0.001;]; # 信号时间范围
x = cos.(2*pi*fc[1]*t) + cos.(2*pi*fc[2]*t); # 滤波信号的示例
responsetype = Lowpass(2000; fs); # 带宽检测
print("过滤窗口的大小:")
N = parse(Int,readline())
designmethod = FIRWindow(hanning(N)); # 确定窗口大小
x_filt =filt(digitalfilter(responsetype, designmethod), x); # 信号滤波
c=digitalfilter(responsetype, designmethod); # FIR滤波器
coef=length(c); # 滤波器系数个数
Out[0]:
让我们绘制原始信号和滤波后信号的频谱功率密度。
In [ ]:
p1 = DSP.periodogram(x);
plot(freq(p1), power(p1), xlabel="频率,赫兹", ylabel="光谱功率密度", label="原始信号")
p2 = DSP.periodogram(x_filt);
plot!(freq(p2), power(p2), label="滤波信号")
Out[0]:
现在让我们创建一个模型,我们将在其中生成过滤器本身。
In [ ]:
print("写你的模型的名称:")
name_model = readline()
Path = (@__DIR__) * "/" * name_model * ".engee"
if isdir(Path)
rm(Path;force = true, recursive = true)
end
engee.create(name_model) # 创建模型
Out[0]:
首先,我们将设置模型的输入和输出端口。
In [ ]:
engee.add_block("/Basic/Ports & Subsystems/In1", name_model*"/"); # 为子系统创建输入端口
engee.add_block("/Basic/Ports & Subsystems/Out1", name_model*"/"); # 为子系统创建输出端口
现在让我们声明一个用于创建FIR滤波器模型的循环。
In [ ]:
for n in 1:coef-1
name_gain="Gain-"*string(n); # 为增益设置块名称
engee.add_block("/Basic/Math Operations/Gain", name_model*"/"*name_gain); # 添加到增益模型
engee.set_param!(name_model*"/"*name_gain, "Gain" => c[n]); # 让我们设置滤波器系数的值
name_delay="Delay-"*string(n); # 为延迟设置块名称
engee.add_block("/Basic/Discrete/Delay", name_model*"/"*name_delay); # 向模型添加延迟
engee.set_param!(name_model*"/"*name_delay, "DelayLength" => 1); # 将延迟长度设置为1
engee.set_param!(name_model*"/"*name_delay, "SampleTime" => st); # 延迟的采样时间
name_add="Add-"*string(n); # 设置添加的块名称
engee.add_block("/Basic/Math Operations/Add", name_model*"/"*name_add); # 添加到添加模型
if n==1
engee.add_line(name_gain*"/1", name_add*"/1"); # 连接增益并添加1个输入
end
if n>1
name_delay_1="Delay-"*string(n-1); # 设置前一个延迟的块名称
engee.add_line(name_delay_1*"/1", name_delay*"/1"); # 结合延迟n-1和延迟n
engee.add_line(name_delay_1*"/1", name_gain*"/1"); # 结合延迟n-1和增益n
name_add_1="Add-"*string(n-1); # 设置上一个添加的块名称
engee.add_line(name_add_1*"/1", name_add*"/1"); # 连接Add N-1和Add1输入
engee.add_line(name_gain*"/1", name_add_1*"/2"); # 连接增益n-1并添加2个输入
end
if n==coef-1
name_gain="Gain-"*string(n+1); # 为增益设置块名称
engee.add_block("/Basic/Math Operations/Gain", name_model*"/"*name_gain); # 添加到增益模型
engee.set_param!(name_model*"/"*name_gain, "Gain" => c[n+1]); # 让我们设置滤波器系数的值
engee.add_line(name_delay*"/1", name_gain*"/1"); # 结合延迟和增益
engee.add_line(name_gain*"/1", name_add*"/2"); # 连接增益并添加2个输入
engee.add_line(name_add*"/1", "Out1/1"); # 合并Add和Out1
end
end
engee.add_line("In1/1", "Gain-1/1"); # 让我们连接In1和Gain-1
engee.add_line("In1/1", "Delay-1/1"); # 连接In1和延迟-1
将结果保存到模型中并更改仿真参数。
In [ ]:
engee.save(Path)
model = engee.load(Path, force=true ) # 上传模型
engee.set_param!(model, "StopTime" => 5, "FixedStep" => 0.1) # 更改固定步长和仿真结束时间
param = engee.get_param(model) # 获取当前模型的参数
Out[0]:
结论
在这个例子中,我们分析了一个使用命令控制自动生成模型的例子。
