<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!--Rendered using the Haskell Html Library v0.2--> <HTML ><HEAD ><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8" ><TITLE >ForSyDe.Shallow.FilterLib</TITLE ><LINK HREF="haddock.css" REL="stylesheet" TYPE="text/css" ><SCRIPT SRC="haddock-util.js" TYPE="text/javascript" ></SCRIPT ><SCRIPT TYPE="text/javascript" >window.onload = function () {setSynopsis("mini_ForSyDe-Shallow-FilterLib.html")};</SCRIPT ></HEAD ><BODY ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="topbar" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD ><IMG SRC="haskell_icon.gif" WIDTH="16" HEIGHT="16" ALT=" " ></TD ><TD CLASS="title" >ForSyDe-3.1.1: ForSyDe's Haskell-embedded Domain Specific Language.</TD ><TD CLASS="topbut" ><A HREF="src/ForSyDe-Shallow-FilterLib.html" >Source code</A ></TD ><TD CLASS="topbut" ><A HREF="index.html" >Contents</A ></TD ><TD CLASS="topbut" ><A HREF="doc-index.html" >Index</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="modulebar" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD ><FONT SIZE="6" >ForSyDe.Shallow.FilterLib</FONT ></TD ><TD ALIGN="right" ><TABLE CLASS="narrow" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="infohead" >Portability</TD ><TD CLASS="infoval" >portable</TD ></TR ><TR ><TD CLASS="infohead" >Stability</TD ><TD CLASS="infoval" >experimental</TD ></TR ><TR ><TD CLASS="infohead" >Maintainer</TD ><TD CLASS="infoval" >forsyde-dev@ict.kth.se</TD ></TR ></TABLE ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="section4" ><B >Contents</B ></TD ></TR ><TR ><TD ><DL ><DT ><A HREF="#1" >FIR filter </A ></DT ><DT ><A HREF="#2" >AR and ARMA filter trim </A ></DT ><DT ><A HREF="#3" >The solver mode </A ></DT ><DT ><A HREF="#4" >The general linear filter in S-domain </A ></DT ><DT ><A HREF="#5" >The general linear filter in Z-domain </A ></DT ><DT ><A HREF="#6" >s2z domain coefficient tranformation </A ></DT ><DT ><A HREF="#7" >The Z-domain to ARMA coefficient tranformation </A ></DT ></DL ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" >Description</TD ></TR ><TR ><TD CLASS="doc" ><P >This is the filter library for ForSyDe heterogeneous MoCs - CT-MoC, SR-MoC, and Untimed-MoC. </P ><P >The filters at CT-MoC are based on the filters implemented at SR-MoC and Untimed-MoC, which means a signal in CT-MoC is always digitalized by a A/D converter, processed by digital filters at SR or Untimed domain, and converted back into a CT domain signal by a D/A converter. A CT-filter is composed of one A/D converter, one digital filter, and one D/A converter. </P ><P >The implementation of the filters at untimed and synchronous domains follows the way in a paper /An introduction to Haskell with applications to digital signal processing, David M. Goblirsch, in Proceedings of the 1994 ACM symposium on Applied computing./, where the details of the FIR/IIR, AR, and ARMA filters are introduced. The ARMA filter is the kernel part of our general linear filter <TT ><A HREF="ForSyDe-Shallow-FilterLib.html#v%3AzLinearFilter" >zLinearFilter</A ></TT > in Z-domain at SR/Untimed MoC, and is also the kernel digital filter for the linear filter <TT ><A HREF="ForSyDe-Shallow-FilterLib.html#v%3AsLinearFilter" >sLinearFilter</A ></TT > in S-domain at CT-MoC. </P ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" >Synopsis</TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="#v%3AfirFilter" >firFilter</A > :: <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ANum" >Num</A > a => [a] -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AarFilterTrim" >arFilterTrim</A > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ANum" >Num</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3AFractional" >Fractional</A > a) => [a] -> a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AarmaFilterTrim" >armaFilterTrim</A > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ANum" >Num</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3AFractional" >Fractional</A > a) => [a] -> [a] -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >data</SPAN > <A HREF="#t%3ASolverMode" >SolverMode</A > </TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" >= <A HREF="#v%3AS2Z" >S2Z</A ></TD ></TR ><TR ><TD CLASS="decl" >| <A HREF="#v%3ARK4" >RK4</A ></TD ></TR ></TABLE ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AsLinearFilter" >sLinearFilter</A > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ANum" >Num</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3AFractional" >Fractional</A > a) => <A HREF="ForSyDe-Shallow-FilterLib.html#t%3ASolverMode" >SolverMode</A > -> <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ARational" >Rational</A > -> [a] -> [a] -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > (<A HREF="ForSyDe-Shallow-CTLib.html#t%3ASubsigCT" >SubsigCT</A > a) -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > (<A HREF="ForSyDe-Shallow-CTLib.html#t%3ASubsigCT" >SubsigCT</A > a)</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AzLinearFilter" >zLinearFilter</A > :: <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3AFractional" >Fractional</A > a => [a] -> [a] -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3As2zCoef" >s2zCoef</A > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ANum" >Num</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3AFractional" >Fractional</A > a) => <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ARational" >Rational</A > -> [a] -> [a] -> ([a], [a])</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3Ah2ARMACoef" >h2ARMACoef</A > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ANum" >Num</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3AFractional" >Fractional</A > a) => ([a], [a]) -> ([a], [a])</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="1" ><A NAME="1" >FIR filter </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:firFilter" ><A NAME="v%3AfirFilter" ></A ></A ><B >firFilter</B ></TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-FilterLib.html#firFilter" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="arg" >:: <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ANum" >Num</A > a</TD ><TD CLASS="rdoc" ></TD ></TR ><TR ><TD CLASS="arg" >=> [a]</TD ><TD CLASS="rdoc" >Coefficients of the FIR filter </TD ></TR ><TR ><TD CLASS="arg" >-> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a</TD ><TD CLASS="rdoc" >Input signal </TD ></TR ><TR ><TD CLASS="arg" >-> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a</TD ><TD CLASS="rdoc" >Output signal </TD ></TR ><TR ><TD CLASS="ndoc" COLSPAN="2" >The FIR filter. Let '[x_n]' denote the input signal, '[y_n]' denote the ouput signal, and '[h_n]' the impulse response of the filter. Suppose the length of the impulse responses is M samples. The formula for '[y_n]' is $sum_{k=0}^{M-1} h_k*x_{n-k}$. </TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="2" ><A NAME="2" >AR and ARMA filter trim </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:arFilterTrim" ><A NAME="v%3AarFilterTrim" ></A ></A ><B >arFilterTrim</B ></TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-FilterLib.html#arFilterTrim" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="arg" >:: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ANum" >Num</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3AFractional" >Fractional</A > a)</TD ><TD CLASS="rdoc" ></TD ></TR ><TR ><TD CLASS="arg" >=> [a]</TD ><TD CLASS="rdoc" >Coefficients of the AR filter. </TD ></TR ><TR ><TD CLASS="arg" >-> a</TD ><TD CLASS="rdoc" >The gain </TD ></TR ><TR ><TD CLASS="arg" >-> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a</TD ><TD CLASS="rdoc" >Input signal </TD ></TR ><TR ><TD CLASS="arg" >-> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a</TD ><TD CLASS="rdoc" >Output signal </TD ></TR ><TR ><TD CLASS="ndoc" COLSPAN="2" >The autoregressive filter is the simplest IIR filter. It is characterized by a list of numbers '[a_1,a_2,...,a_M]' called the autoregression coefficients and a single number b called the gain. M is the order of the filter. Let '[x_n]' denote the input signal, '[y_n]' denote the ouput signal. The formula for '[y_n]' is $sum_{k=1}^M {a_k*y_{n-k}+b*x_n}$. Although it is an IIR filter, here we only get the same length of ouput signal as the input signal. </TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:armaFilterTrim" ><A NAME="v%3AarmaFilterTrim" ></A ></A ><B >armaFilterTrim</B ></TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-FilterLib.html#armaFilterTrim" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="arg" >:: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ANum" >Num</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3AFractional" >Fractional</A > a)</TD ><TD CLASS="rdoc" ></TD ></TR ><TR ><TD CLASS="arg" >=> [a]</TD ><TD CLASS="rdoc" >Coefficients of the FIR filter </TD ></TR ><TR ><TD CLASS="arg" >-> [a]</TD ><TD CLASS="rdoc" >Coefficients of the AR filter. </TD ></TR ><TR ><TD CLASS="arg" >-> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a</TD ><TD CLASS="rdoc" >Input signal </TD ></TR ><TR ><TD CLASS="arg" >-> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a</TD ><TD CLASS="rdoc" >Output signal </TD ></TR ><TR ><TD CLASS="ndoc" COLSPAN="2" >The ARMA filter combines the FIR and AR filters. Let '[x_n]' denote the input signal, '[y_n]' denote the ouput signal. The formula for '[y_n]' is $sum_{k=1}^M {a_k*y_{n-k}+b*x_n} + sum_{i=0}^{N-1} b_i*x_{n-i}$. The ARMA filter can be defined as the composition of an FIR filter having the impulse reponse '[b_0,b_1,...,b_N-1]' and an AR filter having the regression coefficients '[a_1,a_2,...,a_M]' and a gain of '1'. Although it is an IIR filter, here we only get the same length of ouput signal as the input signal. </TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="3" ><A NAME="3" >The solver mode </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><SPAN CLASS="keyword" >data</SPAN > <A NAME="t:SolverMode" ><A NAME="t%3ASolverMode" ></A ></A ><B >SolverMode</B > </TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-FilterLib.html#SolverMode" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="ndoc" >The solver mode. </TD ></TR ><TR ><TD CLASS="section4" >Constructors</TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="arg" ><A NAME="v:S2Z" ><A NAME="v%3AS2Z" ></A ></A ><B >S2Z</B ></TD ><TD CLASS="rdoc" >Tustin tranfer from s-domain to z-domain </TD ></TR ><TR ><TD CLASS="arg" ><A NAME="v:RK4" ><A NAME="v%3ARK4" ></A ></A ><B >RK4</B ></TD ><TD CLASS="rdoc" >Runge Kutta 4 with fixed simulation steps </TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:SolverMode')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:SolverMode" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > <A HREF="ForSyDe-Shallow-FilterLib.html#t%3ASolverMode" >SolverMode</A ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Text-Show.html#t%3AShow" >Show</A > <A HREF="ForSyDe-Shallow-FilterLib.html#t%3ASolverMode" >SolverMode</A ></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="4" ><A NAME="4" >The general linear filter in S-domain </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:sLinearFilter" ><A NAME="v%3AsLinearFilter" ></A ></A ><B >sLinearFilter</B ></TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-FilterLib.html#sLinearFilter" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="arg" >:: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ANum" >Num</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3AFractional" >Fractional</A > a)</TD ><TD CLASS="rdoc" ></TD ></TR ><TR ><TD CLASS="arg" >=> <A HREF="ForSyDe-Shallow-FilterLib.html#t%3ASolverMode" >SolverMode</A ></TD ><TD CLASS="rdoc" >Specify the solver mode </TD ></TR ><TR ><TD CLASS="arg" >-> <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ARational" >Rational</A ></TD ><TD CLASS="rdoc" >Fixed simulation interval </TD ></TR ><TR ><TD CLASS="arg" >-> [a]</TD ><TD CLASS="rdoc" >Coefficients of the polynomial numerator in s-domain </TD ></TR ><TR ><TD CLASS="arg" >-> [a]</TD ><TD CLASS="rdoc" >Coefficients of the polynomial denominator in s-domain </TD ></TR ><TR ><TD CLASS="arg" >-> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > (<A HREF="ForSyDe-Shallow-CTLib.html#t%3ASubsigCT" >SubsigCT</A > a)</TD ><TD CLASS="rdoc" >Input CT-signal </TD ></TR ><TR ><TD CLASS="arg" >-> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > (<A HREF="ForSyDe-Shallow-CTLib.html#t%3ASubsigCT" >SubsigCT</A > a)</TD ><TD CLASS="rdoc" >Output CT-signal </TD ></TR ><TR ><TD CLASS="ndoc" COLSPAN="2" ><P >The general linear filter in S-domain at CT-MoC. As the kernel implementation is in Z-domain, the smapling rate should be specified. It is used on the S-transformation with the following forms, with coefficients for the descending powers of s and m < n. </P ><PRE > b_0*s^m + b_1*s^m-1 + ... + b_m-1*s^1 + b_m*s^0 H(s) = ------------------------------------------------ (Eq 1) a_0*s^n + a_1*s^n-1 + ... + a_n-1*s^1 + a_n*s^0 </PRE ><P >If we multiply both the numerator and the denominator with s^-n, we get another equivelent canonical form </P ><PRE > b_0*s^m-n + b_1*s^m-n-1 + ... + b_m-1*s^1-n + b_m*s^-n H(s) = ----------------------------------------------------- (Eq 2) a_0*s^0 + a_1*s^-1 + ... + a_n-1*s^1-n + a_n*s^-n </PRE ><P >To instantiate a filter, with sampling interval 'T ', we use </P ><PRE > filter1 = sLinearFilter T [1] [2,1] </PRE ><P >to get a filter with the transfer function </P ><PRE > 1 H(s) = -------- 2*s + 1 </PRE ><P >and </P ><PRE > filter2 = sLinearFilter T [2,1] [1,2,2] </PRE ><P >to get another filter with the transfer function </P ><PRE > 2*s +1 H(s) = ---------------- s^2 + 2*s + 2 </PRE ><P >There are two solver modes, <TT ><A HREF="ForSyDe-Shallow-FilterLib.html#v%3AS2Z" >S2Z</A ></TT > and <TT ><A HREF="ForSyDe-Shallow-FilterLib.html#v%3ARK4" >RK4</A ></TT >. Caused by the precision problem, the time interval in CT uses Rational data type and the digital data types in all the domains are Double. </P ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="5" ><A NAME="5" >The general linear filter in Z-domain </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:zLinearFilter" ><A NAME="v%3AzLinearFilter" ></A ></A ><B >zLinearFilter</B > :: <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3AFractional" >Fractional</A > a => [a] -> [a] -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a</TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-FilterLib.html#zLinearFilter" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="doc" >The general linear filter in Z-domain. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="6" ><A NAME="6" >s2z domain coefficient tranformation </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:s2zCoef" ><A NAME="v%3As2zCoef" ></A ></A ><B >s2zCoef</B ></TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-FilterLib.html#s2zCoef" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="arg" >:: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ANum" >Num</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3AFractional" >Fractional</A > a)</TD ><TD CLASS="rdoc" ></TD ></TR ><TR ><TD CLASS="arg" >=> <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ARational" >Rational</A ></TD ><TD CLASS="rdoc" >Sampling rate in Z-domain </TD ></TR ><TR ><TD CLASS="arg" >-> [a]</TD ><TD CLASS="rdoc" >Coefficients of the polynomial numerator in s-domain </TD ></TR ><TR ><TD CLASS="arg" >-> [a]</TD ><TD CLASS="rdoc" >Coefficients of the polynomial denominator in s-domain </TD ></TR ><TR ><TD CLASS="arg" >-> ([a], [a])</TD ><TD CLASS="rdoc" >Tuple of the numerator and denominator coefficients in Z-domain </TD ></TR ><TR ><TD CLASS="ndoc" COLSPAN="2" ><P >s2z domain coefficient tranformation with a specified sampling rate. The Tustin transformation is used for the transfer, with </P ><PRE > 2(z - 1) s = ---------- (Eq 3) T(z + 1) </PRE ><P >in which, T is the sampling interval. </P ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="7" ><A NAME="7" >The Z-domain to ARMA coefficient tranformation </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:h2ARMACoef" ><A NAME="v%3Ah2ARMACoef" ></A ></A ><B >h2ARMACoef</B ></TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-FilterLib.html#h2ARMACoef" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="arg" >:: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3ANum" >Num</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Prelude.html#t%3AFractional" >Fractional</A > a)</TD ><TD CLASS="rdoc" ></TD ></TR ><TR ><TD CLASS="arg" >=> ([a], [a])</TD ><TD CLASS="rdoc" >Coefficients in Z-domain </TD ></TR ><TR ><TD CLASS="arg" >-> ([a], [a])</TD ><TD CLASS="rdoc" >Coefficients of the ARMA filter </TD ></TR ><TR ><TD CLASS="ndoc" COLSPAN="2" ><P >The Z-domain to ARMA coefficient tranformation. It is used on the Z-transfer function </P ><PRE > b_0*z^m-n + b_1*z^m-n-1 + ... + b_m-1*z^1-n + b_m*z^-n H(z) = ----------------------------------------------------- (Eq 4) a_0*z^0 + a_1*z^-1 + ... + a_n-1*z^1-n + a_n*z^-n </PRE ><P >which is normalized as </P ><PRE > b_0/a_0*z^m-n + b_1/a_0*z^m-n-1 + ... + b_m/a_0*z^-n H(z) = ------------------------------------------------------- (Eq 5) 1 + a_1/a_0*z^-1 + ... + a_n-1/a_0*z^1-n + a_n/a_0*z^-n </PRE ><P >The implementation coudl be </P ><PRE >y(k) = b_0/a_0*x_k+m-n + b_1/a_0*x_k+m-n-1 + ... + b_m/a_0*x_k-n (Eq 6) - a_1/a_0*y_k-1 - ... - a_n/a_0*y_k-n </PRE ><P >Then, we could get the coefficients of the ARMA filter. </P ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="botbar" >Produced by <A HREF="http://www.haskell.org/haddock/" >Haddock</A > version 2.6.1</TD ></TR ></TABLE ></BODY ></HTML >