国外课栈 - 国外电子信息技术

ARM Mbed数字信号处理

 二维码 8
文章附图

背景知识视频教程

信号处理对于许多应用而言很重要。 借助现代计算机的强大功能,许多信号处理功能现在都可以通过数字方式完成。 本文,我们将说明如何使用Arm Mbed -DSP库进行数字信号处理和控制。

低通滤波器

在Arm Mbed 网站上,有关于如何设计和实现低通FIR(有限脉冲响应)滤波器的出色教程。 我们基本上将遵循该示例,并将其扩展到高通滤波器和带通/停止滤波器。

首先,我们需要使用MATLAB软件(www.mathworks.com)创建数字滤波器。 数字滤波器设计是一个复杂的主题,因为它涉及复杂的数学运算。 MATLAB有一个信号处理工具箱,可以使数字滤波器的设计更加简单。 FIR(有限脉冲响应)滤波器和IIR(无限脉冲响应)滤波器是常用的数字滤波器。 这里使用FIR滤波器,因为它不需要反馈环路并且更稳定。

以下是MATLAB代码,该代码使用“ fir1”函数创建了低通滤波器。 采样率为48,000 Hz,奈奎斯特频率为采样频率24,000 Hz的一半,截止频率为6000 Hz。 “ fir1”功能在归一化的频率范围(0到1)中创建一个28阶数字滤波器,其中1代表奈奎斯特频率,即24,000 Hz。 因此,归一化的截止频率将为6000 / 24,000 = –¼,或0.25。

</>

下图显示了FIR低通滤波器及其29个(+1阶)系数。 现在,我们可以在mbed程序中使用这些系数来实现低通数字滤波器。

fir_coeff =
-0.0018 -0.0016 0.0000 0.0037 0.0081 0.0085 -0.0000 -0.0174
-0.0341 -0.0334 0.0000 0.0676 0.1522 0.2229 0.2505 0.2229
0.1522 0.0676 0.0000 -0.0334 -0.0341 -0.0174 -0.0000 0.0085
0.0081 0.0037 0.0000 -0.0016 -0.0018

以下是使用上述FIR低通滤波器系数的mbed示例。 它首先使用1000 Hz正弦波和15,000 Hz正弦波生成混合信号(32×20点),然后使用FIR低通滤波器滤除15,000 Hz。 最后,它通过虚拟COM端口将原始信号和滤波后的信号打印到计算机上。 在下图中,滤波后的信号上移了3 V,因此我们可以分别查看两个信号。

在此程序中,您将需要mbed-DSP库

</>

下图显示了使用Arduino串行绘图仪的程序输出,原始混合信号在底部,滤波后的信号在顶部。 如我们所见,经过滤波后,仅剩下1000 Hz信号。

高通滤波器

下图显示了相应的FIR高通滤波器及其29个(+1阶)系数。 现在,我们可以在mbed程序中使用这些系数来实现低通数字滤波器。

fir_coeff =
0.0018 0.0016 -0.0000 -0.0037 -0.0080 -0.0085 -0.0000 0.0173
0.0340 0.0332 -0.0000 -0.0674 -0.1516 -0.2221 0.7487 -0.2221
-0.1516 -0.0674 -0.0000 0.0332 0.0340 0.0173 -0.0000 -0.0085
-0.0080 -0.0037 -0.0000 0.0016 0.0018

修改上述C程序,并使用新值更改FIR系数,如下所示。

</>

下图显示了使用Arduino串行绘图仪的程序输出,原始混合信号在底部,滤波后的信号在顶部。 正如我们这次看到的,经过滤波后,仅剩下15,000 Hz的信号。

带通滤波器

对于带通滤波器,修改上述MATLAB代码,在这种情况下,仅允许通过0.5×24,000(12,000 Hz)到0.7×24,000(16,800 Hz)之间的频率。 其他频率被阻止。 下图显示了相应的FIR带通滤波器及其29个(+1阶)系数。

现在,我们可以在mbed程序中使用这些系数来实现带通数字滤波器。

fir_coeff =
-0.0011 -0.0030 0.0033 0.0010 0.0000 -0.0024 -0.0171 0.0332
0.0207 -0.0974 0.0400 0.1292 -0.1494 -0.0622 0.2069 -0.0622
-0.1494 0.1292 0.0400 -0.0974 0.0207 0.0332 -0.0171 -0.0024
0.0000 0.0010 0.0033 -0.0030 -0.0011

修改上例,并使用新值更改FIR系数,如下所示

</>

下图显示了使用Arduino串行绘图仪的程序输出,原始混合信号在底部,滤波后的信号在顶部。 正如我们这次看到的那样,经过带通滤波后,仅剩下15,000 Hz的信号。

带阻滤波器和陷波滤波器

对于带阻滤波器,请修改上述 MATLAB代码,并将“ fir1”功能行,在这种情况下,将阻止0.5×24,000(12,000 Hz)到0.7×24000(16,800 Hz)之间的频率,并允许使用其他频率。 当频带变得足够窄时,带阻滤波器将变成陷波滤波器。

