DSP can be separated into 2 categories :
- Fixed point precision
- Floating point [ Single (32-bits) / Double (64-bits) ] precision
Fixed point DSPs are designed to represent and manipulate integers, positive and negative whole numbers typically via minimum of 16-bits yielding up to 2^16 possible bit patterns. In Fixed point the numbers are represented with a fixed number of digits after and sometimes before the decimal point.
Floating point DSPs, on the other hand, represent and manipulate rational numbers via a minimum of 32-bits where the number is represented with a mantissa and an exponent yielding up to 2^32 bit patterns. In floating point, the placement of the decimal point can float relative to the significant digits of the number.
Floating point processors can support a much wider dynamic range of values than fixed point with the ability to represent very small numbers and very large numbers. They yield much greater precision than fixed-point processing and are ideally suited for computationally intensive applications or when computational accuracy is a critical requirement.
Each time a DSP generates a new number via a mathematical calculation that number must be rounded to the nearest value that can be then stored. Rounding &/or truncating numbers during signal processing naturally yields to quantization error or ‘noise’. Since the gaps between adjacent numbers can be much larger with fixed-point when compared to floating-point processing, round-off error can be much more pronounced.
It is generally easier to develop algorithms for floating-point DSPs as fixed-point algorithms require greater manipulation to compensate for quantization noise. Designers typically choose floating-point DSPs when implementing complex algorithms. Fixed point filters are commonly used in DSPs where data storage and power consumption are key limiting factors.
With the constraints we specify, Filter Builder App of the DSP System toolbox + Fixed-Point Designer toolbox software allows us to design efficient fixed-point filters.
Filter can be designed first for floating-point (single/double precision) input to obtain a baseline. Can then use the baseline for comparison with the fixed-point filter.
The filter for this example is a lowpass Equiripple FIR filter with the following specification :
- Sample rate: 2kHz
- Centre frequency: 650Hz
- Transition Width: 100Hz
- Equiripple Design
- Maximum 1db of ripple in the passband
- Minimum 80db of attenuation in the stopband
For a Centre frequency of 650Hz and Transition width of 100Hz :
- Passband frequency : 600Hz
- Stopband frequency : 700Hz
‘Filter Builder App’ is only installed when installing System DSP toolbox. When ‘System DSP toolbox’ is installed for MATLAB home edition, it automatically installs also ‘Signal Processing toolbox’ + ‘Filter Designer’ app.
To start designing the Filter using the ‘Filter Builder’ App, under APPS can click on the ‘Filter Builder’ and then select ‘Lowpass’.
It will be designed initially as a floating-point double precision data type :
Floating-point double precision (64-bits) data type
Within the 'Main' menu :
Save the variable as: LPF_Double_Precision
Filter specifications :
- Impulse response: FIR
- Order mode: Minimum
- Filter type: Single-rate
Frequency specifications :
- Frequency units: kHz
- Input sample rate: 2
- Passband frequency: 0.6
- Stopband frequency: 0.7
Magnitude specifications :
- Magnitude units: dB
- Passband ripple: 1
- Stopband attenuation: 80
Algorithm :
- Design method: Equiripple
- Design options (can leave default values here)
Filter implementation :
- Structure: Direct-Form FIR
Within the Data types menu :
- Arithmetic : Double precision
Need to select Apply button to apply the updated Main & Data Types settings before visualizing the design. Then select View Filter Response
This will display automatically the Magnitude Response (dB) because the Analysis option has already Magnitude Response (dB) option ticked by default. Under Analysis can also view manually other filter characteristics such as :
- Phase Response
- Magnitude and Phase Responses (together)
- Impulse Response
- Pole-Zero plot
- Filter Coefficients
- Filter Information
- etc
Filter Information displays things such as :
- Filter structure
- Filter Length
- Stable or not
- Linear Phase or not
- Design Algorithm
- Design Options
- Design Specifications
- Measurements
- Implementation Cost
From the Measurements info can see whether it met the design specification requirements. The Filter Structure displays the filter structure eg Direct-Form FIR, the Filter length, stability & linear phase status. The Implementation Cost displays the number of Multipliers/Adders/States used + Multiplications/Additions per Input Sample (ie it estimates the computational complexity).
In this example the Measurements, Filter Structure & Implementation Cost results of this Equiripple LPF FIR were :
Measurements :
- Sample Rate: 2kHz => o.k
- Passband Edge: 600Hz => o.k
- 3-dB point: 616.3011Hz
- 6-dB point: 628.1421Hz
- Stopband Edge: 700Hz => o.k
- Passband Ripple: 0.96726dB < 1dB => ok
- Stopband Attenuation: 80.0905dB > 80dB => o.k
- Transition Width: 100Hz => ok
Filter Structure & it’s properties :
- Filter Structure : Direct-Form FIR
- Filter Length : 51
- Stable : Yes
- Linear Phase : Yes (Type 1)
Implementation Cost :
- Number of Multipliers: 51
- Number of Adders: 50
- Number of States: 50
- Multiplications per Input Sample: 51
- Additions per Input Sample: 50
Once satisfied with the Filter results,
Within the Code Generation menu :
Can generate MATLAB code (getFilter.m) based on filter specifications by selecting ‘Generate MATLAB code…’ option & leaving ‘Generate function that returns your filter as an output’ default option ticked.
Can also enquire automatically within the generated getFilter.m code the above results by adding manually the measure / info & cost functions. Then can also add the fvtool function to visualize the resulting design.
Here is the generated MATLAB code in a .pdf file that illustrates the above :
https://usercontent.one/wp/www.kevnugent.com/wp-content/uploads/2020/10/FIR_LPF_Floating_Double_Precision.pdf?media=1712708755
Floating-point single precision (32-bits) data type
Same steps were followed as above apart from the following :
Within the 'Main' menu :
Save the variable as: LPF_Single_Precision
Within the Data types menu :
- Arithmetic : Single precision
In this example the Measurements, Filter Structure & Implementation Cost results were identical and not much difference in Magnitude response between Single-Precision and Double Precision.
Here is the generated MATLAB code in a .pdf file that illustrates the above :
https://usercontent.one/wp/www.kevnugent.com/wp-content/uploads/2020/10/FIR_LPF_Floating_Single_Precision.pdf?media=1712708755
Fixed-point full precision data type (initial default settings)
Note: ‘Fixed-point Designer’ toolbox is required here for the ‘Fixed point’ option to be visible under the Data types Arithmetic menu.
Within the 'Main' menu
leave same settings as above apart from :
Save the variable as: LPF_Fixed_Point
Within the Data types menu :
Arithmetic : Fixed point
Fixed point data types : (leave all default values here)
Input Word Length: 16 (default value)
Input Frac Length: 15 (default value)
Coefficient Word Length: 16 (default value)
Filter intervals : Full Precision (default value)
Select the Apply button to apply the updated Main & Data Types settings before visualizing the design. Then select View Filter Response
In this example the Measurements/Implementation Cost results of this Equiripple LPF FIR were :
Measurements :
- Sample Rate: 2kHz => o.k
- Passband Edge: 600Hz => o.k
- 3-dB point: 616.304Hz
- 6-dB point: 628.144Hz
- Stopband Edge: 700Hz => o.k
- Passband Ripple: 0.9685dB < 1dB => ok
- Stopband Attenuation: 72.576dB < 80dB => Not o.k
- Transition Width: 100Hz => ok
Filter Structure & it’s properties :
- Filter Structure : Direct-Form FIR
- Filter Length : 51
- Stable : Yes
- Linear Phase : Yes (Type 1)
- Arithmetic : fixed
- Filter Internals : Full Precision
- Round Mode : No rounding
- Overflow Mode : No overflow
- etc
Implementation Cost :
- Number of Multipliers: 51
- Number of Adders: 50
- Number of States: 50
- Multiplications per Input Sample: 51
- Additions per Input Sample: 50
This fails the Stopband Attenuation requirement of 80dB
Here is the generated MATLAB code in a .pdf file that illustrates the above :
https://usercontent.one/wp/www.kevnugent.com/wp-content/uploads/2020/10/FIR_LPF_Fixed_Point_original.pdf?media=1712708755
Fixed-point full precision data type (increasing the transition width from 100dB ->200dB)
If we want a high minimum stopband attenuation without compromising on the number of coefficient bits, we must relax the other filter design constraint: the transition width
Increasing just the transition width from 100kHz -> 200kHz within the Main menu as follows :
- Passband frequency: 0.55 (Frequency units: kHz)
- Stopband frequency: 0.75
and the same coefficient length of 16, enabled us to get a higher Stopband Attenuation of 73.0869dB but this is still < 80dB ie it still misses out the spec requirements for stopband attenuation.
For FIR filters in general, each bit of coefficient word length provides approximately 4.5 – 5dB of stopband attenuation. However, it was almost impossible to achieve more than 4.5dB per bit coefficient word length in this example, even after relaxing the transition width (as illustrated here).
The filter length in this instance also decreased from 51 to 27 implying that fewer taps are required to implement this new FIR filter.
Here is the generated MATLAB code in a .pdf file that illustrates the above :
https://usercontent.one/wp/www.kevnugent.com/wp-content/uploads/2020/10/FIR_LPF_Fixed_Point_incr_transition_width.pdf?media=1712708755
Fixed-point full precision data type (increasing the coefficient length from 16bits -> 24bits)
If the coefficient word length is flexible, within the Main menu we leave the original default settings i.e
- Passband frequency: 0.6 (Frequency units: kHz)
- Stopband frequency: 0.7
and within the Data Types we can increment the Coefficients word length from 16bits -> 24bits.
Increasing the number of bits allowed for the coefficient word length makes the quantization error smaller and enables us to match the design requirement for 80dB of Stopband Attenuation. For a coefficient word length of 24bits a Stopband Attenuation of 80.0904dB was achieved as shown in the following attached modified regenerated MATLAB code within the .pdf file :
https://usercontent.one/wp/www.kevnugent.com/wp-content/uploads/2020/10/FIR_LPF_Fixed_Point_incr_coefficient_word_length.pdf?media=1712708755
Its worth mentioning that in many fixed point design applications, the coefficient word length is not flexible eg if we are restricted to work with 14bits, from the results shown below, the requested minimum Stopband Attenuation of 80dB cannot be reached! A filter with 14-bit coefficient quantization can achieve a minimum of only 62.7048dB after reviewing the Filter Information/Measurements: Stopband Attenuation results as shown below:
Measurements :
- Sample Rate: 2kHz => o.k
- Passband Edge: 600Hz => o.k
- 3-dB point: 616.3202Hz
- 6-dB point: 628.1535Hz
- Stopband Edge: 700Hz => o.k
- Passband Ripple: 0.97369dB < 1dB => ok
- Stopband Attenuation: 62.7048dB < 80dB => Not o.k
- Transition Width: 100Hz => ok
Here is the generated MATLAB code in a .pdf file that illustrates the above :
https://usercontent.one/wp/www.kevnugent.com/wp-content/uploads/2020/10/FIR_LPF_Fixed_Point_decr_coefficient_word_length.pdf?media=1712708755