There is a distinction between fixedpoint filters and quantized filters — quantized filters represent a superset that includes fixedpoint filters.
When dfilt
objects have their Arithmetic
property set to single
or fixed
, they are
quantized filters. However, after you set the Arithmetic
property to fixed
, the resulting filter is both quantized and
fixedpoint. Fixedpoint filters perform arithmetic operations without allowing the
binary point to move in response to the calculation — hence the name
fixedpoint.
With the Arithmetic
property set to
single
, meaning the filter uses singleprecision floatingpoint
arithmetic, the filter allows the binary point to move during mathematical
operations, such as sums or products. Therefore these filters cannot be considered
fixedpoint filters. But they are quantized filters.
The following sections present the properties for fixedpoint filters, which include all the properties for doubleprecision and singleprecision floatingpoint filters as well.
Fixedpoint filters depend in part on fixedpoint objects from FixedPoint Designer™ software. You can see this when you display a fixedpoint filter at the command prompt.
hd=dfilt.df2t hd = FilterStructure: 'DirectForm II Transposed' Arithmetic: 'double' Numerator: 1 Denominator: 1 PersistentMemory: false States: [0x1 double] set(hd,'arithmetic','fixed') hd hd = FilterStructure: 'DirectForm II Transposed' Arithmetic: 'fixed' Numerator: 1 Denominator: 1 PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputFracLength: 15 StateWordLength: 16 StateAutoScale: true ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'
Look at the States property, shown here
States: [1x1 embedded.fi]
The notation embedded.fi
indicates that the states are being
represented by fixedpoint objects, usually called fi
objects. If
you take a closer look at the property States
, you see how the
properties of the fi
object represent the values for the filter
states.
hd.states ans = [] DataType: Fixed Scaling: BinaryPoint Signed: true WordLength: 16 FractionLength: 15 RoundMode: round OverflowMode: saturate ProductMode: FullPrecision MaxProductWordLength: 128 SumMode: FullPrecision MaxSumWordLength: 128 CastBeforeSum: true
As inputs (data to be filtered), fixedpoint filters accept both regular
doubleprecision values and fi
objects. Which you use depends on
your needs. How your filter responds to the input data is determined by the settings
of the filter properties, discussed in the next few sections.
Discretetime filters in this toolbox use objects that perform the filtering and
configuration of the filter. As objects, they include properties and methods that
provide filtering capability. In discretetime filters, or dfilt
objects, many of the properties are dynamic, meaning they become available depending
on the settings of other properties in the dfilt
object or
filter.
When you use a dfilt
.structure
function to create a filter, MATLAB^{®} displays the filter properties in the command window in return
(unless you end the command with a semicolon which suppresses the output
display). Generally you see six or seven properties, ranging from the property
FilterStructure
to
PersistentMemory
. These first properties are always
present in the filter. One of the most important properties is
Arithmetic
. The Arithmetic
property controls all of the dynamic properties for a filter.
Dynamic properties become available when you change another property in the
filter. For example, when you change the Arithmetic
property value to fixed
, the display now shows many more
properties for the filter, all of them considered dynamic. Here is an example
that uses a direct form II filter. First create the default filter:
hd=dfilt.df2 hd = FilterStructure: 'DirectForm II' Arithmetic: 'double' Numerator: 1 Denominator: 1 PersistentMemory: false States: [0x1 double]
With the filter hd
in the workspace, convert the arithmetic
to fixedpoint. Do this by setting the property Arithmetic
to
fixed
. Notice the display. Instead of a few properties,
the filter now has many more, each one related to a particular part of the
filter and its operation. Each of the nowvisible properties is dynamic.
hd.arithmetic='fixed' hd = FilterStructure: 'DirectForm II' Arithmetic: 'fixed' Numerator: 1 Denominator: 1 PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' StateWordLength: 16 StateFracLength: 15 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'
Even this list of properties is not yet complete. Changing the value of other
properties such as the ProductMode
or
CoeffAutoScale
properties may reveal even more
properties that control how the filter works. Remember this feature about
dfilt
objects and dynamic properties as you review the
rest of this section about properties of fixedpoint filters.
An important distinction is you cannot change the value of a property unless
you see the property listed in the default display for the filter. Entering the
filter name at the MATLAB prompt generates the default property display for the named
filter. Using get
(filtername)
does not generate the default
display — it lists all of the filter properties, both those that you can
change and those that are not available yet.
The following table summarizes the properties, static and dynamic, of fixedpoint filters and provides a brief description of each. Full descriptions of each property, in alphabetical order, follow the table.
Property Name  Valid Values [Default Value]  Brief Description 

 Any positive or negative integer number of bits [29]  Specifies the fraction length used to interpret data
output by the accumulator. This is a property of FIR filters
and lattice filters. IIR filters have two similar properties
— 
 Any positive integer number of bits [40]  Sets the word length used to store data in the accumulator/buffer. 
 [Double], single, fixed  Defines the arithmetic the filter uses. Gives you the
options 
 [True] or false  Specifies whether to cast numeric data to the appropriate accumulator format (as shown in the signal flow diagrams) before performing sum operations. 
 [True] or false  Specifies whether the filter automatically chooses the
proper fraction length to represent filter coefficients
without overflowing. Turning this off by setting the value
to 
 Any positive or negative integer number of bits [14]  Set the fraction length the filter uses to interpret
coefficients. 
 Any positive integer number of bits [16]  Specifies the word length to apply to filter coefficients. 
 Any positive or negative integer number of bits [29]  Specifies how the filter algorithm interprets the results of addition operations involving denominator coefficients. 
 Any positive or negative integer number of bits [14]  Sets the fraction length the filter uses to interpret
denominator coefficients. 
 Any filter coefficient value [1]  Holds the denominator coefficients for IIR filters. 
 Any positive or negative integer number of bits [29]  Specifies how the filter algorithm interprets the
results of product operations involving denominator
coefficients. You can change this property value after you
set 
 Any positive or negative integer number of bits [15]  Specifies the fraction length used to interpret the states associated with denominator coefficients in the filter. 
FracDelay  Any decimal value between 0 and 1 samples  Specifies the fractional delay provided by the filter, in decimal fractions of a sample. 
FDAutoScale  [True] or false  Specifies whether the filter automatically chooses the
proper scaling to represent the fractional delay value
without overflowing. Turning this off by setting the value
to 
FDFracLength  Any positive or negative integer number of bits [5]  Specifies the fraction length to represent the fractional delay. 
FDProdFracLength  Any positive or negative integer number of bits [34]  Specifies the fraction length to represent the result of multiplying the coefficients with the fractional delay. 
FDProdWordLength  Any positive or negative integer number of bits [39]  Specifies the word length to represent result of multiplying the coefficients with the fractional delay. 
FDWordLength  Any positive or negative integer number of bits [6]  Specifies the word length to represent the fractional delay. 
 Any positive integer number of bits [16]  Specifies the word length used to represent the states associated with denominator coefficients in the filter. 

 Controls whether the filter sets the output word and
fraction lengths, and the accumulator word and fraction
lengths automatically to maintain the best precision results
during filtering. The default value,

 Not applicable.  Describes the signal flow for the filter object, including all of the active elements that perform operations during filtering — gains, delays, sums, products, and input/output. 
 Any positive or negative integer number of bits [15]  Specifies the fraction length the filter uses to interpret data to be processed by the filter. 
 Any positive integer number of bits [16]  Specifies the word length applied to represent input data. 
 Any ladder coefficients in doubleprecision data type [1] 

 Any positive or negative integer number of bits [29] 

 Any positive or negative integer number of bits [14] 

 Any lattice structure coefficients. No default value.  Stores the lattice coefficients for latticebased filters. 
 Any positive or negative integer number of bits [29]  Specifies how the accumulator outputs the results of operations on the lattice coefficients. 
 Any positive or negative integer number of bits [15]  Specifies the fraction length applied to the lattice coefficients. 
 Any positive or negative integer number of bits [15]  Sets the fraction length for values used in product operations in the filter. Directform I transposed (df1t) filter structures include this property. 
 Any positive integer number of bits [16]  Sets the word length applied to the values input to a multiply operation (the multiplicands). The filter structure df1t includes this property. 
 Any positive or negative integer number of bits [29]  Specifies how the filter algorithm interprets the results of addition operations involving numerator coefficients. 
 Any doubleprecision filter coefficients [1]  Holds the numerator coefficient values for the filter. 
 Any positive or negative integer number of bits [14]  Sets the fraction length used to interpret the numerator coefficients. 
 Any positive or negative integer number of bits [29]  Specifies how the filter algorithm interprets the
results of product operations involving numerator
coefficients. You can change the property value after you
set 
 Any positive or negative integer number of bits [15]  For IIR filters, this defines the fraction length applied to the numerator states of the filter. Specifies the fraction length used to interpret the states associated with numerator coefficients in the filter. 
 Any positive integer number of bits [16]  For IIR filters, this defines the word length applied to the numerator states of the filter. Specifies the word length used to interpret the states associated with numerator coefficients in the filter. 
 Any positive or negative integer number of bits — [15] or [12] bits depending on the filter structure  Determines how the filter interprets the filtered data.
You can change the value of

 [AvoidOverflow], BestPrecision, SpecifyPrecision  Sets the mode the filter uses to scale the filtered input data. You have the following choices:

 Any positive integer number of bits [16]  Determines the word length used for the filtered data. 
 Saturate or [wrap]  Sets the mode used to respond to overflow conditions in
fixedpoint arithmetic. Choose from either

 Any positive or negative integer number of bits [29]  For the output from a product operation, this sets the
fraction length used to interpret the numeric data. This
property becomes writable (you can change the value) after
you set 
 [FullPrecision], KeepLSB, KeepMSB, SpecifyPrecision  Determines how the filter handles the output of product
