前言

最近发掘到一个 “宝藏”:在 Microchip 的 AN4515 应用笔记中,阐述了如何在其 AVR® EA 8 bit 微控制器(MCU)上运行多款经典的数字信号处理算法(DSP)及案例:

图1 Microchip AN4515 应用笔记

图1 Microchip AN4515 应用笔记,来源 [1]

本文介绍一下基本使用方法和第一个案例 —— 中值滤波(Median Filter)。后续再逐步介绍 IIR 滤波器、 FFT 变换、 Kalman 滤波器 等案例。


硬件支持

AN4515 对应的代码适用于 Microchip AVR64EA48 Curiosity Nano Evaluation Kit:

图2 Microchip AVR64EA48 Curiosity Nano Evaluation Kit

图2 Microchip AVR64EA48 Curiosity Nano Evaluation Kit,来源 [2]

板载 MCU 型号是 AVR64EA48,具有 AVR® 8-bit CPU 并配有硬件乘法器,最高时钟速度 20 MHz ,片内资源是 64KB 闪存、6KB SRAM 和 512 字节 EEPROM。

它在 AVR® EA 系列中的位置如下:

图4 Microchip AVR® EA 系列

图3 Microchip AVR® EA 系列,来源 [3]


软件支持

软件需要三个方面的支持:

  • IDE:Microchip Studio IDE v7.0.2594+ 或者 MPLAB® X IDE v5.50+
  • Compiler:XC8 Compiler v2.40+
  • Device Family Pack:Microchip AVR64EA48 Device Support Pack AVR-Dx_DFP 2.2.56+

请注意两种 IDE 分别对应不同的案例代码,分别于 Microchip Github 不同的仓库地址(见参考资料 [4] 和 [5] )获取。

我使用的是 MPLAB® X IDE v6.25,后续将以此 IDE 为例进行介绍。


Median Filter 案例的使用步骤

现在我们记录一下 中值滤波器(Median Filter) 的案例使用情况。

1. 准备工作

首先,准备好 MPLAB® X IDE 和 AVR64EA48 Curiosity Nano 板子,我的板子如下:

图5 AVR64EA48 Curiosity Nano 板子

图5 AVR64EA48 Curiosity Nano 板子

由于 AVR64EA48 Curiosity Nano 板子自带 Debugger 芯片,在插上电脑后,MPLAB® X IDE 能自动识别出板子:

图5 MPLAB® X IDE 识别 AVR64EA48 Curiosity Nano

图5 MPLAB® X IDE 识别 AVR64EA48 Curiosity Nano

2. 获取代码

在 MPLAB Discover 中可以看到官方支持的所有案例,其中就有 “Digital Filters using MPLAB X” 和 “Digital Filters using Microchip Studio”,我们用的是前者:

图6 MPLAB Discover 中的代码案例

图6 MPLAB Discover 中的代码案例

在 “Digital Filters using MPLAB X” 可以看到代码简介,然后点击右上角 “Download” 下载代码(与直接从 Microchip Github 代码库下载一样):

图7 Digital Filters using MPLAB X 案例

图7 Digital Filters using MPLAB X 案例

3. 工程操作

在 IDE 中导入代码工程,更新 Device Family Pack,执行编译、下载和运行操作,通常可顺利完成。

图8 Median Filter 案例工程

图8 Median Filter 案例工程

4. 数据可视化

打开 MPLAB® X IDE 中的 Data Visualizer,加载代码工程目录下的 data_visualizer.dvws 文件,开启串口(在我图中串口号是 ttyACM0)后效果如下:

图9 在 DV 中查看 Median Filter 运行效果

图9 在 DV 中查看 Median Filter 运行效果

蓝色曲线为原始信号(代码中预存的吉他音波形),绿色曲线为中值滤波后的信号。中值滤波器有效去除了信号中的尖峰,使滤波后的波形更为平滑。


Median Filter 案例的代码解释

我们通过查看 main 函数可以看到代码逻辑(参考图 8)。

原始信号储预存在 sinewave 数组中。

每次取一个原始信号数据(original),并经由 MEDIANFILTER_Insert 函数计算,输出一个滤波后信号数据(filtered)。

这两个数据会通过串口传给 IDE 里的 Data Visualizer,data_visualizer.dvws 负责对这些数据的解析和呈现波形。

中值滤波算法的核心是“窗口 + 排序”,AN4515 中举了一个例子,比如 9 个数据的窗口,先对这些数据做大小排序,然后取中间排序第 5 个的数据作为“中值”:

图10 Median Filter 算法示意图

图10 Median Filter 算法示意图

实际代码中用的都是 UINT8/16 类型,窗口大小设定为 31 。

如果要测性能,代码中还预留了 GPIO 的 Toggle,以便于看 MEDIANFILTER_Insert 函数 的运行时间。


总结

本文基于 Microchip 的 AN4515 应用笔记,介绍了在 AVR64EA48 Curiosity Nano 板子上运行 中值滤波(Median Filter) 的案例。


参考资料

  1. https://ww1.microchip.com/downloads/aemDocuments/documents/MCU08/ApplicationNotes/ApplicationNotes/ProcessAnalogSensorDataDigitalFiltering-DS00004515.pdf
  2. https://www.microchip.com/en-us/development-tool/EV66E56A
  3. https://www.microchip.com/en-us/product/avr64ea48
  4. https://github.com/microchip-pic-avr-examples/avr64ea48-digital-filters-mplab-mcc
  5. https://github.com/microchip-pic-avr-examples/avr64ea48-digital-filters-studio

欢迎关注我的微信公众号“疯狂的运放”,及时收到最新的推文。