fir_coeff =
0.0011 0.0029 -0.0032 -0.0010 -0.0000 0.0023 0.0165 -0.0320
-0.0200 0.0939 -0.0385 -0.1245 0.1440 0.0599 0.7974 0.0599
0.1440 -0.1245 -0.0385 0.0939 -0.0200 -0.0320 0.0165 0.0023
-0.0000 -0.0010 -0.0032 0.0029 0.0011

下图显示了相应的FIR带阻滤波器及其29个系数,可在mbed程序中使用它们来实现带阻数字滤波器。

修改上述示例,并使用新值更改FIR系数,如下所示

</>

下图显示了使用Arduino串行绘图仪的程序输出,原始混合信号在底部,滤波后的信号在顶部。 我们可以看到,滤波之后,停止了15,000 Hz信号,仅剩下1000 Hz信号。

快速傅立叶变换(FFT)

快速傅立叶变换(FFT)和逆FFT具有许多重要的应用。 在本节中,我们将展示如何使用mbed-DSP库执行FFT和逆FFT:

以下示例说明了如何使用“ arm_cfft_f32()”执行复杂的FFT。 “ arm_cfft_f32()”函数只能用于[16、32、64,…,4096]的数据长度,但可以同时用于FFT和逆FFT。 检查mbed-DSP库以获取功能的详细信息。

程序首先根据FFT长度(FFT_LEN)创建并初始化复数FFT实例S,在这种情况下为512点。 然后,它使用“ sin()”函数(30 Hz和100 Hz)生成混合频率信号,采样时间dt = 0.001秒; 因此,采样频率为Fmax = 1 / dt = 1000Hz,Nyquest频率为Fmax / 2 = 500Hz。 当我们要使用实信号时,我们将虚分量设置为零。 它还同时通过虚拟COM将原始混合信号打印到计算机。 然后,它将程序暂停5秒钟。 最后,它调用“ arm_cfft_f32()”以执行复杂的FFT,并调用“ arm_cmplx_mag_f32()”以计算变换后的信号的幅度,并通过虚拟COM将FFT变换信号的幅度打印到计算机。

</>

同样,我们可以使用Arduino串行绘图仪查看结果。 如下图所示,混合的原始信号在顶部,相应的FFT转换信号的幅度在底部。 由于FFT变换后的信号始终包含中间镜像的重复峰值,因此当我们可以清楚地看到两个频率峰值(30 Hz和100 Hz)时,我们只需要查看图的前半部分。 峰值也与原始信号幅度成正比(1.0和0.5)。

FFT的一个非常有趣的应用是我们可以修改FFT转换后的信号,例如应用低通滤波器或高通滤波器,然后执行逆FFT。 在下面的示例中,FFT之后,通过将低频分量(<50 Hz)设置为零来将其删除,这等效于应用高通滤波器。 然后使用“ arm_cfft_f32(S,samples,1,1)”功能执行逆FFT。

</>

下图显示了程序的相应四个后续输出。 每个输出之间有5秒的延迟。 下图(顶部)显示了原始的混合频率信号,(底部)显示了其对应的FFT频域信号。

下图(顶部)显示了去除了较低频率分量(<50 Hz)的FFT频域信号,下图(底部)显示了对应的逆FFT信号。 如我们所见,在重构信号中仅保留了高频分量。

同样,我们也可以使用FFT实现低通滤波器。 在下面的示例中,在进行FFT之后,通过将较高的频率分量(> 50 Hz)设置为零来将其删除。 这等效于应用低通滤波器。 然后通过使用“ arm_cfft_f32(S,samples,1,1)”函数执行逆FFT。

</>

下图(顶部)显示了去除了较高频率分量(> 50 Hz)的FFT频域信号,下图(底部)显示了相应的逆FFT信号。 我们可以看到,只有低频成分保留在重构信号中。

PID控制器

PID(比例-积分-微分)控制器是最常用的控制机制之一。 它是一种闭环控制器,可以在许多控制系统中使用,例如温度控制,巡航控制等。PID控制器连续计算误差值e(t)作为所需设定点与测量过程变量之间的差,并且 如以下等式中所述,基于比例,积分和微分项应用校正。

e(t)=设定值-过程变量

u(t)=

其中Kp,Ki和Kd是比例项,积分项和微分项的系数,而u(t)是将应用于系统的校正。

在Arm Mbed 设备中有多种实现PID控制器的方法。 最简单的方法是使用mbed-DSP库:

在此示例中,变量set_point是期望值,变量pv是测得的过程变量,变量u是通过PWM输出引脚进行的相应校正。 在这种情况下,变量pv连接到模拟输入引脚,并且电位计用于更改变量pv值。 然后将pv值和u值打印到虚拟COM端口。 (2 + u)将u值上移2伏,这有助于我们分别查看pv图和u图。

</>

下图显示了使用Arduino串行绘图仪的程序输出,变量pv值在底部,变量u值在顶部。 结果表明,变量pv值一变化,变量u值就相应地变化。 可以通过调整PID的Kp,Ki和Kd系数来减少u值变化时的表观振荡。

我们可以修改上面的示例,使其更灵活,如以下代码所示。 可以从计算机的虚拟COM端口获取Kp,Ki和Kd系数(如果有)。 如下图所示,Kp,Ki和Kd系数以三个由|隔开的数字发送。

</>

阅读完整文档

文章分类: 嵌入式ARM Mbed
分享到: