Engee 文档
Notebook

Arduino的代码生成(带低通滤波器的线性频率调制)

此演示示例在目标设备上计算、模拟和执行具有线性频率调制的数字低通滤波器。

导言

本例的目的是开发一种基于指定参数的低通滤波器。 为了计算它,我们将使用Julia DSP库。 我们将检查Engee模型中滤波器在线性频率调制接收的信号上的操作。 从Engee模型生成代码后,我们将在Arduino调试板上重现信号滤波。

硬件部分

此示例使用Arduino MEGA2560调试板。 输出信号在输出No.9处产生。 使用PWM和RC低通滤波器进行数模信号转换。 PWM频率为62.5khz,RC滤波器的截止频率为14.185khz,滤波器阶数为2。 连接图如下图所示。

pcb_lpf.png

RC电路的参数: . 在电路的输出端通过限流电阻 一个3.5mm音频输出插孔连接,将信号输出到扬声器。

模型描述

本示例中考虑的模型的功能部分是子系统 FM 形成井变量 Duty. 用户草图中的此变量将传递给PWM控制器模块以生成模拟输出信号。

image.png

子系统内容 FM 使用公式描述线性频率调制 . 信号的频率线性变化: 块中通过低通滤波器后 LPF 滤波信号 获取偏移和缩放。 这对于正确和最准确地形成PWM井眼是必要的。 此示例中的PWM分辨率仅为5位,但这允许您实现高PWM频率。

image.png

PWM钻孔由公式确定 .

需要说明的是,为了进一步节省目标设备的计算能力,信号频率的变化与仿真时间直接相关。 因此,调制信号在某一时刻的频率将超过奈奎斯特频率和采样频率两者。 因此,为了正确呈现滤波结果,有必要选择低于奈奎斯特频率的截止频率。

低通滤波器的计算

对于低通滤波,选择具有参数的椭圆滤波器:

*采样频率为2000Hz(因此奈奎斯特频率为1000Hz),
*截止频率-400赫兹,
*极数-6,
*带宽中特性的不均匀性为1dB,
*延迟带中的衰减为60dB。

In [ ]:
# Подключение библиотек
neededLibs = ["WAV", "DSP"]
for lib in neededLibs
    try
        eval(Meta.parse("using $lib"))
    catch ex
        Pkg.add(lib)
        eval(Meta.parse("using $lib"))
    end
end
In [ ]:
fs = 2000
fp = 400;
n = 6;
Rp = 1;
Rs = 60;

计算滤波器传递函数的分子和分母的多项式的系数:

In [ ]:
methods(Lowpass)
Out[0]:
# 2 methods for type constructor:
In [ ]:
using DSP;
myfilt = digitalfilter(Lowpass(fp; fs), Elliptic(n, Rp, Rs));
b = coefb(myfilt);
a = coefa(myfilt);

将获得的系数复制到块的分子和分母中 LPF 模特。

模拟结果

下载并执行创建的模型:

In [ ]:
if "chirp_lpf" in [m.name for m in engee.get_all_models()]
    m = engee.open( "chirp_lpf" );
else
    m = engee.load( "$(@__DIR__)/chirp_lpf.engee" );
end

data = engee.run(m);

从获得的模型数据中,我们将绘制输出变量-低频输入和输出端的信号: LPF_inLPF_out 相应地。

In [ ]:
using Plots
plotlyjs()
plot(data["LPF_in"].time, data["LPF_in"].value,
    label="До ФНЧ", size=(900,300), lw=2, st=:step)
plot!(data["LPF_out"].time, data["LPF_out"].value,
    label="После ФНЧ", size=(900,300), lw=2, st=:step)
xlabel!("Время, сек")
ylabel!("Значение")
Out[0]:

从图中可以看出,滤波器根据指定的参数进行信号转换。

将代码上传到Arduino

要上传到Arduino,您需要从子系统生成代码 FM:

In [ ]:
engee.generate_code( "$(@__DIR__)/chirp_lpf.engee",
                     "$(@__DIR__)/chirp_lpf_code";
                     subsystem_name="FM")

我们将连接用户草图中指定目录中生成的文件。 chirp_lpf.ino. 下载这些文件并使用Arduino IDE将它们上传到Arduino MEGA

Arduino上的代码执行

在成功编译并将草图上传到目标设备后,我们将在RC滤波器的输出端连接一个数字示波器,并删除生成信号的可变分量。

在演示中,使用了数字示波器Hantec DSO与计算机连接,并将数据输出到DSO分析仪程序。

chirp_lpf.gif

如您所见,当正弦信号的频率在400Hz之后增加时,其幅度被抑制。 为了更好地用数字滤波器表示模型的操作,将扬声器连接到RC电路的输出端,并将产生的声音记录在文件中。 chirp_lpf_audio.wav. 下一个代码单元格允许您将接收到的音频文件上传到脚本并播放它。 播放音轨以确保开发的模型和过滤器正常工作。

In [ ]:
using WAV, Base64
x, fs = wavread( "$(@__DIR__)/chirp_lpf_audio.wav" );

buf = IOBuffer();
wavwrite(x, buf; Fs=fs);
data = base64encode(unsafe_string(pointer(buf.data), buf.size));
markup = """<audio controls="controls" {autoplay}>
              <source src="data:audio/wav;base64,$data" type="audio/wav" />
              Your browser does not support the audio element.
              </audio>"""
display( "text/html", markup );

结论

在本例中,我们研究了处理LFM信号的数字椭圆低通滤波器的操作。 计算的滤波器在建模期间和在目标设备上执行时都对应于指定的参数。