operations. Choose from full precision
( 
 Any positive number of bits. Default is 16 or 32 depending on the filter structure  Specifies the word length to use for the results of
multiplication operations. This property becomes writable
(you can change the value) after you set


 Specifies whether to reset the filter states and memory
before each filtering operation. Lets you decide whether
your filter retains states from previous filtering runs.

 [Convergent], ceil, fix, floor, nearest, round  Sets the mode the filter uses to quantize numeric values when the values lie between representable values for the data format (word and fraction lengths).
The choice you make affects only the accumulator and output arithmetic. Coefficient and input arithmetic always round. Finally, products never overflow — they maintain full precision. 
 Any positive or negative integer number of bits [29]  Scale values work with SOS filters. Setting this
property controls how your filter interprets the scale
values by setting the fraction length. Available only when
you disable 
 [2 x 1 double] array with values of 1  Stores the scaling values for sections in SOS filters. 
 [True] or false  Specifies whether the filter uses signed or unsigned fixedpoint coefficients. Only coefficients reflect this property setting. 

 Holds the filter coefficients as property values.
Displays the matrix in the format [sections x
coefficients/section datatype]. A 
 [True] or false  Specifies whether the filter automatically chooses the
proper fraction length to prevent overflow by data entering
a section of an SOS filter. Setting this property to

 Any positive or negative integer number of bits [29]  Section values work with SOS filters. Setting this
property controls how your filter interprets the section
values between sections of the filter by setting the
fraction length. This applies to data entering a section.
Compare to Section 
 Any positive or negative integer number of bits [29]  Sets the word length used to represent the data moving into a section of an SOS filter. 
 [True] or false  Specifies whether the filter automatically chooses the
proper fraction length to prevent overflow by data leaving a
section of an SOS filter. Setting this property to

 Any positive or negative integer number of bits [29]  Section values work with SOS filters. Setting this
property controls how your filter interprets the section
values between sections of the filter by setting the
fraction length. This applies to data leaving a section.
Compare to Section 
 Any positive or negative integer number of bits [32]  Sets the word length used to represent the data moving out of one section of an SOS filter. 
 Any positive or negative integer number of bits [15]  Lets you set the fraction length applied to interpret the filter states. 
 [1x1 embedded  Contains the filter states before, during, and after
filter operations. States act as filter memory between
filtering runs or sessions. Notice that the states use

 Any positive integer number of bits [16]  Sets the word length used to represent the filter states. 
 Any positive or negative integer number of bits [15]  Sets the fraction length used to represent the filter
tap values in addition operations. This is available after
you set 
 FullPrecision, KeepLSB, [KeepMSB], SpecifyPrecision  Determines how the accumulator outputs stored that
involve filter tap weights. Choose from full precision
( Symmetric and antisymmetric FIR filters include this property. 
 Any positive number of bits [17]  Sets the word length used to represent the filter tap weights during addition. Symmetric and antisymmetric FIR filters include this property. 
When you create a fixedpoint filter, you are creating a filter object (a
dfilt
object). In this manual, the terms filter,
dfilt
object, and filter object are used interchangeably. To
filter data, you apply the filter object to your data set. The output of the
operation is the data filtered by the filter and the filter property values.
Filter objects have properties to which you assign property values. You use these property values to assign various characteristics to the filters you create, including
The type of arithmetic to use in filtering operations
The structure of the filter used to implement the filter (not a property
you can set or change — you select it by the dfilt
.structure
function you
choose)
The locations of quantizations and cast operations in the filter
The data formats used in quantizing, casting, and filtering operations
Details of the properties associated with fixedpoint filters are described in alphabetical order on the following pages.
Except for statespace filters, all dfilt
objects that use
fixed arithmetic have this property that defines the fraction length applied to
data in the accumulator. Combined with AccumWordLength
,
AccumFracLength
helps fully specify how the accumulator
outputs data after processing addition operations. As with all fraction length
properties, AccumFracLength
can be any integer, including
integers larger than AccumWordLength
, and positive or
negative integers.
You use AccumWordLength
to define the data word length used
in the accumulator. Set this property to a value that matches your intended
hardware. For example, many digital signal processors use 40bit accumulators,
so set AccumWordLength
to 40 in your fixedpoint
filter:
set(hq,'arithmetic','fixed'); set(hq,'AccumWordLength',40);
Note that AccumWordLength
only applies to filters whose
Arithmetic
property value is
fixed
.
Perhaps the most important property when you are working with
dfilt
objects, Arithmetic
determines
the type of arithmetic the filter uses, and the properties or quantizers that
compose the fixedpoint or quantized filter. You use character vectors to set
the Arithmetic
property value.
The next table shows the valid character vectors for the Arithmetic property.
Following the table, each property character vector appears with more detailed
information about what happens when you select the character vector as the value
for Arithmetic
in your dfilt
.
Arithmetic Property  Brief Description of Effect on the Filter 

 All filtering operations and coefficients use
doubleprecision floatingpoint representations and math.
When you use

 All filtering operations and coefficients use singleprecision floatingpoint representations and math. 
 This option applies selected default values for the properties in the fixedpoint filter object, including such properties as coefficient word lengths, fraction lengths, and various operating modes. Generally, the default values match those you use on many digital signal processors. Allows signed fixed data types only. Fixedpoint arithmetic filters are available only when you install FixedPoint Designer software with this toolbox. 
double. When you use one of the
dfilt
.structure
methods to
create a filter, the Arithmetic
property value is
double
by default. Your filter is identical to the
same filter without the Arithmetic
property, as you
would create if you used Signal
Processing Toolbox™ software.
Double
means that the filter uses doubleprecision
floatingpoint arithmetic in all operations while filtering:
All input to the filter must be double data type. Any other data type returns an error.
The states and output are doubles as well.
All internal calculations are done in double math.
When you use double
data type filter coefficients, the
reference and quantized (fixedpoint) filter coefficients are identical. The
filter stores the reference coefficients as double data type.
single. When your filter should use singleprecision floatingpoint arithmetic,
set the Arithmetic
property to
single
so all arithmetic in the filter processing
gets restricted to singleprecision data type.
Input data must be single data type. Other data types return errors.
The filter states and filter output use single data type.
When you choose single
, you can provide the filter
coefficients in either of two ways:
Double data type coefficients. With
Arithmetic
set to
single
, the filter casts the double data type
coefficients to single data type representation.
Single data type. These remain unchanged by the filter.
Depending on whether you specified single or double data type coefficients, the reference coefficients for the filter are stored in the data type you provided. If you provide coefficients in double data type, the reference coefficients are double as well. Providing single data type coefficients generates single data type reference coefficients. Note that the arithmetic used by the reference filter is always double.
When you use reffilter
to create a
reference filter from the reference coefficients, the resulting filter uses
doubleprecision versions of the reference filter coefficients.
To set the Arithmetic
property value, create your
filter, then use set
to change the
Arithmetic
setting, as shown in this example using a
direct form FIR filter.
b=fir1(7,0.45); hd=dfilt.dffir(b) hd = FilterStructure: 'DirectForm FIR' Arithmetic: 'double' Numerator: [1x8 double] PersistentMemory: false States: [7x1 double] set(hd,'arithmetic','single') hd hd = FilterStructure: 'DirectForm FIR' Arithmetic: 'single' Numerator: [1x8 double] PersistentMemory: false States: [7x1 single]
fixed. Converting your dfilt
object to use fixed arithmetic
results in a filter structure that uses properties and property values to
match how the filter would behave on digital signal processing
hardware.
The fixed
option for the property
Arithmetic
is available only when you install
FixedPoint
Designer software as well as DSP System
Toolbox™ software.
After you set Arithmetic
to fixed
,
you are free to change any property value from the default value to a value
that more closely matches your needs. You cannot, however, mix
floatingpoint and fixedpoint arithmetic in your filter when you select
fixed
as the Arithmetic
property
value. Choosing fixed
restricts you to using either
fixedpoint or floating point throughout the filter (the data type must be
homogenous). Also, all data types must be signed. fixed
does not support unsigned data types except for unsigned coefficients when
you set the property Signed
to
false
. Mixing word and fraction lengths within the fixed
object is acceptable. In short, using fixed arithmetic assumes
fixed word length.
fixed size and dedicated accumulator and product registers.
the ability to do either saturation or wrap arithmetic.
that multiple rounding modes are available.
Making these assumptions simplifies your job of creating fixedpoint filters by reducing repetition in the filter construction process, such as only requiring you to enter the accumulator word size once, rather than for each step that uses the accumulator.
Default property values are a starting point in tailoring your filter to common hardware, such as choosing 40bit word length for the accumulator, or 16bit words for data and coefficients.
In this dfilt
object example, get
returns the default
values for dfilt.df1t
structures.
[b,a]=butter(6,0.45); hd=dfilt.df1(b,a) hd = FilterStructure: 'DirectForm I' Arithmetic: 'double' Numerator: [1x7 double] Denominator: [1x7 double] PersistentMemory: false States: Numerator: [6x1 double] Denominator:[6x1 double] set(hd,'arithmetic','fixed') get(hd) PersistentMemory: false FilterStructure: 'DirectForm I' States: [1x1 filtstates.dfiir] Numerator: [1x7 double] Denominator: [1x7 double] Arithmetic: 'fixed' CoeffWordLength: 16 CoeffAutoScale: 1 Signed: 1 RoundMode: 'convergent' OverflowMode: 'wrap' InputWordLength: 16 InputFracLength: 15 ProductMode: 'FullPrecision' OutputWordLength: 16 OutputFracLength: 15 NumFracLength: 16 DenFracLength: 14 ProductWordLength: 32 NumProdFracLength: 31 DenProdFracLength: 29 AccumWordLength: 40 NumAccumFracLength: 31 DenAccumFracLength: 29 CastBeforeSum: 1
Here is the default display for hd
.
hd hd = FilterStructure: 'DirectForm I' Arithmetic: 'fixed' Numerator: [1x7 double] Denominator: [1x7 double] PersistentMemory: false States: Numerator: [6x1 fi] Denominator:[6x1 fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputFracLength: 15 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'
This second example shows the default property values for
dfilt.latticemamax
filter objects, using the
coefficients from an fir1
filter.
b=fir1(7,0.45) hdlat=dfilt.latticemamax(b) hdlat = FilterStructure: [1x45 char] Arithmetic: 'double' Lattice: [1x8 double] PersistentMemory: false States: [8x1 double] hdlat.arithmetic='fixed' hdlat = FilterStructure: [1x45 char] Arithmetic: 'fixed' Lattice: [1x8 double] PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' StateWordLength: 16 StateFracLength: 15 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'
Unlike the single
or double
options
for Arithmetic
, fixed
uses properties
to define the word and fraction lengths for each portion of your filter. By
changing the property value of any of the properties, you control your
filter performance. Every word length and fraction length property is
independent — set the one you need and the others remain unchanged,
such as setting the input word length with
InputWordLength
, while leaving the fraction length
the same.
d=fdesign.lowpass('n,fc',6,0.45) d = Response: 'Lowpass with cutoff' Specification: 'N,Fc' Description: {2x1 cell} NormalizedFrequency: true Fs: 'Normalized' FilterOrder: 6 Fcutoff: 0.4500 designmethods(d) Design Methods for class fdesign.lowpass: butter hd=butter(d) hd = FilterStructure: 'DirectForm II, SecondOrder Sections' Arithmetic: 'double' sosMatrix: [3x6 double] ScaleValues: [4x1 double] PersistentMemory: false States: [2x3 double] hd.arithmetic='fixed' hd = FilterStructure: 'DirectForm II, SecondOrder Sections' Arithmetic: 'fixed' sosMatrix: [3x6 double] ScaleValues: [4x1 double] PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 SectionInputWordLength: 16 SectionInputAutoScale: true SectionOutputWordLength: 16 Section OutputAutoScale: true OutputWordLength: 16 OutputMode: 'AvoidOverflow' StateWordLength: 16 StateFracLength: 15 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap' hd.inputWordLength=12 hd = FilterStructure: 'DirectForm II, SecondOrder Sections' Arithmetic: 'fixed' sosMatrix: [3x6 double] ScaleValues: [4x1 double] PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 12 InputFracLength: 15 SectionInputWordLength: 16 SectionInputAutoScale: true SectionOutputWordLength: 16 SectionOutputAutoScale: true OutputWordLength: 16 OutputMode: 'AvoidOverflow' StateWordLength: 16 StateFracLength: 15 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'
Notice that the properties for the lattice filter hdlat
and directform II filter hd
are different, as befits
their differing filter structures. Also, some properties are common to both
objects, such as RoundMode
and
PersistentMemory
and behave the same way in both
objects.
Notes About Fraction Length, Word Length, and Precision. Word length and fraction length combine to make the format for a fixedpoint number, where word length is the number of bits used to represent the value and fraction length specifies, in bits, the location of the binary point in the fixedpoint representation. Therein lies a problem — fraction length, which you specify in bits, can be larger than the word length, or a negative number of bits. This section explains how that idea works and how you might use it.
Fraction length defined as the number of fractional bits (bits to the right of the binary point) is true only when the fraction length is positive and less than or equal to the word length. In MATLAB format notation you can use [word length fraction length]. For example, for the format [16 16], the second 16 (the fraction length) is the number of fractional bits or bits to the right of the binary point. In this example, all 16 bits are to the right of the binary point.
It is also possible to have fixedpoint formats of [16 18] or [16 45]. In these cases the fraction length can no longer be the number of bits to the right of the binary point since the format says the word length is 16 — there cannot be 18 fraction length bits on the right. How can there be a negative number of bits for the fraction length, such as [16 45]?
A better way to think about fixedpoint format [word length fraction length] and what it means is that the representation of a fixedpoint number is a weighted sum of powers of two driven by the fraction length, or the two's complement representation of the fixedpoint number.
Consider the format [B L], where the fraction length L can be positive, negative, 0, greater than B (the word length) or less than B. (B and L are always integers and B is always positive.)
Given a binary character vector b(1) b(2) b(3) ... b(B), to determine the two'scomplement value of the character vector in the format described by [B L], use the value of the individual bits in the binary character vector in the following formula, where b(1) is the first binary bit (and most significant bit, MSB), b(2) is the second, and on up to b(B).
The decimal numeric value that those bits represent is given by
value =b(1)*2^(BL1)+b(2)*2^(BL2)+b(3)*2^(BL3)+...+ b(B)*2^(L)
L, the fraction length, represents the negative of the weight of the last, or least significant bit (LSB). L is also the step size or the precision provided by a given fraction length.
Precision. Here is how precision works.
When all of the bits of a binary character vector are zero except for the LSB (which is therefore equal to one), the value represented by the bit character vector is given by 2^{(L)}. If L is negative, for example L=16, the value is 2^{16}. The smallest step between numbers that can be represented in a format where L=16 is given by 1 x 2^{16} (the rightmost term in the formula above), which is 65536. Note the precision does not depend on the word length.
Take a look at another example. When the word length set to 8 bits, the decimal value 12 is represented in binary by 00001100. That 12 is the decimal equivalent of 00001100 tells you that you are using [8 0] data format representation — the word length is 8 bits and fraction length 0 bits, and the step size or precision (the smallest difference between two adjacent values in the format [8,0], is 2^{0}=1.
Suppose you plan to keep only the upper 5 bits and discard the other three. The resulting precision after removing the rightmost three bits comes from the weight of the lowest remaining bit, the fifth bit from the left, which is 2^{3}=8, so the format would be [5,3].
Note that in this format the step size is 8, I cannot represent numbers that are between multiples of 8.
In MATLAB, with FixedPoint Designer software installed:
x=8; q=quantizer([8,0]); % Word length = 8, fraction length = 0 xq=quantize(q,x); binxq=num2bin(q,xq); q1=quantizer([5 3]); % Word length = 5, fraction length = 3 xq1 = quantize(q1,xq); binxq1=num2bin(q1,xq1); binxq binxq = 00001000 binxq1 binxq1 = 00001
But notice that in [5,3] format, 00001 is the two's complement
representation for 8, not for 1; q = quantizer([8 0])
and
q1 = quantizer([5 3])
are not the same. They cover
the about the same range —
range(q)
>range(q1)
— but
their quantization step is different — eps(q)
= 8,
and eps(q1)=1
.
Look at one more example. When you construct a quantizer
q
q = quantizer([a,b])
the first element in [a,b]
is a
, the
word length used for quantization. The second element in the expression,
b
, is related to the quantization step — the
numerical difference between the two closest values that the quantizer can
represent. This is also related to the weight given to the LSB. Note that
2^(b)
= eps(q)
.
Now construct two quantizers, q1
and
q2
. Let q1
use the format [32,0]
and let q2
use the format [16, 16].
q1 = quantizer([32,0]) q2 = quantizer([16,16])
Quantizers q1
and q2
cover the same
range, but q2
has less precision. It covers the range in
steps of 2^{16}, while q
covers
the range in steps of 1.
This lost precision is due to (or can be used to model) throwing out 16 leastsignificant bits.
An important point to understand is that in dfilt
objects and filtering you control which bits are carried from the sum and
product operations in the filter to the filter output by setting the format
for the output from the sum or product operation.
For instance, if you use [16 0] as the output format for a 32bit result from a sum operation when the original format is [32 0], you take the lower 16 bits from the result. If you use [16 16], you take the higher 16 bits of the original 32 bits. You could even take 16 bits somewhere in between the 32 bits by choosing something like [16 8], but you probably do not want to do that.
Filter scaling is directly implicated in the format and precision for a filter. When you know the filter input and output formats, as well as the filter internal formats, you can scale the inputs or outputs to stay within the format ranges.
Notice that overflows or saturation might occur at the filter input, filter output, or within the filter itself, such as during add or multiply or accumulate operations. Improper scaling at any point in the filter can result in numerical errors that dramatically change the performance of your fixedpoint filter implementation.
Setting the CastBeforeSum
property determines how the
filter handles the input values to sum operations in the filter. After you set
your filter Arithmetic
property value to
fixed
, you have the option of using
CastBeforeSum
to control the data type of some inputs
(addends) to summations in your filter. To determine which addends reflect the
CastBeforeSum
property setting, refer to the reference
page for the signal flow diagram for the filter structure.
CastBeforeSum
specifies whether to cast selected addends
to summations in the filter to the output format from the addition operation
before performing the addition. When you specify true
for the
property value, the results of the affected sum operations match most closely
the results found on most digital signal processors. Performing the cast
operation before the summation adds one or two additional quantization
operations that can add error sources to your filter results.
Specifying CastBeforeSum
to be false
prevents the addends from being cast to the output format before the addition
operation. Choose this setting to get the most accurate results from summations
without considering the hardware your filter might use.
Notice that the output format for every sum operation reflects the value of
the output property specified in the filter structure diagram. Which input
property is referenced by CastBeforeSum
depends on the
structure.
Property Value  Description 

 Configures filter summation operations to retain the addends in the format carried from the previous operation. 
 Configures filter summation operations to convert the input format of the addends to match the summation output format before performing the summation operation. Usually this generates results from the summation that more closely match those found from digital signal processors 
Another point — with CastBeforeSum
set to
false
, the filter realization process inserts an
intermediate data type format to hold temporarily the full precision sum of the
inputs. A separate Convert block performs the process of casting the addition
result to the accumulator format. This intermediate data format occurs because
the Sum block in Simulink^{®} always casts input (addends) to the output data type.
Diagrams of CastBeforeSum Settings. When CastBeforeSum
is false
, sum
elements in filter signal flow diagrams look like this:
showing that the input data to the sum operations (the addends) retain
their format word length and fraction length from previous operations. The
addition process uses the existing input formats and then casts the output
to the format defined by AccumFormat
. Thus the output
data has the word length and fraction length defined by
AccumWordLength
and
AccumFracLength
.
When CastBeforeSum
is true
, sum
elements in filter signal flow diagrams look like this:
showing that the input data gets recast to the accumulator format word
length and fraction length (AccumFormat) before the sum operation occurs.
The data output by the addition operation has the word length and fraction
length defined by AccumWordLength
and
AccumFracLength
.
How the filter represents the filter coefficients depends on the property
value of CoeffAutoScale
. When you create a
dfilt
object, you use coefficients in doubleprecision
format. Converting the dfilt
object to fixedpoint arithmetic
forces the coefficients into a fixedpoint representation. The representation
the filter uses depends on whether the value of
CoeffAutoScale
is true
or
false
.
CoeffAutoScale
= true
means
the filter chooses the fraction length to maintain the value of the
coefficients as close to the doubleprecision values as possible. When
you change the word length applied to the coefficients, the filter
object changes the fraction length to try to accommodate the change.
true
is the default setting.
CoeffAutoScale
= false
removes
the automatic scaling of the fraction length for the coefficients and
exposes the property that controls the coefficient fraction length so
you can change it. For example, if the filter is a direct form FIR
filter, setting CoeffAutoScale
=
false
exposes the
NumFracLength
property that specifies the
fraction length applied to numerator coefficients. If the filter is an
IIR filter, setting CoeffAutoScale
=
false
exposes both the
NumFracLength
and
DenFracLength
properties.
Here is an example of using CoeffAutoScale
with a direct
form filter.
hd2=dfilt.dffir([0.3 0.6 0.3]) hd2 = FilterStructure: 'DirectForm FIR' Arithmetic: 'double' Numerator: [0.3000 0.6000 0.3000] PersistentMemory: false States: [2x1 double] hd2.arithmetic='fixed' hd2 = FilterStructure: 'DirectForm FIR' Arithmetic: 'fixed' Numerator: [0.3000 0.6000 0.3000] PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'
To this point, the filter coefficients retain the original values from when
you created the filter as shown in the Numerator
property.
Now change the CoeffAutoScale
property value from
true
to false
.
hd2.coeffautoScale=false hd2 = FilterStructure: 'DirectForm FIR' Arithmetic: 'fixed' Numerator: [0.3000 0.6000 0.3000] PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: false NumFracLength: 15 Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'
With the NumFracLength
property now available, change the
word length to 5 bits.
Notice the coefficient values. Setting CoeffAutoScale
to
false
removes the automatic fraction length adjustment
and the filter coefficients cannot be represented by the current format of [5
15] — a word length of 5 bits, fraction length of 15 bits.
hd2.coeffwordlength=5 hd2 = FilterStructure: 'DirectForm FIR' Arithmetic: 'fixed' Numerator: [4.5776e004 4.5776e004 4.5776e004] PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 5 CoeffAutoScale: false NumFracLength: 15 Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'
Restoring CoeffAutoScale
to true
goes
some way to fixing the coefficient values. Automatically scaling the coefficient
fraction length results in setting the fraction length to 4 bits. You can check
this with get(hd2)
as shown below.
hd2.coeffautoScale=true hd2 = FilterStructure: 'DirectForm FIR' Arithmetic: 'fixed' Numerator: [0.3125 0.6250 0.3125] PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 5 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap' get(hd2) PersistentMemory: false FilterStructure: 'DirectForm FIR' States: [1x1 embedded.fi] Numerator: [0.3125 0.6250 0.3125] Arithmetic: 'fixed' CoeffWordLength: 5 CoeffAutoScale: 1 Signed: 1 RoundMode: 'convergent' OverflowMode: 'wrap' InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' ProductMode: 'FullPrecision' NumFracLength: 4 OutputFracLength: 12 ProductWordLength: 21 ProductFracLength: 19 AccumWordLength: 40 AccumFracLength: 19 CastBeforeSum: 1
Clearly five bits is not enough to represent the coefficients accurately.
Fixedpoint scalar filters that you create using dfilt.scalar
use this property
to define the fraction length applied to the scalar filter coefficients. Like
the coefficientfractionlengthrelated properties for the FIR, lattice, and IIR
filters, CoeffFracLength
is not displayed for scalar filters
until you set CoeffAutoScale
to false
.
Once you change the automatic scaling you can set the fraction length for the
coefficients to any value you require.
As with all fraction length properties, the value you enter here can be any
negative or positive integer, or zero. Fraction length can be larger than the
associated word length, as well. By default, the value is 14 bits, with the
CoeffWordlength
of 16 bits.
One primary consideration in developing filters for hardware is the length of
a data word. CoeffWordLength
defines the word length for
these data storage and arithmetic locations:
Numerator and denominator filter coefficients
Tap sum in dfilt.dfsymfir
and
dfilt.dfasymfir
filter objects
Section input, multiplicand, and state values in directform SOS
filter objects such as dfilt.df1t
and
dfilt.df2
Scale values in secondorder filters
Lattice and ladder coefficients in lattice filter objects, such as
dfilt.latticearma
and
dfilt.latticemamax
Gain in dfilt.scalar
Setting this property value controls the word length for the data listed. In most cases, the data words in this list have separate fraction length properties to define the associated fraction lengths.
Any positive, integer word length works here, limited by the machine you use to develop your filter and the hardware you use to deploy your filter.
Filter structures df1
, df1t
,
df2
, and df2t
that use
fixed
arithmetic have this property that defines the
fraction length applied to denominator coefficients in the accumulator. In
combination with AccumWordLength
, the properties fully
specify how the accumulator outputs data stored there.
As with all fraction length properties,
DenAccumFracLength
can be any integer, including
integers larger than AccumWordLength
, and positive or
negative integers. To be able to change the property value for this property,
you set FilterInternals
to
SpecifyPrecision
.
Property DenFracLength
contains the value that specifies
the fraction length for the denominator coefficients for your filter.
DenFracLength
specifies the fraction length used to
interpret the data stored in C
. Used in combination with
CoeffWordLength
, these two properties define the
interpretation of the coefficients stored in the vector that contains the
denominator coefficients.
As with all fraction length properties, the value you enter here can be any
negative or positive integer, or zero. Fraction length can be larger than the
associated word length, as well. By default, the value is 15 bits, with the
CoeffWordLength
of 16 bits.
The denominator coefficients for your IIR filter, taken from the prototype you start with, are stored in this property. Generally this is a 1byN array of data in double format, where N is the length of the filter.
All IIR filter objects include Denominator
, except the
latticebased filters which store their coefficients in the
Lattice
property, and secondorder section filters,
such as dfilt.df1tsos
, which use the
SosMatrix
property to hold the coefficients for the
sections.
A property of all of the direct form IIR dfilt
objects,
except the ones that implement secondorder sections,
DenProdFracLength
specifies the fraction length applied
to data output from product operations that the filter performs on denominator
coefficients.
Looking at the signal flow diagram for the dfilt.df1t
filter, for example,
you see that denominators and numerators are handled separately. When you set
ProductMode
to SpecifyPrecision
, you
can change the DenProdFracLength
setting manually. Otherwise,
for multiplication operations that use the denominator coefficients, the filter
sets the fraction length as defined by the ProductMode
setting.
When you look at the flow diagram for the dfilt.df1sos
filter object, the
states associated with denominator coefficient operations take the fraction
length from this property. In combination with the
DenStateWordLength
property, these properties fully
specify how the filter interprets the states.
As with all fraction length properties, the value you enter here can be any
negative or positive integer, or zero. Fraction length can be larger than the
associated word length, as well. By default, the value is 15 bits, with the
DenStateWordLength
of 16 bits.
When you look at the flow diagram for the dfilt.df1sos
filter object, the
states associated with the denominator coefficient operations take the data
format from this property and the DenStateFracLength
property. In combination, these properties fully specify how the filter
interprets the state it uses.
By default, the value is 16 bits, with the
DenStateFracLength
of 15 bits.
Similar to the FilterInternals pane in FDATool, this property controls whether
the filter sets the output word and fraction lengths automatically, and the
accumulator word and fraction lengths automatically as well, to maintain the
best precision results during filtering. The default value,
FullPrecision
, sets automatic word and fraction length
determination by the filter. Setting FilterInternals
to
SpecifyPrecision
exposes the output and accumulator
related properties so you can set your own word and fraction lengths for them.
Note that
Every dfilt
object has a
FilterStructure
property. This is a readonly property
containing a character vector that declares the structure of the filter object
you created.
When you construct filter objects, the FilterStructure
property value is returned containing one of the character vectors shown in the
following table. Property FilterStructure
indicates the
filter architecture and comes from the constructor you use to create the
filter.
After you create a filter object, you cannot change the
FilterStructure
property value. To make filters that
use different structures, you construct new filters using the appropriate
methods, or use convert
to switch to a new
structure.
Default value. Since this depends on the constructor you use and the constructor includes the filter structure definition, there is no default value. When you try to create a filter without specifying a structure, MATLAB returns an error.
Filter Constructor Name  FilterStructure Property and Filter Type 

 Direct form I 
 Direct form I filter implemented using secondorder sections 
 Direct form I transposed 
 Direct form II 
 Direct form II filter implemented using second order sections 
 Direct form II transposed 
 Antisymmetric finite impulse response (FIR). Even and odd forms. 
 Direct form FIR 
 Direct form FIR transposed 
 Lattice allpass 
 Lattice autoregressive (AR) 
 Lattice moving average (MA) minimum phase 
 Lattice moving average (MA) maximum phase 
 Lattice ARMA 
 Symmetric FIR. Even and odd forms 
 Scalar 
Filter Structures with Quantizations Shown in Place. To help you understand how and where the quantizations occur in filter
structures in this toolbox, the figure below shows the structure for a
Direct Form II filter, including the quantizations (fixedpoint formats)
that compose part of the fixedpoint filter. You see that one or more
quantization processes, specified by the *format label, accompany each
filter element, such as a delay, product, or summation element. The input to
or output from each element reflects the result of applying the associated
quantization as defined by the word length and fraction length format.
Wherever a particular filter element appears in a filter structure, recall
the quantization process that accompanies the element as it appears in this
figure. Each filter reference page, such as the dfilt.df2
reference page,
includes the signal flow diagram showing the formatting elements that define
the quantizations that occur throughout the filter flow.
For example, a product quantization, either numerator or denominator,
follows every product (gain) element and a sum quantization, also either
numerator or denominator, follows each sum element. The figure shows the
Arithmetic
property value set to
fixed
.
df2 IIR Filter Structure Including the Formatting Objects, with Arithmetic Property Value fixed
When your df2
filter uses the
Arithmetic
property set to
fixed
, the filter structure contains the formatting
features shown in the diagram. The formats included in the structure are
fixedpoint objects that include properties to set various word and fraction
length formats. For example, the NumFormat
or
DenFormat
properties of the fixedpoint arithmetic
filter set the properties for quantizing numerator or denominator
coefficients according to word and fraction length settings.
When the leading denominator coefficient a(1) in your filter is not 1, choose it to be a power of two so that a shift replaces the multiply that would otherwise be used.
FixedPoint Arithmetic Filter Structures. You choose among several filter structures when you create fixedpoint filters. You can also specify filters with single or multiple cascaded sections of the same type. Because quantization is a nonlinear process, different fixedpoint filter structures produce different results.
To specify the filter structure, you select the appropriate
dfilt
.structure
method to
construct your filter. Refer to the function reference information for
dfilt
and set
for details on setting
property values for quantized filters.
The figures in the following subsections of this section serve as aids to help you determine how to enter your filter coefficients for each filter structure. Each subsection contains an example for constructing a filter of the given structure.
Scale factors for the input and output for the filters do not appear in
the block diagrams. The default filter structures do not include, nor
assume, the scale factors. For filter scaling information, refer to
scale
in the Help
system.
About the Filter Structure Diagrams. In the diagrams that accompany the following filter structure descriptions, you see the active operators that define the filter, such as sums and gains, and the formatting features that control the processing in the filter. Notice also that the coefficients are labeled in the figure. This tells you the order in which the filter processes the coefficients.
While the meaning of the block elements is straightforward, the labels for
the formats that form part of the filter are less clear. Each figure
includes text in the form labelFormat
that
represents the existence of a formatting feature at that point in the
structure. The Format
stands for formatting
object and the label
specifies the data that the
formatting object affects.
For example, in the dfilt.df2
filter shown
above, the entries
InputFormat
and OutputFormat
are
the formats applied, that is the word length and fraction length, to the
filter input and output data. For example, filter properties like
OutputWordLength
and
InputWordLength
specify values that control filter
operations at the input and output points in the structure and are
represented by the formatting objects InputFormat
and
OutputFormat
shown in the filter structure
diagrams.
Direct Form I Filter Structure. The following figure depicts the direct form I filter
structure that directly realizes a transfer function with a secondorder
numerator and denominator. The numerator coefficients are numbered
b(i), i =1, 2,
3; the denominator coefficients are numbered
a(i), i = 1, 2,
3; and the states (used for initial and final state values in filtering) are
labeled z(i). In the figure, the
Arithmetic
property is set to
fixed
.
Example — Specifying a Direct Form I Filter. You can specify a secondorder direct form I structure for a quantized
filter hq
with the following code.
b = [0.3 0.6 0.3]; a = [1 0 0.2]; hq = dfilt.df1(b,a);
To create the fixedpoint filter, set the Arithmetic
property to fixed
as shown here.
set(hq,'arithmetic','fixed');
Direct Form I Filter Structure With SecondOrder Sections. The following figure depicts a direct form I filter
structure that directly realizes a transfer function with a secondorder
numerator and denominator and secondorder sections. The numerator
coefficients are numbered b(i),
i =1, 2, 3; the denominator coefficients are numbered
a(i), i = 1, 2,
3; and the states (used for initial and final state values in filtering) are
labeled z(i). In the figure, the
Arithmetic
property is set to
fixed
to place the filter in fixedpoint mode.
Example — Specifying a Direct Form I Filter with SecondOrder
Sections. You can specify an eighthorder direct form I structure for a quantized
filter hq
with the following code.
b = [0.3 0.6 0.3]; a = [1 0 0.2]; hq = dfilt.df1sos(b,a);
To create the fixedpoint filter, set the Arithmetic
property to fixed
, as shown here.
set(hq,'arithmetic','fixed');
Direct Form I Transposed Filter Structure. The next signal flow diagram depicts a direct form I
transposed filter structure that directly realizes a
transfer function with a secondorder numerator and denominator. The
numerator coefficients are b(i),
i = 1, 2, 3; the denominator coefficients are
a(i), i = 1, 2,
3; and the states (used for initial and final state values in filtering) are
labeled z(i). With the
Arithmetic
property value set to
fixed
, the figure shows the filter with the
properties indicated.
Example — Specifying a Direct Form I Transposed Filter. You can specify a secondorder direct form I transposed filter
structure for a quantized filter hq
with the following
code.
b = [0.3 0.6 0.3]; a = [1 0 0.2]; hq = dfilt.df1t(b,a); set(hq,'arithmetic','fixed');
Direct Form II Filter Structure. The following graphic depicts a direct form II filter
structure that directly realizes a transfer function with a secondorder
numerator and denominator. In the figure, the
Arithmetic
property value is
fixed
. Numerator coefficients are named
b(i); denominator coefficients are
named a(i), i = 1,
2, 3; and the states (used for initial and final state values in filtering)
are named z(i).
Use the method dfilt.df2
to construct a quantized
filter whose FilterStructure
property is
DirectForm II
.
Example — Specifying a Direct Form II Filter. You can specify a secondorder direct form II filter structure for a
quantized filter hq
with the following code.
b = [0.3 0.6 0.3]; a = [1 0 0.2]; hq = dfilt.df2(b,a); hq.arithmetic = 'fixed'
To convert your initial doubleprecision filter hq
to a
quantized or fixedpoint filter, set the Arithmetic
property to fixed
, as shown.
Direct Form II Filter Structure With SecondOrder Sections
The following figure depicts direct form II filter
structure using secondorder sections that directly realizes a transfer
function with a secondorder numerator and denominator sections. In the
figure, the Arithmetic
property value is
fixed
. Numerator coefficients are labeled
b(i); denominator coefficients are
labeled a(i), i =
1, 2, 3; and the states (used for initial and final state values in
filtering) are labeled z(i).
Use the method dfilt.df2sos
to construct a quantized
filter whose FilterStructure
property is
DirectForm II
.
Example — Specifying a Direct Form II Filter with SecondOrder
Sections. You can specify a tenthorder direct form II filter structure that uses
secondorder sections for a quantized filter hq
with the
following code.
b = [0.3 0.6 0.3]; a = [1 0 0.2]; hq = dfilt.df2sos(b,a); hq.arithmetic = 'fixed'
To convert your prototype doubleprecision filter hq
to
a fixedpoint filter, set the Arithmetic
property to
fixed
, as shown.
Direct Form II Transposed Filter Structure. The following figure depicts the direct form II
transposed filter structure that directly realizes
transfer functions with a secondorder numerator and denominator. The
numerator coefficients are labeled
b(i), the denominator coefficients are
labeled a(i), i =
1, 2, 3, and the states (used for initial and final state values in
filtering) are labeled z(i). In the
first figure, the Arithmetic
property value is
fixed
.
Use the constructor dfilt.df2t
to specify the
value of the FilterStructure
property for a filter with
this structure that you can convert to fixedpoint filtering.
Example — Specifying a Direct Form II Transposed Filter. Specifying or constructing a secondorder direct form II transposed filter
for a fixedpoint filter hq
starts with the following
code to define the coefficients and construct the filter.
b = [0.3 0.6 0.3]; a = [1 0 0.2]; hd = dfilt.df2t(b,a);
Now create the fixedpoint filtering version of the filter from
hd
, which is floating point.
hq = set(hd,'arithmetic','fixed');
Direct Form Antisymmetric FIR Filter Structure (Any Order). The following figure depicts a direct form antisymmetric FIR
filter structure that directly realizes a secondorder
antisymmetric FIR filter. The filter coefficients are labeled
b(i), and the initial and final state values in
filtering are labeled z(i). This
structure reflects the Arithmetic
property set to
fixed
.
Use the method dfilt.dfasymfir
to construct the filter,
and then set the Arithmetic
property to
fixed
to convert to a fixedpoint filter with this
structure.
Example — Specifying an OddOrder Direct Form Antisymmetric FIR
Filter. Specify a fifthorder direct form antisymmetric FIR filter structure for a
fixedpoint filter hq
with the following code.
b = [0.008 0.06 0.44 0.44 0.06 0.008]; hq = dfilt.dfasymfir(b); set(hq,'arithmetic','fixed') hq hq = FilterStructure: 'DirectForm Antisymmetric FIR' Arithmetic: 'fixed' Numerator: [0.0080 0.0600 0.4400 0.4400 0.0600 0.0080] PersistentMemory: false States: [1x1 fi object] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' TapSumMode: 'KeepMSB' TapSumWordLength: 17 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap' InheritSettings: false
Example — Specifying an EvenOrder Direct Form Antisymmetric FIR
Filter. You can specify a fourthorder direct form antisymmetric FIR filter
structure for a fixedpoint filter hq
with the following
code.
b = [0.01 0.1 0.0 0.1 0.01]; hq = dfilt.dfasymfir(b); hq.arithmetic='fixed' hq = FilterStructure: 'DirectForm Antisymmetric FIR' Arithmetic: 'fixed' Numerator: [0.0100 0.1000 0 0.1000 0.0100] PersistentMemory: false States: [1x1 fi object] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' TapSumMode: 'KeepMSB' TapSumWordLength: 17 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap' InheritSettings: false
Direct Form Finite Impulse Response (FIR) Filter Structure. In the next figure, you see the signal flow graph for a direct
form finite impulse response (FIR) filter structure that
directly realizes a secondorder FIR filter. The filter coefficients are
b(i), i = 1, 2,
3, and the states (used for initial and final state values in filtering) are
z(i). To generate the figure, set
the Arithmetic
property to fixed
after you create your prototype filter in doubleprecision
arithmetic.
Use the dfilt.dffir
method to generate a filter that
uses this structure.
Example — Specifying a Direct Form FIR Filter. You can specify a secondorder direct form FIR filter structure for a
fixedpoint filter hq
with the following code.
b = [0.05 0.9 0.05]; hd = dfilt.dffir(b); hq = set(hd,'arithmetic','fixed');
Direct Form FIR Transposed Filter Structure. This figure uses the filter coefficients labeled b(i), i = 1, 2, 3, and states (used for initial and final state values in filtering) are labeled z(i). These depict a direct form finite impulse response (FIR) transposed filter structure that directly realizes a secondorder FIR filter.
With the Arithmetic
property set to
fixed
, your filter matches the figure. Using the
method dfilt.dffirt
returns a doubleprecision filter
that you convert to a fixedpoint filter.
Example — Specifying a Direct Form FIR Transposed Filter. You can specify a secondorder direct form FIR transposed filter structure
for a fixedpoint filter hq
with the following
code.
b = [0.05 0.9 0.05]; hd=dfilt.dffirt(b); hq = copy(hd); hq.arithmetic = 'fixed';
Lattice Allpass Filter Structure. The following figure depicts the lattice allpass filter structure. The pictured structure directly realizes thirdorder lattice allpass filters using fixedpoint arithmetic. The filter reflection coefficients are labeled k1(i), i = 1, 2, 3. The states (used for initial and final state values in filtering) are labeled z(i).
To create a quantized filter that uses the lattice allpass structure shown
in the figure, use the dfilt.latticeallpass
method and
set the Arithmetic
property to
fixed
.
Example — Specifying a Lattice Allpass Filter. You can create a thirdorder lattice allpass filter structure for a
quantized filter hq
with the following code.
k = [.66 .7 .44]; hd=dfilt.latticeallpass(k); set(hq,'arithmetic','fixed');
Lattice Moving Average Maximum Phase Filter Structure. In the next figure you see a lattice moving average maximum phase filter structure. This signal flow diagram directly realizes a thirdorder lattice moving average (MA) filter with the following phase form depending on the initial transfer function:
When you start with a minimum phase transfer function, the upper branch of the resulting lattice structure returns a minimum phase filter. The lower branch returns a maximum phase filter.
When your transfer function is neither minimum phase nor maximum phase, the lattice moving average maximum phase structure will not be maximum phase.
When you start with a maximum phase filter, the resulting lattice filter is maximum phase also.
The filter reflection coefficients are labeled
k(i), i = 1, 2,
3. The states (used for initial and final state values in filtering) are
labeled z(i). In the figure, we set
the Arithmetic
property to fixed
to
reveal the fixedpoint arithmetic format features that control such options
as word length and fraction length.
Example — Constructing a Lattice Moving Average Maximum Phase
Filter. Constructing a fourthorder lattice MA maximum phase filter structure for
a quantized filter hq
begins with the following
code.
k = [.66 .7 .44 .33]; hd=dfilt.latticemamax(k);
Lattice Autoregressive (AR) Filter Structure. The method dfilt.latticear
directly realizes lattice
autoregressive filters in the toolbox. The following figure depicts the
thirdorder lattice autoregressive (AR) filter
structure — with the Arithmetic
property equal
to fixed
. The filter reflection coefficients are labeled
k(i), i = 1, 2,
3, and the states (used for initial and final state values in filtering) are
labeled z(i).
Example — Specifying a Lattice AR Filter. You can specify a thirdorder lattice AR filter structure for a quantized
filter hq
with the following code.
k = [.66 .7 .44]; hd=dfilt.latticear(k); hq.arithmetic = 'custom';
Lattice Moving Average (MA) Filter Structure for Minimum Phase. The following figures depict lattice moving average
(MA) filter structures that directly realize thirdorder
lattice MA filters for minimum phase. The filter reflection coefficients are
labeled k(i), (i).
= 1, 2, 3, and the states (used for initial and final state values in
filtering) are labeled z(i). Setting
the Arithmetic
property of the filter to
fixed
results in a fixedpoint filter that matches
the figure.
This signal flow diagram directly realizes a thirdorder lattice moving average (MA) filter with the following phase form depending on the initial transfer function:
When you start with a minimum phase transfer function, the upper branch of the resulting lattice structure returns a minimum phase filter. The lower branch returns a minimum phase filter.
When your transfer function is neither minimum phase nor maximum phase, the lattice moving average minimum phase structure will not be minimum phase.
When you start with a minimum phase filter, the resulting lattice filter is minimum phase also.
The filter reflection coefficients are labeled
k((i).), i = 1,
2, 3. The states (used for initial and final state values in filtering) are
labeled z((i).). This figure shows the
filter structure when the Arithmetic
property is set to
fixed
to reveal the fixedpoint arithmetic format
features that control such options as word length and fraction
length.
Example — Specifying a Minimum Phase Lattice MA Filter. You can specify a thirdorder lattice MA filter structure for minimum phase applications using variations of the following code.
k = [.66 .7 .44]; hd=dfilt.latticemamin(k); set(hq,'arithmetic','fixed');
Lattice Autoregressive Moving Average (ARMA) Filter Structure. The figure below depicts a lattice autoregressive moving average (ARMA) filter structure that directly realizes a fourthorder lattice ARMA filter. The filter reflection coefficients are labeled k(i), (i). = 1, ..., 4; the ladder coefficients are labeled v(i), (i). = 1, 2, 3; and the states (used for initial and final state values in filtering) are labeled z(i).
Example — Specifying an Lattice ARMA Filter. The following code specifies a fourthorder lattice ARMA filter structure
for a quantized filter hq
, starting from
hd
, a floatingpoint version of the filter.
k = [.66 .7 .44 .66]; v = [1 0 0]; hd=dfilt.latticearma(k,v); hq.arithmetic = 'fixed';
Direct Form Symmetric FIR Filter Structure (Any Order). Shown in the next figure, you see signal flow that depicts a
direct form
symmetric FIR filter structure that directly realizes a
fifthorder direct form symmetric FIR filter. Filter coefficients are
labeled b(i), i =
1, ..., n, and states (used for initial and final state
values in filtering) are labeled z(i).
Showing the filter structure used when you select fixed
for the Arithmetic
property value, the first figure
details the properties in the filter object.
Example — Specifying an OddOrder Direct Form Symmetric FIR
Filter. By using the following code in MATLAB, you can specify a fifthorder direct form symmetric FIR
filter for a fixedpoint filter hq
:
b = [0.008 0.06 0.44 0.44 0.06 0.008]; hd=dfilt.dfsymfir(b); set(hq,'arithmetic','fixed');
Assigning Filter Coefficients. The syntax you use to assign filter coefficients for your floatingpoint or fixedpoint filter depends on the structure you select for your filter.
Converting Filters Between Representations. Filter conversion functions in this toolbox and in Signal Processing Toolbox software let you convert filter transfer functions to other filter forms, and from other filter forms to transfer function form. Relevant conversion functions include the following functions.
Conversion Function  Description 

Converts from a coupled allpass filter to a transfer function.  
Converts from a lattice coupled allpass filter to a transfer function.  
Convert a discretetime filter from one filter structure to another.  
Converts quantized filters to create secondorder sections. We recommend this method for converting quantized filters to secondorder sections.  
Converts from a transfer function to a coupled allpass filter.  
Converts from a transfer function to a lattice coupled allpass filter.  
Converts from a transfer function to a lattice filter.  
Converts from a transfer function to a secondorder section form.  
Converts from a transfer function to statespace form.  
Converts from a rational transfer function to its factored (single section) form (zeropolegain form).  
Converts a zeropolegain form to a secondorder section form.  
Conversion of zeropolegain form to a statespace form.  
Conversion of zeropolegain form to transfer functions of multiple order sections. 
Note that these conversion routines do not apply to
dfilt
objects.
The function convert
is a special case
— when you use convert to change the filter structure of a
fixedpoint filter, you lose all of the filter states and settings. Your new
filter has default values for all properties, and it is not
fixedpoint.
To demonstrate the changes that occur, convert a fixedpoint direct form I transposed filter to direct form II structure.
hd=dfilt.df1t hd = FilterStructure: 'DirectForm I Transposed' Arithmetic: 'double' Numerator: 1 Denominator: 1 PersistentMemory: false States: Numerator: [0x0 double] Denominator:[0x0 double] hd.arithmetic='fixed' hd = FilterStructure: 'DirectForm I Transposed' Arithmetic: 'fixed' Numerator: 1 Denominator: 1 PersistentMemory: false States: Numerator: [0x0 fi] Denominator:[0x0 fi] convert(hd,'df2') Warning: Using reference filter for structure conversion. Fixedpoint attributes will not be converted. ans = FilterStructure: 'DirectForm II' Arithmetic: 'double' Numerator: 1 Denominator: 1 PersistentMemory: false States: [0x1 double]
You can specify a filter with L sections of arbitrary order by
dfilt.scalar
filters have a gain value stored in the
gain
property. By default the gain value is one
— the filter acts as a wire.
InputFracLength
defines the fraction length assigned to the
input data for your filter. Used in tandem with
InputWordLength
, the pair defines the data format for
input data you provide for filtering.
As with all fraction length properties in dfilt
objects,
the value you enter here can be any negative or positive integer, or zero.
Fraction length can be larger than the associated word length, in this case
InputWordLength
, as well.
Specifies the number of bits your filter uses to represent your input data.
Your word length option is limited by the arithmetic you choose — up to
32 bits for double
, float
, and
fixed
. Setting Arithmetic
to
single
(singleprecision floatingpoint) limits word
length to 16 bits. The default value is 16 bits.
Included as a property in dfilt.latticearma
filter objects,
Ladder
contains the denominator coefficients that form an
IIR lattice filter object. For instance, the following code creates a high pass
filter object that uses the lattice ARMA structure.
[b,a]=cheby1(5,.5,.5,'high') b = 0.0282 0.1409 0.2817 0.2817 0.1409 0.0282 a = 1.0000 0.9437 1.4400 0.9629 0.5301 0.1620 hd=dfilt.latticearma(b,a) hd = FilterStructure: [1x44 char] Arithmetic: 'double' Lattice: [1x6 double] Ladder: [1 0.9437 1.4400 0.9629 0.5301 0.1620] PersistentMemory: false States: [6x1 double] hd.arithmetic='fixed' hd = FilterStructure: [1x44 char] Arithmetic: 'fixed' Lattice: [1x6 double] Ladder: [1 0.9437 1.4400 0.9629 0.5301 0.1620] PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' StateWordLength: 16 StateFracLength: 15 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'
Autoregressive, moving average lattice filter objects
(lattticearma
) use ladder coefficients to define the
filter. In combination with LadderFracLength
and
CoeffWordLength
, these three properties specify or
reflect how the accumulator outputs data stored there. As with all fraction
length properties, LadderAccumFracLength
can be any integer,
including integers larger than AccumWordLength
, and positive
or negative integers. The default value is 29 bits.
To let you control the way your latticearma
filter
interprets the denominator coefficients, LadderFracLength
sets the fraction length applied to the ladder coefficients for your filter. The
default value is 14 bits.
As with all fraction length properties, LadderFracLength
can be any integer, including integers larger than
AccumWordLength
, and positive or negative integers.
When you create a latticebased IIR filter, your numerator coefficients (from
your IIR prototype filter or the default dfilt
lattice
filter function) get stored in the Lattice
property of the
dfilt
object. The properties
CoeffWordLength
and
LatticeFracLength
define the data format the object
uses to represent the lattice coefficients. By default, lattice coefficients are
in doubleprecision format.
Lattice filter objects (latticeallpass
,
latticearma
, latticemamax
, and
latticemamin
) use lattice coefficients to define the
filter. In combination with LatticeFracLength
and
CoeffWordLength
, these three properties specify how the
accumulator outputs lattice coefficientrelated data stored there. As with all
fraction length properties, LatticeAccumFracLength
can be
any integer, including integers larger than AccumWordLength
,
and positive or negative integers. By default, the property is set to 31
bits.
To let you control the way your filter interprets the denominator
coefficients, LatticeFracLength
sets the fraction length
applied to the lattice coefficients for your lattice filter. When you create the
default lattice filter, LatticeFracLength
is 16
bits.
As with all fraction length properties, LatticeFracLength
can be any integer, including integers larger than
CoeffWordLength
, and positive or negative integers.
Each input data element for a multiply operation has both word length and
fraction length to define its representation.
MultiplicandFracLength
sets the fraction length to use
when the filter object performs any multiply operation during filtering. For
default filters, this is set to 15 bits.
As with all word and fraction length properties,
MultiplicandFracLength
can be any integer, including
integers larger than CoeffWordLength
, and positive or
negative integers.
Each input data element for a multiply operation has both word length and
fraction length to define its representation.
MultiplicandWordLength
sets the word length to use when
the filter performs any multiply operation during filtering. For default
filters, this is set to 16 bits. Only the df1t
and
df1tsos
filter objects include the
MultiplicandFracLength
property.
Only the df1t
and df1tsos
filter objects
include the MultiplicandWordLength
property.
Filter structures df1
, df1t
,
df2
, and df2t
that use
fixed
arithmetic have this property that defines the
fraction length applied to numerator coefficients in output from the
accumulator. In combination with AccumWordLength
, the
NumAccumFracLength
property fully specifies how the
accumulator outputs numeratorrelated data stored there.
As with all fraction length properties,
NumAccumFracLength
can be any integer, including
integers larger than AccumWordLength
, and positive or
negative integers. 30 bits is the default value when you create the filter
object. To be able to change the value for this property, set
FilterInternals
for the filter to
SpecifyPrecision
.
The numerator coefficients for your filter, taken from the prototype you start with or from the default filter, are stored in this property. Generally this is a 1byN array of data in double format, where N is the length of the filter.
All of the filter objects include Numerator
, except the
latticebased and secondorder section filters, such as
dfilt.latticema
and
dfilt.df1tsos
.
Property NumFracLength
contains the value that specifies
the fraction length for the numerator coefficients for your filter.
NumFracLength
specifies the fraction length used to
interpret the numerator coefficients. Used in combination with
CoeffWordLength
, these two properties define the
interpretation of the coefficients stored in the vector that contains the
numerator coefficients.
As with all fraction length properties, the value you enter here can be any
negative or positive integer, or zero. Fraction length can be larger than the
associated word length, as well. By default, the value is 15 bits, with the
CoeffWordLength
of 16 bits.
A property of all of the direct form IIR dfilt
objects,
except the ones that implement secondorder sections,
NumProdFracLength
specifies the fraction length applied
to data output from product operations the filter performs on numerator
coefficients.
Looking at the signal flow diagram for the dfilt.df1t
filter, for example,
you see that denominators and numerators are handled separately. When you set
ProductMode
to SpecifyPrecision
, you
can change the NumProdFracLength
setting manually.
Otherwise, for multiplication operations that use the numerator coefficients,
the filter sets the word length as defined by the ProductMode
setting.
All the variants of the direct form I structure include the property
NumStateFracLength
to store the fraction length applied
to the numerator states for your filter object. By default, this property has
the value 15 bits, with the CoeffWordLength
of 16 bits, which
you can change after you create the filter object.
As with all fraction length properties, the value you enter here can be any negative or positive integer, or zero. Fraction length can be larger than the associated word length, as well.
When you look at the flow diagram for the df1sos
filter
object, the states associated with the numerator coefficient operations take the
data format from this property and the NumStateFracLength
property. In combination, these properties fully specify how the filter
interprets the state it uses.
As with all fraction length properties, the value you enter here can be any
negative or positive integer, or zero. Fraction length can be larger than the
associated word length, as well. By default, the value is 16 bits, with the
NumStateFracLength
of 11 bits.
To define the output from your filter object, you need both the word and
fraction lengths. OutputFracLength
determines the fraction
length applied to interpret the output data. Combining this with
OutputWordLength
fully specifies the format of the
output.
Your fraction length can be any negative or positive integer, or zero. In addition, the fraction length you specify can be larger than the associated word length. Generally, the default value is 11 bits.
Sets the mode the filter uses to scale the filtered (output) data. You have the following choices:
AvoidOverflow
— directs the filter to set
the property that controls the output data fraction length to avoid
causing the data to overflow. In a df2
filter, this
would be the OutputFracLength
property.
BestPrecision
— directs the filter to set
the property that controls the output data fraction length to maximize
the precision in the output data. For df1t
filters,
this is the OutputFracLength
property. When you
change the word length (OutputWordLength
), the filter
adjusts the fraction length to maintain the best precision for the new
word size.
SpecifyPrecision
— lets you set the fraction
length used by the filtered data. When you select this choice, you can
set the output fraction length using the
OutputFracLength
property to define the output
precision.
All filters include this property except the direct form I filter which takes the output format from the filter states.
Here is an example that changes the mode setting to
bestprecision
, and then adjusts the word length for the
output.
hd=dfilt.df2 hd = FilterStructure: 'DirectForm II' Arithmetic: 'double' Numerator: 1 Denominator: 1 PersistentMemory: false States: [0x1 double] hd.arithmetic='fixed' hd = FilterStructure: 'DirectForm II' Arithmetic: 'fixed' Numerator: 1 Denominator: 1 PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' StateWordLength: 16 StateFracLength: 15 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap' get(hd) PersistentMemory: false FilterStructure: 'DirectForm II' States: [1x1 embedded.fi] Numerator: 1 Denominator: 1 Arithmetic: 'fixed' CoeffWordLength: 16 CoeffAutoScale: 1 Signed: 1 RoundMode: 'convergent' OverflowMode: 'wrap' InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' ProductMode: 'FullPrecision' StateWordLength: 16 StateFracLength: 15 NumFracLength: 14 DenFracLength: 14 OutputFracLength: 13 ProductWordLength: 32 NumProdFracLength: 29 DenProdFracLength: 29 AccumWordLength: 40 NumAccumFracLength: 29 DenAccumFracLength: 29 CastBeforeSum: 1 hd.outputMode='bestprecision' hd = FilterStructure: 'DirectForm II' Arithmetic: 'fixed' Numerator: 1 Denominator: 1 PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'BestPrecision' StateWordLength: 16 StateFracLength: 15 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap' hd.outputWordLength=8; get(hd) PersistentMemory: false FilterStructure: 'DirectForm II' States: [1x1 embedded.fi] Numerator: 1 Denominator: 1 Arithmetic: 'fixed' CoeffWordLength: 16 CoeffAutoScale: 1 Signed: 1 RoundMode: 'convergent' OverflowMode: 'wrap' InputWordLength: 16 InputFracLength: 15 OutputWordLength: 8 OutputMode: 'BestPrecision' ProductMode: 'FullPrecision' StateWordLength: 16 StateFracLength: 15 NumFracLength: 14 DenFracLength: 14 OutputFracLength: 5 ProductWordLength: 32 NumProdFracLength: 29 DenProdFracLength: 29 AccumWordLength: 40 NumAccumFracLength: 29 DenAccumFracLength: 29 CastBeforeSum: 1
Changing the OutputWordLength
to 8
bits
caused the filter to change the OutputFracLength
to
5
bits to keep the best precision for the output
data.
Use the property OutputWordLength
to set the word length
used by the output from your filter. Set this property to a value that matches
your intended hardware. For example, some digital signal processors use 32bit
output so you would set OutputWordLength
to
32
.
[b,a] = butter(6,.5); hd=dfilt.df1t(b,a); set(hd,'arithmetic','fixed') hd hd = FilterStructure: 'DirectForm I Transposed' Arithmetic: 'fixed' Numerator: [1x7 double] Denominator: [1 0 0.7777 0 0.1142 0 0.0018] PersistentMemory: false States: Numerator: [6x1 fi] Denominator:[6x1 fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' MultiplicandWordLength: 16 MultiplicandFracLength: 15 StateWordLength: 16 StateAutoScale: true ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap' hd.outputwordLength=32 hd = FilterStructure: 'DirectForm I Transposed' Arithmetic: 'fixed' Numerator: [1x7 double] Denominator: [1 0 0.7777 0 0.1142 0 0.0018] PersistentMemory: false States: Numerator: [6x1 fi] Denominator:[6x1 fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 32 OutputMode: 'AvoidOverflow' MultiplicandWordLength: 16 MultiplicandFracLength: 15 StateWordLength: 16 StateAutoScale: true ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'
When you create a filter object, this property starts with the value 16.
The OverflowMode
property is specified as one of the
following two character vectors indicating how to respond to overflows in
fixedpoint arithmetic:
'saturate'
— saturate overflows.
When the values of data to be quantized lie outside of the range of
the largest and smallest representable numbers (as specified by the
applicable word length and fraction length properties), these values are
quantized to the value of either the largest or smallest representable
value, depending on which is closest. saturate
is the
default value for OverflowMode
.
'wrap'
— wrap all overflows to the range of
representable values.
When the values of data to be quantized lie outside of the range of the largest and smallest representable numbers (as specified by the data format properties), these values are wrapped back into that range using modular arithmetic relative to the smallest representable number. You can learn more about modular arithmetic in FixedPoint Designer documentation.
These rules apply to the OverflowMode
property.
Applies to the accumulator and output data only.
Does not apply to coefficients or input data. These always saturate the results.
Does not apply to products. Products maintain full precision at all times. Your filters do not lose precision in the products.
Numbers in floatingpoint filters that extend beyond the dynamic range
overflow to ±inf
.
After you set ProductMode
for a fixedpoint filter to
SpecifyPrecision
, this property becomes available for you
to change. ProductFracLength
sets the fraction length the
filter uses for the results of multiplication operations. Only the FIR filters
such as asymmetric FIRs or lattice autoregressive filters include this dynamic
property.
Your fraction length can be any negative or positive integer, or zero. In addition, the fraction length you specify can be larger than the associated word length. Generally, the default value is 11 bits.
This property, available when your filter is in fixedpoint arithmetic mode,
specifies how the filter outputs the results of multiplication operations. All
dfilt
objects include this property when they use
fixedpoint arithmetic.
When available, you select from one of the following values for
ProductMode
:
FullPrecision
— means the filter
automatically chooses the word length and fraction length it uses to
represent the results of multiplication operations. The setting allow
the product to retain the precision provided by the inputs
(multiplicands) to the operation.
KeepMSB
— means you specify the word length
for representing product operation results. The filter sets the fraction
length to discard the LSBs, keep the higher order bits in the data, and
maintain the precision.
KeepLSB
— means you specify the word length
for representing the product operation results. The filter sets the
fraction length to discard the MSBs, keep the lower order bits, and
maintain the precision. Compare to the KeepMSB
option.
SpecifyPrecision
— means you specify the
word length and the fraction length to apply to data output from product
operations.
When you switch to fixedpoint filtering from floatingpoint, you are most
likely going to throw away some data bits after product operations in your
filter, perhaps because you have limited resources. When you have to discard
some bits, you might choose to discard the least significant bits (LSB) from a
result since the resulting quantization error would be small as the LSBs carry
less weight. Or you might choose to keep the LSBs because the results have MSBs
that are mostly zero, such as when your values are small relative to the range
of the format in which they are represented. So the options for
ProductMode
let you choose how to maintain the
information you need from the accumulator.
For more information about data formats, word length, and fraction length in fixedpoint arithmetic, refer to Notes About Fraction Length, Word Length, and Precision.
You use ProductWordLength
to define the data word length
used by the output from multiplication operations. Set this property to a value
that matches your intended application. For example, the default value is 32
bits, but you can set any word length.
set(hq,'arithmetic','fixed'); set(hq,'ProductWordLength',64);
Note that ProductWordLength
applies only to filters whose
Arithmetic
property value is
fixed
.
Determine whether the filter states get restored to their starting values for
each filtering operation. The starting values are the values in place when you
create the filter object. PersistentMemory
returns to zero
any state that the filter changes during processing. States that the filter does
not change are not affected. Defaults to false
— the
filter does not retain memory about filtering operations from one to the next.
Maintaining memory (setting PersistentMemory
to
true
) lets you filter large data sets as collections of
smaller subsets and get the same result.
In this example, filter hd
first filters data
xtot
in one pass. Then you can use hd
to filter x
as two separate data sets. The results
ytot
and ysec
are the same in both
cases.
xtot=[x,x]; ytot=filter(hd,xtot) ytot = 0 0.0003 0.0005 0.0014 0.0028 0.0054 0.0092 reset(hm1); % Clear history of the filter hm1.PersistentMemory='true'; ysec=[filter(hd,x) filter(hd,x)] ysec = 0 0.0003 0.0005 0.0014 0.0028 0.0054 0.0092
This test verifies that ysec
(the signal filtered by
sections) is equal to ytot
(the entire signal filtered at
once).
The RoundMode
property value specifies the rounding
method used for quantizing numerical values. Specify the
RoundMode
property values as one of the
following:
RoundMode  Description of Rounding Algorithm 

 Round toward positive infinity. 
 Round toward negative infinity. 
 Round toward nearest. Ties round toward positive infinity. 
 Round to the closest representable integer. Ties round to the nearest even stored integer. This is the least biased of the methods available in this software. 
 Round toward nearest. Ties round toward negative infinity for negative numbers, and toward positive infinity for positive numbers. 
 Round toward zero. 
The choice you make affects only the accumulator and output arithmetic. Coefficient and input arithmetic always round. Finally, products never overflow — they maintain full precision.
Filter structures df1sos
, df1tsos
,
df2sos
, and df2tsos
that use
fixed
arithmetic have this property that defines the
fraction length applied to the scale values the filter uses between sections. In
combination with CoeffWordLength
, these two properties fully
specify how the filter interprets and uses the scale values stored in the
property ScaleValues
. As with fraction length properties,
ScaleValueFracLength
can be any integer, including
integers larger than CoeffWordLength
, and positive or
negative integers. 15 bits is the default value when you create the
filter.
The ScaleValues
property values are specified as a scalar
(or vector) that introduces scaling for inputs (and the outputs from cascaded
sections in the vector case) during filtering:
When you only have a single section in your filter:
Specify the ScaleValues
property value as
a scalar if you only want to scale the input to your
filter.
Specify the ScaleValues
property as a
vector of length 2 if you want to specify scaling to the input
(scaled with the first entry in the vector) and the output
(scaled with the last entry in the vector).
When you have L cascaded sections in your filter:
Specify the ScaleValues
property value as
a scalar if you only want to scale the input to your
filter.
Specify the value for the ScaleValues
property as a vector of length L+1 if you
want to scale the inputs to every section in your filter, along
with the output:
The first entry of your vector specifies the input scaling
Each successive entry specifies the scaling at the output of the next section
The final entry specifies the scaling for the filter output.
The default value for ScaleValues
is 0.
The interpretation of this property is described as follows with diagrams in Interpreting the ScaleValues Property.
The value of the ScaleValues
property is not
quantized. Data affected by the presence of a scaling factor in the filter
is quantized according to the appropriate data format.
When you apply normalize
to a fixedpoint
filter, the value for the ScaleValues
property is changed
accordingly.
It is good practice to choose values for this property that are either positive or negative powers of two.
Interpreting the ScaleValues Property. When you specify the values of the ScaleValues
property of a quantized filter, the values are entered as a vector, the
length of which is determined by the number of cascaded sections in your
filter:
The following diagram shows how the ScaleValues
property values are applied to a quantized filter with only one
section.
The following diagram shows how the ScaleValues
property values are applied to a quantized filter with two sections.
When you create a dfilt
object for fixedpoint filtering
(you set the property Arithmetic
to
fixed
, the property Signed
specifies whether the filter interprets coefficients as signed or unsigned. This
setting applies only to the coefficients. While the default setting is
true
, meaning that all coefficients are assumed to be
signed, you can change the setting to false
after you create
the fixedpoint filter.
For example, create a fixedpoint directform II transposed filter with both
negative and positive coefficients, and then change the property value for
Signed
from true
to
false
to see what happens to the negative coefficient
values.
hd=dfilt.df2t(5:5) hd = FilterStructure: 'DirectForm II Transposed' Arithmetic: 'double' Numerator: [5 4 3 2 1 0 1 2 3 4 5] Denominator: 1 PersistentMemory: false States: [10x1 double] set(hd,'arithmetic','fixed') hd.numerator ans = 5 4 3 2 1 0 1 2 3 4 5 set(hd,'signed',false) hd.numerator ans = 0 0 0 0 0 0 1 2 3 4 5
Using unsigned coefficients limits you to using only positive coefficients in
your filter. Signed
is a dynamic property — you
cannot set or change it until you switch the setting for the
Arithmetic
property to fixed
.
When you convert a dfilt
object to secondorder section
form, or create a secondorder section filter, sosMatrix
holds the filter coefficients as property values. Using the
double
data type by default, the matrix is in [sections
coefficients per section] form, displayed as [15x6]
for
filters with 6 coefficients per section and 15 sections, [15 6].
To demonstrate, the following code creates an order 30 filter using
secondorder sections in the directform II transposed configuration. Notice the
sosMatrix
property contains the coefficients for all
the sections.
d = fdesign.lowpass('n,fc',30,0.5); hd = butter(d); hd = FilterStructure: 'DirectForm II, SecondOrder Sections' Arithmetic: 'double' sosMatrix: [15x6 double] ScaleValues: [16x1 double] PersistentMemory: false States: [2x15 double] hd.arithmetic='fixed' hd = FilterStructure: 'DirectForm II, SecondOrder Sections' Arithmetic: 'fixed' sosMatrix: [15x6 double] ScaleValues: [16x1 double] PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 SectionInputWordLength: 16 SectionInputAutoScale: true SectionOutputWordLength: 16 SectionOutputAutoScale: true OutputWordLength: 16 OutputMode: 'AvoidOverflow' StateWordLength: 16 StateFracLength: 15 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap' hd.sosMatrix ans = 1.0000 2.0000 1.0000 1.0000 0 0.9005 1.0000 2.0000 1.0000 1.0000 0 0.7294 1.0000 2.0000 1.0000 1.0000 0 0.5888 1.0000 2.0000 1.0000 1.0000 0 0.4724 1.0000 2.0000 1.0000 1.0000 0 0.3755 1.0000 2.0000 1.0000 1.0000 0 0.2948 1.0000 2.0000 1.0000 1.0000 0 0.2275 1.0000 2.0000 1.0000 1.0000 0 0.1716 1.0000 2.0000 1.0000 1.0000 0 0.1254 1.0000 2.0000 1.0000 1.0000 0 0.0878 1.0000 2.0000 1.0000 1.0000 0 0.0576 1.0000 2.0000 1.0000 1.0000 0 0.0344 1.0000 2.0000 1.0000 1.0000 0 0.0173 1.0000 2.0000 1.0000 1.0000 0 0.0062 1.0000 2.0000 1.0000 1.0000 0 0.0007
The SOS matrix is an Mby6 matrix, where M is the number of sections in the
secondorder section filter. Filter hd
has M equal to 15 as
shown above (15 rows). Each row of the SOS matrix contains the numerator and
denominator coefficients (b's and a's) and the scale factors of the
corresponding section in the filter.
Secondorder section filters include this property that determines who the filter handles data in the transitions from one section to the next in the filter.
How the filter represents the data passing from one section to the next
depends on the property value of SectionInputAutoScale
. The
representation the filter uses between the filter sections depends on whether
the value of SectionInputAutoScale
is
true
or false
.
SectionInputAutoScale
= true
means the filter chooses the fraction length to maintain the value of
the data between sections as close to the output values from the
previous section as possible. true
is the default
setting.
SectionInputAutoScale
= false
removes the automatic scaling of the fraction length for the
intersection data and exposes the property that controls the coefficient
fraction length (SectionInputFracLength
) so you can
change it. For example, if the filter is a secondorder, direct form FIR
filter, setting SectionInputAutoScale
to
false
exposes the
SectionInputFracLength
property that specifies
the fraction length applied to data between the sections.
Secondorder section filters use quantizers at the input to each section of
the filter. The quantizers apply to the input data entering each filter section.
Note that the quantizers for each section are the same. To set the fraction
length for interpreting the input values, use the property value in
SectionInputFracLength
.
In combination with CoeffWordLength
,
SectionInputFracLength
fully determines how the filter
interprets and uses the state values stored in the property
States
. As with all word and fraction length
properties, SectionInputFracLength
can be any integer,
including integers larger than CoeffWordLength
, and positive
or negative integers. 15 bits is the default value when you create the filter
object.
SOS filters are composed of sections, each one a secondorder filter.
Filtering data input to the filter involves passing the data through each filter
section. SectionInputWordLength
specifies the word length
applied to data as it enters one filter section from the previous section. Only
secondorder implementations of directform I transposed and directform II
transposed filters include this property.
The following diagram shows an SOS filter composed of sections (the bottom
part of the diagram) and a possible internal structure of each Section (the top
portion of the diagram), in this case — a direct form I transposed second
order sections filter structure. Note that the output of each section is fed
through a multiplier. If the gain of the multiplier =1
, then
the last Cast block of the Section is ignored, and the format of the output is
NumSumQ.
SectionInputWordLength
defaults to 16 bits.
Secondorder section filters include this property that determines who the filter handles data in the transitions from one section to the next in the filter.
How the filter represents the data passing from one section to the next
depends on the property value of SectionOutputAutoScale
.
The representation the filter uses between the filter sections depends on
whether the value of SectionOutputAutoScale
is
true
or false
.
SectionOutputAutoScale
= true
means the filter chooses the fraction length to maintain the value of
the data between sections as close to the output values from the
previous section as possible. true
is the default
setting.
SectionOutputAutoScale
= false
removes the automatic scaling of the fraction length for the
intersection data and exposes the property that controls the coefficient
fraction length (SectionOutputFracLength
) so you can
change it. For example, if the filter is a secondorder, direct form FIR
filter, setting SectionOutputAutoScale
=
false
exposes the
SectionOutputFracLength
property that specifies
the fraction length applied to data between the sections.
Secondorder section filters use quantizers at the output from each section of
the filter. The quantizers apply to the output data leaving each filter section.
Note that the quantizers for each section are the same. To set the fraction
length for interpreting the output values, use the property value in
SectionOutputFracLength
.
In combination with CoeffWordLength
,
SectionOutputFracLength
determines how the filter
interprets and uses the state values stored in the property
States
. As with all fraction length properties,
SectionOutputFracLength
can be any integer, including
integers larger than CoeffWordLength
, and positive or
negative integers. 15 bits is the default value when you create the filter
object.
SOS filters are composed of sections, each one a secondorder filter.
Filtering data input to the filter involves passing the data through each filter
section. SectionOutputWordLength
specifies the word length
applied to data as it leaves one filter section to go to the next. Only
secondorder implementations directform I transposed and directform II
transposed filters include this property.
The following diagram shows an SOS filter composed of sections (the bottom
part of the diagram) and a possible internal structure of each Section (the top
portion of the diagram), in this case — a direct form I transposed second
order sections filter structure. Note that the output of each section is fed
through a multiplier. If the gain of the multiplier =1
, then
the last Cast block of the Section is ignored, and the format of the output is
NumSumQ.
SectionOutputWordLength
defaults to 16 bits.
Although all filters use states, some do not allow you to choose whether the filter automatically scales the state values to prevent overruns or bad arithmetic errors. You select either of the following settings:
StateAutoScale
= true
means
the filter chooses the fraction length to maintain the value of the
states as close to the doubleprecision values as possible. When you
change the word length applied to the states (where allowed by the
filter structure), the filter object changes the fraction length to try
to accommodate the change. true
is the default
setting.
StateAutoScale
= false
removes
the automatic scaling of the fraction length for the states and exposes
the property that controls the coefficient fraction length so you can
change it. For example, in a direct form I transposed SOS FIR filter,
setting StateAutoScale
= false
exposes the NumStateFracLength
and
DenStateFracLength
properties that specify the
fraction length applied to states.
Each of the following filter structures provides the
StateAutoScale
property:
df1t
df1tsos
df2t
df2tsos
dffirt
Other filter structures do not include this property.
Filter states stored in the property States
have both
word length and fraction length. To set the fraction length for interpreting the
stored filter object state values, use the property value in
StateFracLength
.
In combination with CoeffWordLength
,
StateFracLength
fully determines how the filter
interprets and uses the state values stored in the property
States
.
As with all fraction length properties, StateFracLength
can be any integer, including integers larger than
CoeffWordLength
, and positive or negative integers. 15
bits is the default value when you create the filter object.
Digital filters are dynamic systems. The behavior of dynamic systems (their response) depends on the input (stimulus) to the system and the current or previous state of the system. You can say the system has memory or inertia. All fixed or floatingpoint digital filters (as well as analog filters) have states.
Filters use the states to compute the filter output for each input sample, as well using them while filtering in loops to maintain the filter state between loop iterations. This toolbox assumes zerovalued initial conditions (the dynamic system is at rest) by default when you filter the first input sample. Assuming the states are zero initially does not mean the states are not used; they are, but arithmetically they do not have any effect.
Filter objects store the state values in the property
States
. The number of stored states depends on the
filter implementation, since the states represent the delays in the filter
implementation.
When you review the display for a filter object with fixed arithmetic, notice
that the states return an embedded fi
object, as you see
here.
b = ellip(6,3,50,300/500); hd=dfilt.dffir(b) hd = FilterStructure: 'DirectForm FIR' Arithmetic: 'double' Numerator: [0.0773 0.2938 0.5858 0.7239 0.5858 0.2938 0.0773] PersistentMemory: false States: [6x1 double] hd.arithmetic='fixed' hd = FilterStructure: 'DirectForm FIR' Arithmetic: 'fixed' Numerator: [0.0773 0.2938 0.5858 0.7239 0.5858 0.2938 0.0773] PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: 'on' Signed: 'on' InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: 'on' RoundMode: 'convergent' OverflowMode: 'wrap' InheritSettings: 'off'
fi
objects provide fixedpoint support for the filters. To
learn more about the details about fi
objects, refer to your
FixedPoint
Designer documentation.
The property States
lets you use a fi
object to define how the filter interprets the filter states. For example, you
can create a fi
object in MATLAB, then assign the object to States, as follows:
statefi=fi([],16,12) statefi = [] DataTypeMode = Fixedpoint: binary point scaling Signed = true Wordlength = 16 Fractionlength = 12
This fi
object does not have a value associated (notice the
[]
input argument to fi
for the
value), and it has word length of 16 bits and fraction length of 12 bit. Now you
can apply statefi
to the States
property
of the filter hd
.
set(hd,'States',statefi); Warning: The 'States' property will be reset to the value specified at construction before filtering. Set the 'PersistentMemory' flag to 'True' to avoid changing this property value. hd hd = FilterStructure: 'DirectForm FIR' Arithmetic: 'fixed' Numerator: [0.0773 0.2938 0.5858 0.7239 0.5858 0.2938 0.0773] PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: 'on' Signed: 'on' InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: 'on' RoundMode: 'convergent' OverflowMode: 'wrap'
While all filters use states, some do not allow you to directly change the
state representation — the word length and fraction lengths —
independently. For the others, StateWordLength
specifies
the word length, in bits, the filter uses to represent the states. Filters that
do not provide direct state word length control include:
df1
dfasymfir
dffir
dfsymfir
For these structures, the filter derives the state format from the input
format you choose for the filter — except for the df1
IIR filter. In this case, the numerator state format comes from the input format
and the denominator state format comes from the output format. All other filter
structures provide control of the state format directly.
Directform FIR filter objects, both symmetric and antisymmetric, use this
property. To set the fraction length for output from the sum operations that
involve the filter tap weights, use the property value in
TapSumFracLength
. To enable this property, set the
TapSumMode
to SpecifyPrecision
in
your filter.
As you can see in this code example that creates a fixedpoint asymmetric FIR
filter, the TapSumFracLength
property becomes available
after you change the TapSumMode
property value.
hd=dfilt.dfasymfir hd = FilterStructure: 'DirectForm Antisymmetric FIR' Arithmetic: 'double' Numerator: 1 PersistentMemory: false States: [0x1 double] set(hd,'arithmetic','fixed'); hd hd = FilterStructure: 'DirectForm Antisymmetric FIR' Arithmetic: 'fixed' Numerator: 1 PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' TapSumMode: 'KeepMSB' TapSumWordLength: 17 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'
With the filter now in fixedpoint mode, you can change the
TapSumMode
property value to
SpecifyPrecision
, which gives you access to the
TapSumFracLength
property.
set(hd,'TapSumMode','SpecifyPrecision'); hd hd = FilterStructure: 'DirectForm Antisymmetric FIR' Arithmetic: 'fixed' Numerator: 1 PersistentMemory: false States: [1x1 embedded.fi] CoeffWordLength: 16 CoeffAutoScale: true Signed: true InputWordLength: 16 InputFracLength: 15 OutputWordLength: 16 OutputMode: 'AvoidOverflow' TapSumMode: 'SpecifyPrecision' TapSumWordLength: 17 TapSumFracLength: 15 ProductMode: 'FullPrecision' AccumWordLength: 40 CastBeforeSum: true RoundMode: 'convergent' OverflowMode: 'wrap'
In combination with TapSumWordLength
,
TapSumFracLength
fully determines how the filter
interprets and uses the state values stored in the property
States
.
As with all fraction length properties, TapSumFracLength
can be any integer, including integers larger than
TapSumWordLength
, and positive or negative integers. 15
bits is the default value when you create the filter object.
This property, available only after your filter is in fixedpoint mode,
specifies how the filter outputs the results of summation operations that
involve the filter tap weights. Only symmetric (dfilt.dfsymfir
) and
antisymmetric (dfilt.dfasymfir
) FIR filters use
this property.
When available, you select from one of the following values:
FullPrecision
— means the filter
automatically chooses the word length and fraction length to represent
the results of the sum operation so they retain all of the precision
provided by the inputs (addends).
KeepMSB
— means you specify the word length
for representing tap sum summation results to keep the higher order bits
in the data. The filter sets the fraction length to discard the LSBs
from the sum operation. This is the default property value.
KeepLSB
— means you specify the word length
for representing tap sum summation results to keep the lower order bits
in the data. The filter sets the fraction length to discard the MSBs
from the sum operation. Compare to the KeepMSB
option.
SpecifyPrecision
— means you specify the
word and fraction lengths to apply to data output from the tap sum
operations.
Specifies the word length the filter uses to represent the output from tap sum
operations. The default value is 17 bits. Only dfasymfir
and
dfsymfir
filters include this property.