采用MAXQ2000进行音频滤波

发布时间:2023-07-03  

摘要:集成了乘累加单元(MAC)和单周期内核的MAXQ2000非常适合用作通用微控制器(µC) 。MAXQ2000所具有的性能和I/O外设适合多种应用:如闹钟、手持医疗设备、数字读取器等需要低功耗、高性能和大量I/O的应用。集成MAC的MAXQ2000已可以进入DSP (µC)的应用领域。

MAXQ2000的MAC能够发挥多大的性能?本应用笔记以一个音频滤波器为例来解释此问题,并定量给出MAXQ2000支持的性能。

软件和硬件要求

本应用笔记简单演示一个音频滤波器。音频数据事先录制,是由作者朗读的 "The pipe began to rust while new"。这并不是随机选择的,它含有适当的频率组合,可以检验滤波器的效果(http://www.cs.columbia.edu/~hgs/audio/harvard.html )。该音频录音可以用任意合适长度的8kHz录音替代,但并不必要。

本应用笔记要求的硬件包括MAXQ2000评估板和实现与计算机扬声器接口的简单电路。

现已提供的MAXQ2000评估板是了解MAXQ2000性能的最佳工具,它包括一块LCD面板、一组LED。可通过评估板访问MAXQ2000的所有I/O引脚。评估板集成的MAX1407 ADC/DAC可用于音频输出。

所需的第二部分硬件可由电路实验板方便实现。演示使用的电路如图1所示。它使用一个1 x 8的孔插座在J7处连接MAXQ2000评估板,需要和任意地电位相连(可选择MAXQ2000评估板上的TP1)。扬声器连接器可以是任意类型,图中所示为一个3.5mm立体声插孔,可方便实现与常用计算机扬声器连接。注意两输入通道并联,因为我们的演示仅使用一个音频通道(单声道)。

图1. 音频回放所需的其它硬件
图1. 音频回放所需的其它硬件

该演示所需的软件采用IAR嵌入式平台创建并调试。该平台提供一个良好的调试环境,使用了MAXQ2000的硬件调试支持。可设置断点,设置或读取寄存器和存储器,在真实硬件环境中运行时可查看堆栈调用。

运行演示

MAXQ2000评估板上的按键用于选择滤波器,并播放经过滤波的音频采样。使用按键SW4选择滤波器,滤波器名称将显示在LCD上(HI为高通、LO为低通、BP为带通,ALL为全通)。使用按键SW5播放通过所选滤波器的音频。可在播放期间切换滤波器。

设计一个简单的FIR滤波器

本文使用一个Java™小应用程序来方便的产生新的滤波器。没有采用标准加窗技术给出滤波器参数,而是如图2所示,在零极点图上放置零点来简单“设计”滤波器。小应用程序可在坐标平面任意位置放置零点,自动更新演示所需FIR滤波器的参数。注意,演示仅支持全零点滤波器。支持IIR滤波器并不困难,在支持IIR滤波器一节中有详细解释。

图2. 使用零极点图来生成一个简单的FIR滤波器
图2. 使用零极点图来生成一个简单的FIR滤波器

普通滤波器的线性方程为:

y(n) +bKy(k) =aJx(j)

其中k表示滤波器反馈部分的阶数,j表示滤波器前馈部分的阶数。

一个IIR滤波器可由下式简单表示:

y(n) = 0.5y(n-1) + x(n) - 0.8x(n-1)

一些滤波器被归类为FIR滤波器,不包括反馈部分。换句话说,在滤波器特征方程中不包括y部分:

y(n) =aJx(j)
y(n) = x(n) - 0.2x(n - 1) + 0.035x(n - 3)

任何情况下滤波器都可归结为一个特征方程,本质上是过去的输入和输出的加权平均。滤波器设计即生成Aj和Bk值。为高效计算滤波器输出,需要能快速乘和加有符号数硬件的支持,这就是MAXQ2000的乘-累加单元。

使用乘-累加(MAC)单元实现一个滤波器

上一节中的小应用程序可通过在图中指定零点坐标计算滤波器参数。但计算结果为浮点数,而MAC为纯16位整数运算。为解决这一问题,本演示采用了一个定点数值系统,参数的0至15位为小数点右侧的数值(第16位代表符号极性)。运算完成后,MAC累加器中的48位结果通过移位去掉剩余部分。

这种解决方法是精度和速度的折衷。在许多情况下,该方法产生的误差可忽略。出于诊断目的,小应用程序可显示所计算滤波器的三条曲线。第一条曲线采用64位浮点数显示理想滤波器的运行状态。该曲线在图2中以“Ideal Transform”标示。

图3画出了由小应用程序产生的其余曲线。其中第一条曲线显示采用16位定点数的滤波效果。在许多情况下,误差并不明显。最后一条曲线为误差指示,显示的是理想频响除以实际频响。理想情况下,这是一条Y = 1的直线。

图3. 16位滤波器实际效果和舍入误差(视觉上没有误差)
图3. 16位滤波器实际效果和舍入误差(视觉上没有误差)

简单起见,小应用程序产生MAXQ®滤波器所需的浮点参数,因此,新滤波器可简单通过将其剪切并粘贴到滤波器源文件(data.asm文件)中实现。小应用程序还产生另外两个值,即滤波器阶数(参数个数)和移位数,应用程序可适当移位最终结果。数据出现在小应用程序底部文本框中,可能会以以下方式呈现:

Zeroes:    dc16
    dc16 12, 11, 0x1000, 0x26d3, 0x1e42, 0xf9a3, 0xecde, 0xff31, 0xa94,
         0x2ae, 0xfd0c, 0xff42, 0xde
Shift amount: 12

用MAXQ汇编语言实现滤波器

为得到最佳性能,并进行准确的性能分析,实际滤波器采用汇编语言实现,这样可精确计算产生一个输出所需的循环次数,并由此估算其它数据设置的性能。

MAX1407含有一个12位ADC。而输入数据为16位宽度,滤波器产生16位结果。尽管4个最低有效位(LSB)在本应用中没有用到,但仍可按16位计算和输出正常分析其性能(CD质量的音频为16位)。

本例中,滤波器参数存储在代码区的表中。选择一个滤波器后,应用程序找到合适的滤波器,读取移位数及抽头数,然后准备开始数字滤波。以下代码应用了滤波器参数:

    move  MCNT, #22h           ; signed, mult-accum, clear regs first

zeroes_filterloop:
    move  A[0], DP[0]          ; let's see if we are out of data
    cmp   #W:rawaudiodata      ; compare to the start of the audio data
    lcall UROM_MOVEDP1INC      ; get next filter coefficient
    move  MA, GR               ; multiply filter coefficient...
    lcall UROM_MOVEDP0DEC      ; get next filter data
    move  MB, GR               ; multiply audio sample...
    jump  e, zeroes_outofdata  ; stop if at the start of the audio data
    djnz  LC[0], zeroes_filterloop

zeroes_outofdata:
    move  A[2], MC2            ; get MAC result HIGH
    move  A[1], MC1            ; get MAC result MID
    move  A[0], MC0            ; get MAC result LOW

执行该代码前,LC[0]装入滤波器抽头数,DP[0]装入滤波器当前输入字节地址,DP[1]装入滤波器参数起始地址。DP[1]以递增方式处理滤波器参数,DP[0]以递减方式处理输入数据(最近输入的数据首先处理)。

由于MAC以单周期工作,处理代码较少。MCNT置为22h代表采用有符号整数。在主循环中,连续写入MA,然后写MB触发乘-累加运算,结果在下一个时钟周期准备就绪。由于累加器为48位(乘的结果为32位),因此不会产生溢出(除非滤波器中有64,000个抽头!)。

性能

该应用处理单声道16位音频数据并产生8kHz输出,还没有完全发挥微控制器的能力。由于使用汇编语言编写滤波器,可用一个表达式方便算出用于计算长度为N的FIR滤波器所需的周期数。然后还可使用该表达式计算出采用前面所列算法的最大滤波速率。

可将用于产生音频采样的功能分成3部分:初始化、滤波器计算循环以及结果修正。在该例中,初始化需要38个周期,滤波器计算中每个滤波器参数需要17个周期,结果修正需要9 + (6 x S)个周期,其中S是移位数。通常,移位数为12,则结果修正为81个周期。因此,需要119 + (17 x N)个周期产生一个滤波输出结果。20MHz时,MAXQ2000可以运行近11kHz的100抽头滤波器,这已经是相当好的语音质量。

现在回到前面重新分析应用程序以进一步进行简化。我们将主要针对滤波器循环,因为此处占用了多数周期,并且最烦琐。

还可以对循环代码进行几处关键改进以提高效率。注意,我们采用了预先录制并存储在代码区的音频采样。由于MAXQ采用哈佛体系结构,因此查找代码空间比查找数据空间需要更多的时间。称为UROM_MOVEDP1INC和UROM_MOVEDP0DEC的函数每个执行需要5个周期(LCALL为2周期,函数内部为3周期)。如果滤波器存储在RAM中并处理存储在RAM中的实时输入数据,则每个只需两周期(一个周期选择指针,一个周期读)。如果将RAM中的256个字用于滤波器,可用BP[Offs]实现一个环形缓冲区来存储输入数据。这些改动可将循环时间由17个周期缩短为11个。这样的滤波器循环为下所示(在注释中首先列出所需周期数):

zeroes_filterloop:

    move  A[0], DP[0]          ; 1, let's see if we are out of data

    cmp   #W:rawaudiodata      ; 2, compare to the start of the audio data

    move  DP[1], DP[1]         ; 1, select DP[1] as our active pointer

    move  GR, @DP[1]++         ; 1, get next filter coefficient

    move  MA, GR               ; 1, multiply filter coefficient...

    move  BP, BP               ; 1, select BP[Offs] as our active pointer

    move  GR, @BP[Offs--]      ; 1, get next filter data

    move  MB, GR               ; 1, multiply audio sample...

    jump  e, zeroes_outofdata  ; 1, stop if at the start of the audio data

    djnz  LC[0], zeroes_filterloop  ; 1

将滤波器及输入数据装入RAM后还可以利用MAXQ体系结构的另一特点。MAXQ指令集高度不相关,在任何操作中,对采用何种源几乎没有限制。因此,可不将滤波器数据和输入数据读入GR,而是直接写入MAC寄存器。这样可使循环降至9个周期。

zeroes_filterloop:

    move  A[0], DP[0]          ; 1, let's see if we are out of data

    cmp   #W:rawaudiodata      ; 2, compare to the start of the audio data

    move  DP[1], DP[1]         ; 1, select DP[1] as our active pointer

    move  MA, @DP[1]++         ; 1, multiply next filter coefficient

    move  BP, BP               ; 1, select BP[Offs] as our active pointer

    move  MB, @BP[Offs--]      ; 1, multiply next filter data

    jump  e, zeroes_outofdata  ; 1, stop if at the start of the audio data

    djnz  LC[0], zeroes_filterloop  ; 1

最后的修改可极大改进该代码。每次循环时,比较当前数据指针和音频输入数据起始位置,以查看是否越界(MOVE A[0], DP[0]语句,CMP比较语句以及JUMP E语句)。如果设置初始音频数据(现在正在读取的、BP[Offs]指向的环形缓冲)为全零,则可以省略这些检查。与后面的几千次采样每次节省4周期相比,RAM初始化为全零的时间可忽略,新的循环代码缩减至5个周期。

zeroes_filterloop:

    move  DP[1], DP[1]         ; 1, select DP[1] as our active pointer

    move  MA, @DP[1]++         ; 1, multiply next filter coefficient

    move  BP, BP               ; 1, select BP[Offs] as our active pointer

    move  MB, @BP[Offs--]      ; 1, multiply next filter data

    djnz  LC[0], zeroes_filterloop  ; 1

在回到性能方程之前,先查看一下结果计算。看起来当前并不需要移位48位结果。

    move  A[2], MC2            ; get MAC result HIGH

    move  A[1], MC1            ; get MAC result MID

    move  A[0], MC0            ; get MAC result LOW

    move  APC, #0C2h           ; clear AP, roll modulo 4, auto-dec AP


shift_loop:

    ;

    ; Because we use fixed point precision, we need to shift to get a real

    ; sample value.  This is not as efficient as it could be.  If we had a

    ; dedicated filter, we might make use of the shift-by-2 and shift-by-4

    ; instructions available on MAXQ.

    ;

    move  AP, #2               ; select HIGH MAC result

    move  c, #0                ; clear carry

    rrc                        ; shift HIGH MAC result

    rrc                        ; shift MID MAC result

    rrc                        ; shift LOW MAC result

    djnz  LC[1], shift_loop    ; shift to get result in A[0]

    move APC, #0               ; restore accumulator normalcy

    move AP, #0                ; use accumulator 0

一个可能的方法是再次采用MAC。不采取右移12位(或0和16间的任一数值),而是向左移16减去该值的位数(如左移4位)。这会使结果处于MAC寄存器16位字的中间。注意,左移的实际结果是乘以2的若干次幂(假如开始准备右移12位时,为16)。

    ;

    ; don't care about high word, since we shift left and take the

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    趋向于零时求解极限,我们得到:值得关注的 x 实例是组成滤波器的电阻和电容值。y 实例是定义滤波器参数:通带增益、Q 和 ω 0 = 2π·f 0。以下是如何计算图 1中低通滤波器的各种 S 值的......
    作方式类似于整个电路的输入缓冲器、带通滤波器和输出驱动器。 电阻R1和R2、电位计R3和单位增益缓冲器IC1a构成输入电路上的混频器和分压器级。 R3是一个电位计,可用......
    均衡器类型。 4 EQ可调整的参数滤波器参数) 采样率:数字音频信号的采样频率; 中心频率:进行滤波的中心点,即提升或衰减频段的峰点或谷点对应的频率; 增益:中心频率处的增益; Q值:定义滤波器......
    是这些测量系统中的信号链设计的重要组成部分,有助于防止带外信号和噪声折叠到目标信号带宽中。 信号处理电路通常选择有源滤波器,而不选择无源滤波器,原因是有源滤波器提供的输出功率增益和频率范围可通过修改滤波器参数......
    是这些测量系统中的信号链设计的重要组成部分,有助于防止带外信号和噪声折叠到目标信号带宽中。 信号处理电路通常选择有源,而不选择无源,原因是有源滤波器提供的输出功率增益和频率范围可通过修改滤波器参数来轻松调整。巴特沃兹、椭圆、贝塞尔和切比雪夫滤波器是四种最常见的有源滤波器......
    是这些测量系统中的信号链设计的重要组成部分,有助于防止带外信号和噪声折叠到目标信号带宽中。 信号处理电路通常选择有源,而不选择无源,原因是有源滤波器提供的输出功率增益和频率范围可通过修改滤波器参数......
    放实现 图18 如果用参数非常接近的元件组成带通滤波器,就很容易发生振荡。接到虚地的电阻最好在E-96 1%系列中选择,这样......
    功能可在其 3 个输出引脚上提供。这 3 个引脚中的 2 个始终提供低通和带通滤波功能,而第三个输出引脚则能够提供高通或者陷波或全通滤波功能。这些滤波器......
    、Chebyshev滤波器和Bessel滤波器。这些滤波器类型各有优缺点,需要根据具体的应用来选择。 3、计算滤波器参数 选择滤波器类型后,需要计算滤波器的参数。这包括滤波器的阶数、通带......
    的Q因子来微调从通带到阻带的转换;此参数表示频率响应的阻尼程度。如果将两个相同的RC低通滤波器级联,则整体传递函数对应于二阶响应,但Q因子始终为0.5。当Q......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>