Direct Form 1

The most straightforward implementation is the Direct Form 1, which has the following difference equation:

or, if normalized:

Here the , and coefficients determine zeros, and , determine the position of the poles.

Flow graph of biquad filter in Direct Form 1:

Direct Form 2

The Direct Form 1 implementation requires four delay registers. An equivalent circuit is the Direct Form 2 implementation, which requires only two delay registers:

The Direct Form 2 implementation is called the canonical form, because it uses the minimal amount of delays, adders and multipliers, yielding in the same transfer function as the Direct Form 1 implementation. The difference equations for DF2 are:

where

 

//ASM example

/////////////////////////////////////////////////////////////
//                                                                     //
//     Process the audio stream                            //
//                                                                    //
/////////////////////////////////////////////////////////////

#include <def21262.h>
#define SECTIONS 3   /* Number of second-order sections (biquads) */

.section /pm seg_pmco;
.global _Cascaded_IIR_Filter_SIMD;
.extern inbuf;
.extern outbuf;
.extern delaybuf;
.extern coefficients;

_Cascaded_IIR_Filter_SIMD:

/*****************************************************************************
The algorithm:

IIR Second order sections - The cannonic second-order section implemented as
"Direct Form II" biquads.  Note that the SIMD architecture of the 2126x SHARC
family enables the two parallel execution units to filter the left and right
channel simultaneously.  All register moves and memory reads implicitly apply
to the shadow processing element (PEy) as well as the primary computational
unit (PEx).
*****************************************************************************

  Given the most general biquadratic (second order rational polynomial)

                b0 + b1'*z^-1 + b2'*z^-2
        H(z) = -------------------------- ,
                a0 + a1'*z^-1 + a2'*z^-2

  we may factor out the gain of the transfer function,

                b0     (b1'/a0)*z^-1 + (b2'/a0)*z^-2
        H(z) = ---- * -------------------------------
                a0     (a1'/b0)*z^-1 + (a2'/b0)*z^-2

  and normalize the coefficients, such that

                    a1*z^-1 + a2*z^-2
        H(z) = A * -------------------
                    b1*z^-1 + b2*z^-2

  where A = gain = b1'/a0

        a1 = a1'/b0,  a2 = a2'/b0,  b1 = b1'/a0,  b2 = b2'/a0

  This leaves only four true filter coefficients.  The gain values from
  all of the sections may be combined into a single channel gain applied
  apart from the inner computational loop.  With the simplified coefficients,
  the cannonic direct form II may be written as a pair of difference
  equations:

          w[n] = x[n] + a1*w[n-1] + a2*w[n-2]
          y[n] = w[n] + b1*w[n-1] + b2*w[n-2]

which leads to the following pseudocode:

read(x[n])
f12=0,                                                                     f2=w[n-1],           read(a1)
--- Loop --------------------------------------------------------------------
f12=a1*w[n-1], f8=f8 + f12,                                      f3=w[n-2],           read(a2)
f12=a2*w[n-2], f8=x[n] + a1*w[n-2],                        w[n-1] -> w[n-2]', read(b1)
f12=b1*w[n-2], w[n]=x[n] + a1*w[n-2] + a2*w[n-1],  f2=w[n-1],           read(b2)
f12=b2*w[n-1], f8=w[n] + b1*w[n-2],                        w[n] -> w[n-1]',   read(a1)
-----------------------------------------------------------------------------
                y[n]=f8 + f12

**************************************************************************/

  /*  Subroutine that implements the pseudocode above */

cascaded_biquad:
  bit set mode1 CBUFEN | PEYEN ;                    // Enable SIMD mode
   
  b0 = delaybuf;
  b1 = b0;
  b3 = inbuf;
  b4 = outbuf;
  b9 = coefficients;
  r0 = SECTIONS;

    f8=dm(i3,m1);                                          // read inbuf
    r12=r12 xor r12,  f2=dm(i0,m1),  f4=pm(i8,m8);
  lcntr=r0, do quads until lce;
          f12=f2*f4,      f8=f8+f12,      f3=dm(i0,m1),     f4=pm(i8,m8);
          f12=f3*f4,      f8=f8+f12,      dm(i1,m1)=f3,     f4=pm(i8,m8);
          f12=f2*f4,      f8=f8+f12,      f2=dm(i0,m1),     f4=pm(i8,m8);
quads:f12=f3*f4,      f8=f8+f12,      dm(i1,m1)=f8,     f4=pm(i8,m8);

  f8=f8+f12;
  rts (db);
  dm(i4,m1)=f8;
  bit clr mode1 CBUFEN | PEYEN;                  // disable SIMD mode

_Cascaded_IIR_Filter_SIMD.end:

//--------------------------------------------

 

Digital biquad filter的更多相关文章

  1. biquad filter实现

    原始频谱: LPF: HPF: 代码: #include<stdio.h> #include<stdlib.h> #include<errno.h> #includ ...

  2. 转载:EQ--biquad filter

    http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt https://arachnoid.com/BiQuadDesigner/index.html ...

  3. H5的Web Audio Api

    概述 研究Web Audio Api的主要原因是:工作中需要在ios中实现声音的淡出效果,主要是通过setInterval来改audio标签的volume属性实现的,但是ios上面volume属性是只 ...

  4. 《DSP using MATLAB》示例Example 8.27

    %% ------------------------------------------------------------------------ %% Output Info about thi ...

  5. 《DSP using MATLAB》示例Example 8.26

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  6. 《DSP using MATLAB》示例Example 8.24

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  7. 《DSP using MATLAB》示例Example 8.23

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  8. 《DSP using MATLAB》示例Example 8.22

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  9. 《DSP using MATLAB》示例Example 8.21

    %% ------------------------------------------------------------------------ %% Output Info about thi ...

随机推荐

  1. POJ1236 Network of Schools【强连通】

    题意: N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输,问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件 ...

  2. jquery 学习(一) - 选择器

    基本选择器(html) <div>123</div> <div id="n1">123</div> <span>321& ...

  3. vlc-android 的编译过程

    参考官方文档:https://wiki.videolan.org/AndroidCompile#Get_VLC_Source 值得注意的的地方: 1.切记安装以下工具 sudo apt-get ins ...

  4. 图文并茂的Python教程-numpy.pad

    图文并茂的Python教程-numpy.pad np.pad()常用与深度学习中的数据预处理,可以将numpy数组按指定的方法填充成指定的形状. 声明: 需要读者了解一点numpy数组的知识np.pa ...

  5. Statistics in Python

    Statistics in Python Materials for the “Statistics in Python” euroscipy 2015 tutorial. Requirements ...

  6. Pytorch 之 backward

    首先看这个自动求导的参数: grad_variables:形状与variable一致,对于y.backward(),grad_variables相当于链式法则dz/dx=dz/dy × dy/dx 中 ...

  7. GPIO接口解析【转】

    本文提供了一个linux下访问GPIO的约定的概述. 这些调用使用gpio_* 命名前缀.没有别的调用会使用这个前缀或是相关的__gpio_*前缀. 转自:http://blog.163.com/w5 ...

  8. python获取当前环境的编码

    # coding:gbk import sys import locale def p(f): print '%s.%s(): %s' % (f.__module__, f.__name__, f() ...

  9. 路由器中继(repeater)模式 和 AP+WDS模式区别?

    理论上的 中继(repeater)模式, 只有连接的最后一个才会有信号发出,中间的连接节点是没有信号发出的. AP+WDS模式:就是每一个路由都有信号发出,可以进行信号的全方位覆盖.

  10. KVM -> 虚拟机在线热添加技术_04

    热添加技术 1.KVM在线热添加硬盘