DSP System Toolbox User's Guide
DSP System Toolbox User's Guide
User's Guide
R2015a
www.mathworks.com
www.mathworks.com/sales_and_services
User community:
www.mathworks.com/matlabcentral
Technical support:
www.mathworks.com/support/contact_us
Phone:
508-647-7000
Trademarks
MATLAB and Simulink are registered trademarks of The MathWorks, Inc. See
www.mathworks.com/trademarks for a list of additional trademarks. Other product or brand
names may be trademarks or registered trademarks of their respective holders.
Patents
MathWorks products are protected by one or more U.S. patents. Please see
www.mathworks.com/patents for more information.
Revision History
April 2011
September 2011
March 2012
September 2012
March 2013
September 2013
March 2014
October 2014
March 2015
First printing
Online only
Online only
Online only
Online only
Online only
Online only
Online only
Online only
Contents
DSP Tutorials
Introduction to Streaming Signal Processing in MATLAB . .
1-2
1-10
1-13
1-14
1-15
1-18
1-20
1-31
1-31
1-32
1-34
1-36
1-38
1-40
1-44
1-44
1-45
1-45
1-46
1-47
1-47
1-48
1-48
1-48
1-49
1-50
1-50
iii
iv
Contents
1-52
1-53
1-54
1-57
1-57
1-57
1-58
1-60
1-69
1-69
1-69
1-71
1-73
1-76
1-78
1-78
1-79
1-80
1-82
1-92
1-107
1-116
1-116
1-116
1-117
1-118
1-118
1-121
2-2
2-2
2-3
2-6
Continuous-Time Signals . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Continuous-Time Source Blocks . . . . . . . . . . . . . . . . . . . . .
Continuous-Time Nonsource Blocks . . . . . . . . . . . . . . . . . .
2-11
2-11
2-11
2-12
2-12
2-14
2-17
2-19
2-19
2-22
2-26
2-26
2-32
2-32
2-32
2-36
2-36
2-43
2-43
2-48
2-26
2-29
2-39
2-52
2-52
2-55
2-59
2-64
2-64
2-67
2-72
2-72
2-72
2-73
2-77
2-78
2-83
2-84
2-86
2-89
2-93
2-100
2-100
2-101
2-103
2-105
2-105
2-107
2-108
vi
Contents
3-2
3-2
3-3
3-3
3-4
3-8
3-8
3-9
3-11
3-13
3-15
3-19
3-19
3-20
3-24
3-28
3-34
3-36
3-39
3-43
3-43
3-43
3-59
3-59
3-61
3-61
3-64
3-67
3-69
3-46
3-51
3-54
3-54
vii
viii
Contents
4-2
4-2
4-10
4-10
4-14
4-14
4-18
4-20
4-28
4-33
4-37
4-42
4-47
4-52
4-53
4-53
4-62
4-74
4-77
4-77
4-85
4-99
4-111
4-111
4-112
4-113
4-114
4-116
4-121
4-121
4-121
4-130
4-131
4-133
4-133
4-133
4-134
4-135
4-140
4-140
4-141
4-143
4-145
Adaptive Filters
Overview of Adaptive Filters and Applications . . . . . . . . . . .
Introduction to Adaptive Filtering . . . . . . . . . . . . . . . . . . . . .
Adaptive Filtering Methodology . . . . . . . . . . . . . . . . . . . . . .
Choosing an Adaptive Filter . . . . . . . . . . . . . . . . . . . . . . . . .
System Identification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Inverse System Identification . . . . . . . . . . . . . . . . . . . . . . . .
Noise or Interference Cancellation . . . . . . . . . . . . . . . . . . . .
Prediction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5-2
5-2
5-2
5-4
5-5
5-6
5-7
5-7
5-9
5-9
5-9
5-11
5-12
5-12
5-13
5-17
5-19
5-23
5-26
ix
Contents
5-30
5-30
5-31
5-36
5-36
5-37
5-38
5-38
5-39
5-39
5-39
5-41
5-42
5-42
5-42
5-43
5-45
5-45
5-47
Selected Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5-59
5-53
5-58
6-2
6-2
6-2
Multistage Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Why Are Multistage Filters Needed? . . . . . . . . . . . . . . . . . . .
Optimal Multistage Filters in DSP System Toolbox . . . . . . . .
6-6
6-6
6-6
6-7
6-7
6-7
6-8
6-8
6-9
Filter Banks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dyadic Analysis Filter Banks . . . . . . . . . . . . . . . . . . . . . . .
Dyadic Synthesis Filter Banks . . . . . . . . . . . . . . . . . . . . . .
6-11
6-11
6-15
6-19
7-2
7-7
7-12
7-12
7-12
7-14
7-14
7-16
7-18
7-18
7-21
7-22
Spectral Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7-23
7-24
7-24
7-25
7-32
xi
Spectrograms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Modify the Block Diagram . . . . . . . . . . . . . . . . . . . . . . . . .
Set the Model Parameters . . . . . . . . . . . . . . . . . . . . . . . . . .
View the Spectrogram of the Speech Signal . . . . . . . . . . . . .
xii
Contents
7-35
7-35
7-37
7-41
Mathematics
Statistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Statistics Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Basic Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8-2
8-2
8-2
8-3
8-6
8-6
8-6
8-8
8-9
Fixed-Point Design
Fixed-Point Signal Processing . . . . . . . . . . . . . . . . . . . . . . . . .
Fixed-Point Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Benefits of Fixed-Point Hardware . . . . . . . . . . . . . . . . . . . . .
Benefits of Fixed-Point Design with System Toolboxes
Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9-2
9-2
9-2
9-4
9-4
9-5
9-6
Arithmetic Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Modulo Arithmetic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Two's Complement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Addition and Subtraction . . . . . . . . . . . . . . . . . . . . . . . . . .
9-9
9-9
9-10
9-11
9-3
10
Multiplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Casts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9-12
9-14
9-19
9-19
9-22
9-23
9-24
9-25
9-26
9-26
9-27
9-33
9-33
9-36
9-37
9-47
Quantizers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Scalar Quantizers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Vector Quantizers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9-55
9-55
9-62
9-69
9-69
9-69
9-70
9-79
9-95
C Code Generation
Understanding C Code Generation . . . . . . . . . . . . . . . . . . . .
C Code Generation with the Simulink Coder Product . . . . .
Highly Optimized Generated ANSI C Code . . . . . . . . . . . . .
10-2
10-2
10-3
xiii
11
xiv
Contents
10-4
10-12
10-13
10-13
10-15
10-15
10-18
10-19
11-3
11-5
11-7
11-11
11-13
11-16
11-19
11-21
11-23
11-27
11-29
11-32
11-34
11-36
11-39
11-41
11-45
11-49
11-50
11-52
11-54
11-56
11-61
11-63
11-66
11-68
11-70
11-72
11-74
11-76
11-78
11-81
xv
12
13
xvi
Contents
Methods Timing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Setup Method Call Sequence . . . . . . . . . . . . . . . . . . . . . . .
Step Method Call Sequence . . . . . . . . . . . . . . . . . . . . . . . .
Reset Method Call Sequence . . . . . . . . . . . . . . . . . . . . . . .
Release Method Call Sequence . . . . . . . . . . . . . . . . . . . . .
11-83
11-83
11-83
11-84
11-85
11-86
11-87
11-88
12-2
12-3
12-3
12-4
12-6
12-6
12-6
13-2
Sinks Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13-3
13-4
Filtering Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13-5
14
15
14-2
14-7
14-13
14-18
15-2
15-2
15-2
15-3
15-4
15-4
15-5
Using FDATool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Choosing a Response Type . . . . . . . . . . . . . . . . . . . . . . . . .
Choosing a Filter Design Method . . . . . . . . . . . . . . . . . . . .
Setting the Filter Design Specifications . . . . . . . . . . . . . . . .
Computing the Filter Coefficients . . . . . . . . . . . . . . . . . . .
Analyzing the Filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Editing the Filter Using the Pole/Zero Editor . . . . . . . . . .
Converting the Filter Structure . . . . . . . . . . . . . . . . . . . . .
Exporting a Filter Design . . . . . . . . . . . . . . . . . . . . . . . . .
Generating a C Header File . . . . . . . . . . . . . . . . . . . . . . .
Generating MATLAB Code . . . . . . . . . . . . . . . . . . . . . . . .
Managing Filters in the Current Session . . . . . . . . . . . . . .
Saving and Opening Filter Design Sessions . . . . . . . . . . . .
15-6
15-6
15-7
15-8
15-12
15-12
15-17
15-21
15-23
15-29
15-31
15-32
15-33
15-35
15-35
15-36
xvii
16
17
xviii
Contents
16-2
16-2
16-2
16-2
16-5
16-5
16-7
16-9
16-9
16-11
16-11
Bibliography
References Advanced Filters . . . . . . . . . . . . . . . . . . . . . . .
17-2
17-3
17-4
17-5
17-6
1
DSP Tutorials
Introduction to Streaming Signal Processing in MATLAB on page 1-2
Filter Frames of a Noisy Sine Wave Signal in MATLAB on page 1-10
Filter Frames of a Noisy Sine Wave Signal in Simulink on page 1-13
Lowpass Filter Design in MATLAB on page 1-20
Lowpass IIR Filter Design in Simulink on page 1-31
Create Moving Average System object on page 1-44
Tunable Lowpass Filtering of Audio Input in Simulink on page 1-52
Desktop Real-time Audio Acceleration with MATLAB Coder on page 1-57
Fixed-Point Filter Design in MATLAB on page 1-60
Sample Rate Conversion of Audio Signal in MATLAB and Simulink on page 1-69
Visualizing Multiple Signals Using Logic Analyzer on page 1-78
Signal Visualization and Measurements in MATLAB on page 1-92
Filter Frames of a Noisy Sine Wave Signal using Testbench Generator on page
1-107
Create Composite System object on page 1-116
Measure Audio Latency in MATLAB and Simulink on page 1-121
DSP Tutorials
Notch Filter
This example uses a simple second order IIR notch filter with a biquad (second-order
sections) structure to filter the audio signal. The filter has a notch at 200 Hz and a Qfactor of 35. The higher the Q-factor, the narrower the 3 dB bandwidth of the notch. You
can change these values and listen to the resulting audio for different filter specifications
if desired. The notch filter retains state each time it is executed making it well-suited for
streaming data.
1-2
Wo = 200/(Fs/2);
Q = 35;
BW = Wo/Q;
[b,a] = iirnotch(Wo,BW);
NotchFilter = dsp.BiquadFilter('SOSMatrix',[b,a]);
Streaming
Next, stream in and process your signal. Construct a while loop to run for 20 seconds.
A counter keeps track of how many frames are processed during the 20-second period.
Because each frame is 23.2 ms of audio, at least 861 frames must be processed in the 20second period for the system to operate in real time or faster.
tic
Tstop = 20;
count = 0;
while toc < Tstop
audioIn = step(AR);
audioOut = step(NotchFilter,audioIn);
plot(audioOut)
drawnow
count = count + 1;
end
1-3
DSP Tutorials
On a reasonably fast computer, the value of count exceeds 861 frames meaning the
processing can be done in real time or faster.
Streaming Without DSP Components
Instead of using System objects, you can use the audioread and filter functions.
However, audioread is not well-suited for streaming, because the file name and position
must be provided at each call. As a result, the performance of audioread is considerably
slower than the performance of the System object file reader in a streaming application.
filter provides adequate performance, but state must be passed in and out of filter
for use in a streaming application. This can result in inefficient and complicated code if
there are many components with state that must be handled manually.
z = [];
1-4
tic
count = 0;
while toc < Tstop
audioIn = audioread('guitar10min.ogg',count*FrameSize+[1 FrameSize]);
[audioOut,z] = filter(b,a,audioIn,z);
plot(audioOut)
drawnow
count = count + 1;
end
The plot update gives a visual indication of how much slower the code is with audioread
and filter is compared to the System object implementation. In particular, count
is considerably less than 861 frames, and therefore processing real-time audio in this
fashion is not feasible.
1-5
DSP Tutorials
1-6
1-7
DSP Tutorials
1-8
However, for maximum performance, avoid plotting the signal in time or frequency.
Streaming Live Audio
To stream audio from a microphone or line input, use the audio recorder,
dsp.AudioRecorder. If you want to write the processed audio to disk, use the audio
file writer, dsp.AudioFileWriter. The audio file writer supports a number of the most
common audio formats such as WAV, OGG, FLAC, and M4A.
1-9
DSP Tutorials
Lowpass Filter
The lowpass FIR filter uses a constrained equiripple filter design (firceqrip). The filter's
cutoff frequency is 5 kHz and the linear ripples in the passband and stopband are equal
to 0.05 and 0.001.
FIRLowPass = dsp.FIRFilter('Numerator', ...
firceqrip(30,5e3*2/44.1e3,[0.05 1e-3]));
Spectrum Analyzer
Set up the spectrum analyzer to compare the power spectra of the original and filtered
signals. The spectrum units are dBm.
SpecAna = dsp.SpectrumAnalyzer('PlotAsTwoSidedSpectrum',false, ...
'SampleRate',Sine1.SampleRate, ...
'ReducePlotRate',false, ...
'ShowLegend',true, ...
'YLimits',[-145,45]);
SpecAna.ChannelNames = {'Original noisy signal','Low pass filtered signal'};
Frame-Based Processing
This example uses frame-based processing. In frame-based processing, the data is
processed one frame at a time. Each frame of data contains sequential samples from
an independent channel. Frame-based processing is advantageous for many signal
processing applications because you can process multiple samples at once. By buffering
1-10
your data into frames and processing multi-sample frames of data, you often improve the
computational time of your signal processing algorithms. In this example, the number
of samples per frame is 4000. The FIR filter uses frame-based processing if the input is
frame based.
Sine1.SamplesPerFrame = 4000;
Sine2.SamplesPerFrame = 4000;
Simulation Results
Add zero-mean white Gaussian noise with a standard deviation of 0.1 to the sum of sine
waves and filter the result with the FIR filter. While running the simulation, you see in
the spectrum analyzer that frequencies above 4 kHz in the source signal are attenuated.
The resulting signal maintains the peak at 1 kHz because it falls in the passband of the
lowpass filter.
for i = 1 : 1000
x = step(Sine1)+step(Sine2)+0.1.*randn(Sine1.SamplesPerFrame,1);
y = step(FIRLowPass,x);
step(SpecAna,[x,y]);
end
release(SpecAna)
1-11
DSP Tutorials
1-12
1-13
DSP Tutorials
Open Model
1-14
Open the Library Browser by typing simulink at the MATLAB command prompt.
In the Simulink Template Gallery, under DSP System Toolbox, double-click Basic
Model.
Inspect Model
Input Signal
Three source blocks comprise the input signal. The input signal consists of the sum of two
sine waves and white Gaussian noise with mean 0 and variance 0.05. The frequencies of
the sine waves are 1 kHz and 15 kHz. The sampling frequency is 44.1 kHz. The following
figure shows the block parameters for the 1 kHz sine wave. Open the other source blocks
to see their parameters.
1-15
DSP Tutorials
1-16
Lowpass Filter
The lowpass filter is modeled using a Discrete FIR Filter block. The example uses a
constrained equiripple FIR filter design, firceqrip. The filter's cutoff frequency is 10
kHz. The linear ripples in the passband and stopband are equal to 0.05 and 1e-3.
The Lowpass FIR Filter block uses frame-based processing to process data one frame at
a time. Each frame of data contains sequential samples from an independent channel.
Frame-based processing is advantageous for many signal processing applications because
you can process multiple samples at once. By buffering your data into frames and
processing multisample frames of data, you can improve the computational time of
your signal processing algorithms. In this example, the number of samples per frame is
1-17
DSP Tutorials
256. Specify frame-based processing on the Lowpass FIR Filter block by setting Input
Processing to 'Columns as channels (frame based)'.
1-18
Frequencies above 10 kHz in the source signal are attenuated. The resulting signal
maintains the peak at 1 kHz because it falls in the passband of the lowpass filter.
1-19
DSP Tutorials
1-20
= 120;
= 48e3;
Fp = 8e3;
Ap = 0.01;
Ast = 80;
Obtain the maximum deviation for the passband and stopband ripples in linear units.
Rp = (10^(Ap/20) - 1)/(10^(Ap/20) + 1);
Rst = 10^(-Ast/20);
Design the filter using firceqrip and view the magnitude frequency response.
NUM = firceqrip(N,Fp/(Fs/2),[Rp Rst],'passedge');
fvtool(NUM,'Fs',Fs,'Color','White')
DSP Tutorials
Minimum-Order Designs
Another design function for optimal equiripple filters is firgr. firgr can design a
filter that meets passband/stopband ripple constraints as well as a specified transition
width with the smallest possible filter order. For example, if the stopband-edge frequency
is specified as 10 kHz, the resulting filter has an order of 100 rather than the 120thorder filter designed with firceqrip. The smaller filter order results from the larger
transition band.
Specify the stopband-edge frequency of 10 kHz. Obtain a minimum-order FIR filter with
a passband ripple of 0.01 dB and 80 dB of stopband attenuation.
Fst
= 10e3;
NumMin = firgr('minorder',[0 Fp/(Fs/2) Fst/(Fs/2) 1], [1 1 0 0],[Rp,Rst]);
Plot the magnitude frequency responses for the minimum-order FIR filter obtained with
firgr and the 120th-order filter designed with firceqrip. The minimum-order design
results in a filter with order 100. The transition region of the 120th-order filter is, as
expected, narrower than that of the filter with order 100.
fvtool(NUM,1,NumMin,1,'Fs',Fs,'Color','White');
legend('N = 120','N = 100');
1-22
Filtering Data
To apply the filter to data, you can use the filter command or you can use
dsp.FIRFilter. dsp.FIRFilter has the advantage of managing state when executed
in a loop. dsp.FIRFilter also has fixed-point capabilities and supports C code
generation, HDL code generation, and optimized code generation for ARM Cortex M
and ARM Cortex A.
Filter 10 seconds of white noise with zero mean and unit standard deviation in frames
of 256 samples with the 120th-order FIR lowpass filter. View the result on a spectrum
analyzer.
LP_FIR = dsp.FIRFilter('Numerator',NUM);
SA
= dsp.SpectrumAnalyzer('SampleRate',Fs,'SpectralAverages',5);
tic
1-23
DSP Tutorials
Using dsp.LowpassFilter
dsp.LowpassFilter is an alternative to using firceqrip and firgr in conjuction
with dsp.FIRFilter. Basically, dsp.LowpassFilter condenses the two step process
into one. dsp.LowpassFilter provides the same advantages that dsp.FIRFilter
provides in terms of fixed-point support, C code generation support, HDL code generation
support, and ARM Cortex code generation support.
1-24
Design a lowpass FIR filter for data sampled at 48 kHz. The passband-edge frequency is
8 kHz. The passband ripple is 0.01 dB and the stopband attenuation is 80 dB. Constrain
the filter order to 120. Create a dsp.FIRFilter based on your specifications.
LP_FIR = dsp.LowpassFilter('SampleRate',Fs,...
'DesignForMinimumOrder',false,'FilterOrder',N,...
'PassbandFrequency',Fp,'PassbandRipple',Ap,'StopbandAttenuation',Ast);
You can use LP_FIR to filter data directly, as shown in the preceding example. You can
also analyze the filter using FVTool or measure the response using measure.
fvtool(LP_FIR,'Fs',Fs,'Color','White');
measure(LP_FIR)
ans =
Sample Rate
Passband Edge
3-dB Point
6-dB Point
Stopband Edge
Passband Ripple
Stopband Atten.
Transition Width
:
:
:
:
:
:
:
:
48 kHz
8 kHz
8.5843 kHz
8.7553 kHz
9.64 kHz
0.01 dB
79.9981 dB
1.64 kHz
1-25
DSP Tutorials
ans =
Sample Rate
1-26
: 48 kHz
Passband Edge
3-dB Point
6-dB Point
Stopband Edge
Passband Ripple
Stopband Atten.
Transition Width
:
:
:
:
:
:
:
8 kHz
8.7136 kHz
8.922 kHz
10 kHz
0.0098641 dB
80.122 dB
2 kHz
Nlp =
100
Compare the FIR and IIR designs. Compute the cost of the two implementations.
hfvt = fvtool(LP_FIR,LP_IIR,'Fs',Fs,'Color','White');
legend(hfvt,'FIR Equiripple, N = 120', 'IIR Elliptic, N = 10');
cost_FIR = cost(LP_FIR)
cost_IIR = cost(LP_IIR)
cost_FIR =
NumCoefficients:
NumStates:
MultiplicationsPerInputSample:
AdditionsPerInputSample:
121
120
121
120
1-27
DSP Tutorials
cost_IIR =
NumCoefficients:
NumStates:
MultiplicationsPerInputSample:
AdditionsPerInputSample:
25
20
25
20
The FIR and IIR filters have similar magnitude responses. The cost of the IIR filter is
about 1/6 the cost of the FIR filter.
Running the IIR Filters
The IIR filter is designed as a biquad filter. To apply the filter to data, use the same
commands as in the FIR case.
1-28
Filter 10 seconds of white Gaussian noise with zero mean and unit standard deviation
in frames of 256 samples with the 10th-order IIR lowpass filter. View the result on a
spectrum analyzer.
SA = dsp.SpectrumAnalyzer('SampleRate',Fs,'SpectralAverages',5);
tic
while toc < 10
x = randn(256,1);
y = step(LP_IIR,x);
step(SA,y);
end
1-29
DSP Tutorials
1-30
Model
This example is based on the Simulink model ex_iir_design. The model includes one
lowpass filter for each of the four designs: Butterworth, Chebyshev type 1, Chebyshev
type 2, and elliptic. You can use the link under Select Filter to switch between designs
at any point during the simulation.
A stereo audio signal sampled at 44.1 kHz is passed through the filter. The audio input is
corrupted by N(0,10-5) Gaussian noise passed through a highpass filter. The original and
filtered signals are displayed in a spectrum analyzer. You can listen to either the original
or filtered signal by toggling the Manual Switch at the input of the To Audio Device
block.
The filters in this example all use direct-form II second-order sections (SOS).
model = 'ex_iir_design';
open_system(model);
set_param(model,'StopTime','1024/44100 * 100')
sim(model);
1-31
DSP Tutorials
Butterworth Filter
The first filter block is an 8-th order Butterworth lowpass filter with a cutoff frequency
of 5 kHz. This filter is maximally flat (no ripple in the passband or in the stopband).
Double click on the block to open the block dialog. You can visualize the filter's frequency
response by clicking the View Filter Response button on the block's dialog.
1-32
1-33
DSP Tutorials
1-34
1-35
DSP Tutorials
Zooming in on the passband, you can see that the ripples are contained in the range [-0.5,
0] dB.
1-36
1-37
DSP Tutorials
Elliptic Filter
An elliptic filter can provide steeper roll-off compared to previous designs by allowing
ripples in both the stopband and passband. To illustrate this, use the same passband and
stopband characteristics specified in the Chebyshev designs.
1-38
1-39
DSP Tutorials
Minimum-Order Designs
In cases where you specify the passband and stopband in terms of frequencies and the
amount of tolerable ripple, you can use a minimum-order design. As an example, the
Order mode of the Butterworth filter is set to Minimum. The normalized passband and
stopband frequencies are set to 0.1*22050 Hz and 0.3*22050 Hz. The passband ripple
is 1 dB and the stopband attenuation is 60 dB. A 7-th order filter is necessary to meet the
specifications with a Butterworth design. By following the same approach on the other
filter blocks, you can verify that a 5-th order filter is required for Chebyshev type I and
type II designs. A 4-th order filter is sufficient for the elliptic design.
1-40
1-41
DSP Tutorials
The following figure shows the magnitude response for the 7-th order Butterworth
design.
The pole-zero plot for the 7-th order Butterworth design shows the expected clustering of
7 poles around an angle of zero radians on the unit circle and the corresponding 7 zeros
at angle of radians.
1-42
1-43
DSP Tutorials
Introduction
This example shows how to create a System object that implements a moving average
filter. The example shows how to use the System object in MATLAB and Simulink
through the MATLAB System block. MovingAverageFilter is a simple moving
average System object filter, which computes the unweighted mean of the previous
WindowLength input samples, where WindowLength is the length of the moving
average window.
The System object accepts single-precision and double-precision 2-D input matrices.
Each column of the input matrix is treated as an independent (1-D) channel. The first
dimension of the input defines the length of the channel (or the input frame size).
MovingAverageFilter independently computes the moving average of each input
channel over time.
System object Usage in MATLAB on page 1-49 and System object Usage in
Simulink on page 1-50 show how to use your System object with data.
1-44
1-45
DSP Tutorials
WindowLength = 5
end
The state of the moving average filter is defined with the DiscreteState attribute. Get
the value of the state by calling the getDiscreteState method.
properties (DiscreteState)
State;
end
Finally, the System object operates on a possibly multichannel input and therefore
requires a property for the number of channels. This property is not accessible to users
and therefore you use the private attribute. The value of this property is determined
from the number of columns in the input.
properties (Access = private)
% pNumChannels Property used to cache the number of input channels
% (columns). Varying the number of channels during the streaming
% operation is not allowed (since it modifes the number of required
% states). The default of -1 means that the streaming operation has
% not started yet (i.e. the number ofo channels is still unknown).
pNumChannels = -1;
end
1-46
DSP Tutorials
Input Validation
validateInputsImpl validates inputs to the step method at initialization and at each
subsequent call to step where the input attributes (such as dimensions, data type or
complexity) change. In this example, validattributes ensures that the input is a 2-D
matrix with floating-point data.
function validateInputsImpl(obj, u)
validateattributes(u,{'double','single'}, {'2d',...
'nonsparse'},'','input');
% The number of input channels is not allowed to change. If
% pNumChannels = -1. This means that the streaming operation
% has not started yet (i.e. setupImpl has not been invoked
% yet). Do not perform the check in that case.
coder.internal.errorIf(obj.pNumChannels~=-1 && obj.pNumChannels ~= size(u,2
end
the saved object, the object loads in that locked state. In this System object, the filter
coefficients are saved if the object is locked.
function s = saveObjectImpl(obj)
s = [email protected](obj);
if isLocked(obj)
s.pCoefficients = obj.pCoefficients;
s.pNumChannels = obj.pNumChannels;
end
end
loadObjectImpl defines what System object property and state values are loaded when
you load a MAT-file. loadObjectImpl should correspond to your saveObjectImpl to
ensure that all saved properties and data are loaded.
function loadObjectImpl(obj,s,wasLocked)
if wasLocked
obj.pCoefficients = s.pCoefficients;
obj.pNumChannels = s.pNumChannels;
end
[email protected](obj,s,wasLocked);
end
1-49
DSP Tutorials
output = step(movingAverageFilter,input);
step(scope,input,output)
end
1-50
Run the model by clicking the Run button in the model or entering:
sim(model)
1-51
DSP Tutorials
1-52
Introduction
The input signal in this example is audio sampled at 22.5 kHz. The audio is read in from
a file 256 samples at a time. The audio is passed through a lowpass variable bandwidth
IIR filter and the result is played through the system's default audio output device. You
can use the switch in the model to compare the filtered and unfiltered audio. The filter is
implemented in Variable Bandwidth IIR Filter block.
1-53
DSP Tutorials
Having a variable bandwidth filter allows you to change the filter parameters while the
simulation is running. In this example, the passband frequency of the lowpass filter is
tunable. The algorithm in Variable Bandwidth IIR Filter block works by using frequency
transformations to recompute the filter coefficients when the passband frequency is
changed. This removes the need to redesign the whole filter. This also explains why the
filter order, passband ripple, and stopband attenuation are not tunable in real time.
Simulation
Simulating the model, you can hear the filtered audio and compare the power spectrum
of the filtered audio to the original unfiltered version.
1-54
You can also change the passband frequency of the filter while the simulation is running.
In order to do this, either double-click the Variable Bandwidth IIR Filter block or click on
the blue Tune passband frequency link. In the dialog that opens, change the value of
the Filter passband frequency. The effect of this change is immediately applied and
1-55
DSP Tutorials
you can observe the effects in the spectrum analyzer as well as hear the change in the
audio output.
1-56
Introduction
Replacing parts of your MATLAB code with an automatically generated MATLAB
executable (MEX-function) can speedup simulation. Using MATLAB Coder, you can
generate readable and portable C code and compile it into a MEX-function that replaces
the equivalent section of your MATLAB algorithm.
This example showcases code generation using an audio notch filtering application.
Notch Filtering
A notch filter is used to eliminate a specific frequency from a signal. Typical filter design
parameters for notch filters are the notch center frequency and the 3 dB bandwidth. The
center frequency is the frequency at which the filter has a linear gain of zero. The 3 dB
bandwidth measures the frequency width of the notch of the filter computed at the halfpower or 3 dB attenuation point.
The helper function used in this example is helperAudioToneRemoval. The
function reads an audio signal corrupted by a 250 Hz sinusoidal tone from a file.
helperAudioToneRemoval uses a notch filter to remove the interfering tone and writes
the filtered signal to a file.
You can visualize the corrupted audio signal using a spectrum analyzer.
scope = dsp.SpectrumAnalyzer('SampleRate',44.1e3,...
'RBWSource','Property','RBW',5,...
'PlotAsTwoSidedSpectrum',false,...
'SpectralAverages',10,...
1-57
DSP Tutorials
an audio file output, you must have write permission in the current directory. To ensure
write access, change directory to your systems temporary folder.
mydir = pwd; addpath(mydir); cd(tempdir);
tic;
helperAudioToneRemoval;
t1 = toc;
fprintf('MATLAB Simulation Time: %d\n',t1);
Measure the time it takes to execute the MEX-function and calculate the speedup gain
with a compiled function.
tic;
helperAudioToneRemoval_mex
t2 = toc;
fprintf('Code Generation Simulation Time: %d\n',t2);
fprintf('Speedup factor: %6.2f\n',t1/t2);
cd(mydir);
1-59
DSP Tutorials
1-60
LPF =
System: dsp.FIRFilter
Properties:
Structure:
NumeratorSource:
Numerator:
InitialConditions:
'Direct form'
'Property'
[1x52 double]
0
View the baseline frequency response. The dotted red lines show the design specifications
used to create the filter.
fvtool(LPF)
1-61
DSP Tutorials
The result of full-precision fixed-point filtering comes very close to floating point, but
the results are not exact. The reason for this is coefficient quantization. In the fixedpoint filter, the CoefficientsDataType property has the same word length (16) for
the coefficients and the input. The frequency response of the filter in full-precision mode
shows this more clearly. The measure function shows that the minimum stopband
attenuation of this filter with quantized coefficients is 76.6913 dB, less than the 80 dB
specified for the floating-point filter.
LPF.CoefficientsDataType
fvtool(LPF)
measure(LPF)
ans =
Same word length as input
1-62
ans =
Sample Rate
Passband Edge
3-dB Point
6-dB Point
Stopband Edge
Passband Ripple
Stopband Atten.
Transition Width
:
:
:
:
:
:
:
:
2 kHz
400 Hz
416.2891 Hz
428.1081 Hz
500 Hz
0.96325 dB
76.6913 dB
100 Hz
The filter was last used with fixed-point input and is still in a locked state. For that
reason, fvtool displays the fixed-point frequency response. The dash-dot response is
that of the reference floating-point filter, and the solid plot is the response of the filter
that was used with fixed-point input. The desired frequency response cannot be matched
1-63
DSP Tutorials
because the coefficient word length has been restricted to 16 bits. This accounts for the
difference between the floating-point and fixed-point designs. Increasing the number of
bits allowed for the coefficient word length makes the quantization error smaller and
enables you to match the design requirement for 80 dB of stopband attenuation. Use a
coefficient word length of 24 bits to achieve an attenuation of 80.1275 dB.
LPF24bitCoeff = design(designSpec,'equiripple','SystemObject',true);
LPF24bitCoeff.CoefficientsDataType = 'Custom';
coeffNumerictype = numerictype(fi(LPF24bitCoeff.Numerator,true,24));
LPF24bitCoeff.CustomCoefficientsDataType = numerictype(true, ...
coeffNumerictype.WordLength,coeffNumerictype.FractionLength);
fullPrecisionOutput32bitCoeff = step(LPF24bitCoeff,fixedPointInput);
norm(floatingPointOutput-double(fullPrecisionOutput32bitCoeff),'inf')
fvtool(LPF24bitCoeff)
measure(LPF24bitCoeff)
ans =
4.1077e-07
ans =
Sample Rate
Passband Edge
3-dB Point
6-dB Point
Stopband Edge
Passband Ripple
Stopband Atten.
Transition Width
1-64
:
:
:
:
:
:
:
:
2 kHz
400 Hz
416.2901 Hz
428.1091 Hz
500 Hz
0.96329 dB
80.1275 dB
100 Hz
ans =
1-65
DSP Tutorials
Sample Rate
Passband Edge
3-dB Point
6-dB Point
Stopband Edge
Passband Ripple
Stopband Atten.
Transition Width
:
:
:
:
:
:
:
:
2 kHz
400 Hz
416.2939 Hz
428.1081 Hz
500 Hz
0.96405 dB
67.2987 dB
100 Hz
For FIR filters in general, each bit of coefficient word length provides approximately 5 dB
of stopband attenuation. Accordingly, if your filter's coefficients are always quantized to
14 bits, you can expect the minimum stopband attenuation to be only around 70 dB. In
such cases, it is more practical to design the filter with stopband attenuation less than 70
dB. Relaxing this requirement results in a design of lower order.
designSpec.Astop = 60;
LPF60dBStopband = design(designSpec,'equiripple','SystemObject',true);
LPF60dBStopband.CoefficientsDataType = 'Custom';
coeffNumerictype = numerictype(fi(LPF60dBStopband.Numerator,true,14));
LPF60dBStopband.CustomCoefficientsDataType = numerictype(true, ...
coeffNumerictype.WordLength,coeffNumerictype.FractionLength);
measure(LPF60dBStopband,'Arithmetic','fixed')
order(LPF14bitCoeff)
order(LPF60dBStopband)
ans =
Sample Rate
Passband Edge
3-dB Point
6-dB Point
Stopband Edge
Passband Ripple
Stopband Atten.
Transition Width
ans =
51
1-66
:
:
:
:
:
:
:
:
2 kHz
400 Hz
419.3391 Hz
432.9718 Hz
500 Hz
0.92801 dB
59.1829 dB
100 Hz
ans =
42
The filter order decreases from 51 to 42, implying that fewer taps are required to
implement the new FIR filter. If you still want a high minimum stopband attenuation
without compromising on the number of bits for coefficients, you must relax the other
filter design constraint: the transition width. Increasing the transition width might
enable you to get higher attenuation with the same coefficient word length. However, it is
almost impossible to achieve more than 5 dB per bit of coefficient word length, even after
relaxing the transition width.
designSpec.Astop = 80;
transitionWidth = 200;
designSpec.Fpass = centerFrequency-transitionWidth/2;
designSpec.Fstop = centerFrequency+transitionWidth/2;
LPF300TransitionWidth = design(designSpec,'equiripple', ...
'SystemObject',true);
LPF300TransitionWidth.CoefficientsDataType = 'Custom';
coeffNumerictype = numerictype(fi(LPF300TransitionWidth.Numerator, ...
true, 14));
LPF300TransitionWidth.CustomCoefficientsDataType = numerictype(true, ...
coeffNumerictype.WordLength,coeffNumerictype.FractionLength);
measure(LPF300TransitionWidth,'Arithmetic','fixed')
ans =
Sample Rate
Passband Edge
3-dB Point
6-dB Point
Stopband Edge
Passband Ripple
Stopband Atten.
Transition Width
:
:
:
:
:
:
:
:
2 kHz
350 Hz
385.4095 Hz
408.6465 Hz
550 Hz
0.74045 dB
74.439 dB
200 Hz
As you can see, increasing the transition width to 200 Hz allows 74.439 dB of stopband
attenuation with 14-bit coefficients, compared to the 67.2987 dB attained when the
transition width was set to 100 Hz. An added benefit of increasing the transition width is
that the filter order also decreases, in this case from 51 to 27.
1-67
DSP Tutorials
order(LPF300TransitionWidth)
ans =
27
1-68
Introduction
This example shows how to use a multistage/multirate approach to sample rate
conversion between different audio rates. The example features both MATLAB and
Simulink implementations.
Digital audio recordings use many different sample rates. Examples include: 8 kHz,
11.025 kHz, 16 kHz, 22.05 kHz, 24 kHz, 44.1 kHz, 48 kHz, and 96 kHz. The lower
rates are used for speech or low fidelity audio, while the higher rates are primarily
used for high fidelity audio. Data is commonly resampled for use with different media
or equipment. When lower fidelity is acceptable, resampling can reduce data storage
requirements.
This example uses simple-to-design polyphase filters to convert a speech signal sampled
at 44.1 kHz (CD quality) to a signal sampled at 8 kHz (telephone systems).
1-69
DSP Tutorials
bw = 7200;
SRC = dsp.SampleRateConverter('Bandwidth',bw,'InputSampleRate',inFs,...
'OutputSampleRate',outFs);
1-70
The sample rate converter is a cascade of two stages: a FIR decimator followed by a
FIR fractional rate converter. The sample rate converter preserves the band of interest
between 0 and 3600 Hz, and suppresses the spectral replicas outside that band.
DSP Tutorials
View the short-time Fourier transform (spectrogram) of the sample-rate converter output
in a spectrum analyzer and write the output to a FLAC file in the current directory.
afr = dsp.AudioFileReader('dft_speech44100.wav','SamplesPerFrame',441);
afw = dsp.AudioFileWriter('dft_speech8000.flac','SampleRate',outFs,...
'FileFormat','FLAC','DataType','int16');
specana = dsp.SpectrumAnalyzer('SpectrumType','Spectrogram',...
'SampleRate',outFs,...
'PlotAsTwoSidedSpectrum',false,...
'FrequencyResolutionMethod', 'WindowLength',...
'WindowLength',441, ...
'FFTLengthSource','Property',...
'FFTLength',512,...
'OverlapPercent',25);
while ~isDone(afr)
audio = step(afr);
audioconvert = step(SRC, audio);
step(specana,audioconvert);
step(afw, audioconvert);
end
release(afr);
release(afw);
1-72
1-73
DSP Tutorials
To run the model, click the Run button on the model toolbar or enter the following
command.
sim('ex_audio_src')
1-74
The model reads in a speech signal sampled at 44.1 kHz. The sample rate is converted to
8 kHz and the short-time Fourier transform (spectrogram) of the output is displayed in
a spectrum analyzer. A FLAC file (dft_speech8000.flac) is written containing the output
sampled at 8 kHz. You can verify the sample rate of the output file after you run the
model with the following code.
audioinfo('dft_speech8000.flac')
ans =
Filename: 'tmp/\dft_speech8000.flac'
CompressionMethod: 'FLAC'
NumChannels: 1
1-75
DSP Tutorials
SampleRate: 8000
TotalSamples: 41280
Duration: 5.1600
Title: []
Comment: []
Artist: []
BitsPerSample: 16
ans =
Output Sample Rate Tolerance
Adjusted Output Sample Rate
1-76
: 1.000000 %
: 8018.181818
With a 0.01 tolerance, the number of coefficients of the sample rate converter reduces
from 7350 to 499. One of the stages in the cascade is eliminated and the interpolation
and decimation factors are reduced. Using this tolerance, the output sample rate is
8018.18 Hz, which may be an acceptable approximation in most cases to the desired rate
of 8000 Hz.
1-77
DSP Tutorials
Consider two FIR filters, one with a lowpass response and the other with a highpass
response. The coefficients can be specified using the InitFcn* callback function. To
specify the callback, select File > Model Properties > Model Properties. In the dialog
box, in the Callbacks tab, select InitFcn*.
1-78
The Programmable FIR via Registers block loads the lowpass coefficients from the Host
Behavioral Model block and processes the input chirp samples first. The block then loads
the highpass coefficients and processes the same chirp samples again.
Open the Programmable FIR via Registers block.
systemname = [modelname '/Programmable FIR via Registers'];
open_system(systemname);
Simulation
Run the example model.
sim(modelname)
1-79
DSP Tutorials
Compare the DUT (Design under Test) output with the reference output.
logsout_r = dspprogfirhdlReorderDataset(dspprogfirhdl_logsout);
Display the data in the logic analyzer. Use the helper function
analyzeLogicFromSimulink, which launches a logic analyzer, adds in a waveform for
every input, labels the waveform, and displays the data. analyzeLogicFromSimulink
returns a handle to the logic analyzer that you can use to modify the display.
analyzer = analyzeLogicFromSimulink(logsout_r);
1-81
DSP Tutorials
1-82
analyzer.DisplayChannelHeight
analyzer.TimeSpan = 12;
= 2;
DSP Tutorials
ofaddWaveandaddDivider, or you can get all the tags for the waveforms and dividers
using the getDisplayChannelTagsmethod.
Get the tags for all the displayed waveforms.
displayTags = analyzer.getDisplayChannelTags;
View the write address (second waveform in the display) in decimal mode.
modifyDisplayChannel(analyzer, 'DisplayChannelTag', displayTags{2}, ...
'Radix', 'Signed decimal');
1-84
Another useful mode of visualization in the logic analyzer is the analog format. View the
Filter In, Filter Out, and Ref Out signals in analog format.
modifyDisplayChannel(analyzer, 'DisplayChannelTag', displayTags{5}, ...
'Format', 'Analog');
modifyDisplayChannel(analyzer, 'DisplayChannelTag', displayTags{6}, ...
'Format', 'Analog');
1-85
DSP Tutorials
You can also add dividers and waveforms. By default, a new waveform or divider is
added to the bottom of the display. If you want, you can pass in the display channel while
1-86
adding in the waveform or divider. You can also move the waveform or divider after it
has been added to the display.
Add dividers for the coefficient and data signals. The divider for the coefficient signals
is set to be shown in Display Channel 1. The divider for the data signals is added to the
bottom of the display.
addDivider(analyzer, 'DisplayChannel', 1, 'Name', 'Coeff');
divTagData = addDivider(analyzer, 'Name', 'Data');
1-87
DSP Tutorials
Increase the size of the window so that all the waveforms and dividers are visible.
1-88
pos = analyzer.Position;
analyzer.Position = [pos(1) pos(2) pos(3) pos(4)+100];
Using the tag for a given waveform or divider, you can use moveDisplayChannel to
move it to the display channel of your choice.
Move the data signal divider to display channel 6.
moveDisplayChannel(analyzer, 'DisplayChannelTag', divTagData, 'DisplayChannel', 6);
1-89
DSP Tutorials
You can also operate on individual channels by right-clicking the channel name.
1-90
1-91
DSP Tutorials
1-92
1-93
DSP Tutorials
Time-Domain Measurements
Using the time scope, you can make a number of signal measurements.
The following measurements are available:
Cursor Measurements - puts screen cursors on all scope displays.
Signal Statistics - displays maximum, minimum, peak-to-peak difference, mean,
median, RMS values of a selected signal, and the times at which the maximum and
minimum occur.
Bilevel Measurements - displays information about a selected signal's transitions,
overshoots or undershoots, and cycles.
1-94
Peak Finder - displays maxima and the times at which they occur.
You can enable and disable these measurements from the time scope toolbar or from the
Tools > Measurements menu.
1-95
DSP Tutorials
To illustrate the use of measurements in the time scope, simulate an ECG signal. Use
the ecg function to generate 2700 samples of the signal. Use a Savitzky-Golay filter to
smooth the signal and periodically extend the data to obtain approximately 11 periods.
x = 3.5*ecg(2700).';
y = repmat(sgolayfilt(x,0,21),[1 13]);
sigData = y(1:30000)';
1-96
Display the signal in the time scope and use the Peak Finder, Cursor and Signal
Statistics measurements. Assume a sample rate of 4 kHz.
TS_ECG = dsp.TimeScope('SampleRate', 4000, ...
'TimeSpanSource', 'Auto', 'ShowGrid', true);
step(TS_ECG, sigData);
TS_ECG.YLimits = [-4, 4];
release(TS_ECG);
1-97
DSP Tutorials
Peak Measurements
Enable Peak Measurements by clicking the corresponding toolbar icon or by clicking
the Tools > Measurements > Peak Finder menu item. Click Settings in the Peak
Finder panel to expand the Settings pane. Enter 10 for Max Num of Peaks and press
Enter. The time scope displays in the Peaks pane a list of 10 peak amplitude values and
the times at which they occur.
1-98
There is a constant time difference of 0.675 seconds between each heartbeat. Therefore,
the heart rate of the ECG signal is given by the following equation:
Cursor Measurements
Enable Cursor Measurements by clicking the corresponding toolbar icon or by
clicking the Tools > Measurements > Cursor Measurements menu item. The Cursor
Measurements panel opens and displays two cursors in the time scope. You can drag
the cursors and use them to measure the time between events in the waveform. In the
following figure, cursors are used to measure the time interval between peaks in the ECG
waveform. The
measurement in the Cursor Measurements panel demonstrates that
the time interval between the two peaks is 0.675 seconds corresponding to a heart rate of
1.482 Hz or 88.9 beats/min.
1-99
DSP Tutorials
1-100
1-101
DSP Tutorials
1-102
Distortion Measurements
To illustrate the use of measurements with the spectrum analyzer, create a 2.5 kHz
sine wave sampled at 48 kHz with additive white Gaussian noise. Evaluate a high-order
polynomial (9th degree) at each signal value to model non-linear distortion. Display the
signal in a spectrum analyzer.
Fs = 48e3;
SW = dsp.SineWave('Frequency', 2500, ...
'SampleRate', Fs, 'SamplesPerFrame', SampPerFrame);
SA_Distortion = dsp.SpectrumAnalyzer('SampleRate', Fs, ...
'PlotAsTwoSidedSpectrum', false);
y = [1e-6 1e-9 1e-5 1e-9 1e-6 5e-8 0.5e-3 1e-6 1 3e-3];
tic;
while toc < 5
1-103
DSP Tutorials
x = step(SW) + 1e-8*randn(SampPerFrame,1);
sigData = polyval(y, x);
step(SA_Distortion, sigData);
end
clear SA_Distortion;
Peak Finder
1-104
You can track time-varying spectral components by using the Peak Finder measurement
dialog. You can show and optionally label up to 100 peaks. You can invoke the Peak
Finder dialog from the Tools > Measurements > Peak Finder menu item, or by
clicking the corresponding icon in the toolbar.
To illustrate the use of Peak Finder, create a signal consisting of the sum of three
sine waves with frequencies of 5, 15, and 25 kHz and amplitudes of 1, 0.1, and 0.01
respectively. The data is sampled at 100 kHz. Add
white Gaussian noise
to the sum of sine waves and display the one-sided power spectrum in the spectrum
analyzer.
Fs = 100e3;
SW1 = dsp.SineWave(1e0,
5e3, 0, 'SampleRate', Fs, 'SamplesPerFrame', SampPerFrame);
SW2 = dsp.SineWave(1e-1, 15e3, 0, 'SampleRate', Fs, 'SamplesPerFrame', SampPerFrame);
SW3 = dsp.SineWave(1e-2, 25e3, 0, 'SampleRate', Fs, 'SamplesPerFrame', SampPerFrame);
SA_Peak = dsp.SpectrumAnalyzer('SampleRate', Fs, 'PlotAsTwoSidedSpectrum', false);
tic;
while toc < 5
sigData = step(SW1) + step(SW2) + step(SW3) + 1e-4*randn(SampPerFrame,1);
step(SA_Peak, sigData);
end
clear SA_Peak;
Enable the Peak Finder to label the three sine wave frequencies. The frequency values
and powers in dBm are displayed in the Peak Finder panel. You can increase or
decrease the maximum number of peaks, specify a minimum peak distance, and change
other settings from the Settings pane in the Peak Finder Measurement panel.
1-105
DSP Tutorials
1-106
Each source is treated as a separate input to your algorithm, but you can associate more
than one sink with the same output from your algorithm.
testbenchGeneratorExampleApp
1-107
DSP Tutorials
1-108
After adding a source, you can select it and click Configure to change the selected
source's properties.
1-109
DSP Tutorials
Output
The power spectrum of the output is displayed on a spectrum analyzer in dBm. You can
add more sinks to visualize or post-process the outputs. Similar to inputs, you can use
the list under Add a new sink to the above list of outputs to add a new sink, and
click Configure to modify the properties of the selected sink.
You can associate a single output from the user algorithm with one or more sinks. For
example, you can visualize the same output signal with both a time scope and spectrum
analyzer. To do this, add the required sinks and make sure you associate all of the sinks
to desired output from the user algorithm by changing the value under the Associate
selected sink with list.
1-111
DSP Tutorials
1-112
1-113
DSP Tutorials
1-114
You can also tune some of the parameters used in your algorithm during testbench
execution. To use the Parameter Tuning UI, check the Enable parameter tuning
check box under the User Algorithm and click Edit parameters table to add the
details of your tunable parameters before you generate testbench code. Also, make sure
that your user algorithm handles parameter tuning during execution. See the MATLAB
code for hTestbenchVariableBandwithFIR for an example of how to make your user
algorithm work with parameter tuning.
1-115
DSP Tutorials
Create MultiNotchFilter
Create Moving Average System object on page 1-44 explains in detail how to write a
System object using a template file. In this example, the entire System object is provided
for convenience in dspdemo.MultiNotchFilter. To view the MATLAB code, at the
command prompt enter:
edit dspdemo.MultiNotchFilter
1-116
end
The ability to create more than one instance of a System object and having each instance
manage its own state is one of the biggest advantages of using System objects over
functions. The private properties NotchFilter1 and NotchFilter2 are used to store
the two notch filters.
properties (Access=private)
% This example class contains two notch filters (more can be added
% in the same way)
NotchFilter1
NotchFilter2
end
1-117
DSP Tutorials
1-118
Execute this code to show how the two notch center frequencies varied over the
simulation.
1-119
DSP Tutorials
subplot(2,1,1)
plot(CF1);
title('Center Frequency 1');
ylabel('Notch CF (Hz)');
subplot(2,1,2)
plot(CF2);
title('Center Frequency 2');
ylabel('Notch CF (Hz)');
xlabel('Iteration')
1-120
This example shows you how to measure the overall latency with a focus on what
parameters determine the latency effect of using MATLAB or Simulink. There are two
variants of this example: one uses the audio System objects in MATLAB and the other
uses the Simulink audio input and output blocks.
Set-up Experiment
In this example, measure the latency by playing an audio signal through
dsp.AudioPlayer (or the To Audio Device block), recording the audio through
dsp.AudioRecorder (or the From Audio Device block), and measuring the delay by
the cross-correlation of the two signals. No other processing is done on the audio signal.
A loopback cable is used to physically connect the audio-out port of the sound card to its
audio-in port. The set-up is shown in the following illustration.
1-121
DSP Tutorials
The set-up for another common application is to record live audio with a microphone,
process the audio on the computer, and play the audio back in a streaming fashion. In
that set-up, the hardware interface latency is the same as the set-up involving the audio
System objects or blocks: a sum of latencies due to the player and the recorder.
Measure Latency
The audioLatencyMeasurementBasicExampleApp function measures the latency for
the set-up where an audio signal is played and recorded with System objects or Simulink
blocks. Inputs to this function are:
plotFlag: Set this to true to visualize the input to the dsp.AudioPlayer object and
the output from the dsp.AudioRecorder object.
frameSize: Number of audio samples that constitute a single frame. This sets the
SamplesPerFrame property of the dsp.AudioFileReader object.
bufferSize: The value of this parameter is copied to the BufferSize property of the
dsp.AudioPlayer and the dsp.AudioRecorder System objects.
useSimulink: Set this to true to use the Simulink model
audiolatencybasicmeasurement.slx to measure the latency.
Most of these inputs are parameters that affect audio latency in MATLAB or Simulink.
You can try different values and measure the latency for each set. The various sections in
the MATLAB code for the audioLatencyMeasurementBasicExampleApp function are:
1
1-122
Initialization: The default values for the input parameters are assigned. The audio
System objects are created with appropriate parameter values.
1-123
DSP Tutorials
QueueDuration
Both dsp.AudioPlayer and dsp.AudioRecorder System objects have the property,
QueueDuration. The queue is a storage space between the System object and the
sound card buffer. The main use of QueueDuration is to match the throughput of the
algorithm in MATLAB and the device. A proper setting for QueueDuration can help
prevent buffer underruns and overruns. QueueDuration should be set to a value as
small as possible to maintain acceptable latency while not introducing glitches in the
audio. The optimal value for the queue size is typically twice the size of the audio frame.
Based on this, the QueueDuration is kept to a value of (2*FrameSize+1)/SampleRate.
The same parameters are also applicable in the Simulink version that uses audio
blocks instead of System objects. More details about BufferSize and QueueDuration
can be found in the documentation for the System objects dsp.AudioPlayer and
dsp.AudioRecorder, and the blocks To Audio Device and From Audio Device.
Sound Card and Drivers
Additionally, latency is affected by the sound card and drivers. For low-latency
applications, use a low-latency sound card. Drivers can also have an impact on latency.
For example, on the Windows platform, DirectSound creates an additional virtual
device layer between the application and the sound card, increasing latency. On the
other hand, ASIO drivers communicate with the device directly, which helps to reduce
delays.
Obtain Parameter Values for Low Latency
The latency of your system can depend on multiple parameters. In order to discover the
set of parameter values that provides the smallest latency, first fix an audio frame size.
Typically, this is 1024 or 512 samples for a sample rate of 44.1 kHz. Initially set the
buffer size the same value as the frame size and keep reducing it until the queue starts to
overrun or underrun. The smallest buffer size that satisfies this criterion is generally 64
or 128 samples for an audio frame size of 512 or 1024 at 44.1 kHz. Repeat the experiment
by starting with a smaller frame size.
Sample Results
Here are some results obtained by running
audioLatencyMeasurementBasicExampleApp with different input parameters
on a Mac OS X 10.8.5 system with a 3.4 GHz Core i7 processor and 16 GB of RAM.
Measurements were made using the built in audio I/O. The audio is stereo sampled at
44.1 kHz.
1-125
DSP Tutorials
Plotting the player and recorder audio signals along with latency
measurement:
latency = audioLatencyMeasurementBasicExampleApp(1,512,64,0);
Result: Latency of 13.9 ms.
You can also zoom into the plot to see the delay between the player and recorder
waveforms.
1-126
Summary
This example discussed the concept of latency in audio signals and demonstrated a
way in MATLAB and Simulink to quantify latency. The example also described various
parameters that influence audio latency. Some sample results obtained on a specific
computer were presented. Note that results vary based on machine configuration. You
can follow the advice in this example and experiment with different values to find the
combination that best suits your system and application.
1-127
2
Input, Output, and Display
Learn how to input, output and display data and signals with DSP System Toolbox.
Discrete-Time Signals on page 2-2
Continuous-Time Signals on page 2-11
Create Sample-Based Signals on page 2-12
Sample-Based Row Vector Processing Changes on page 2-17
Create Frame-Based Signals on page 2-19
Create Multichannel Sample-Based Signals on page 2-26
Create Multichannel Frame-Based Signals on page 2-32
Deconstruct Multichannel Sample-Based Signals on page 2-36
Deconstruct Multichannel Frame-Based Signals on page 2-43
Import and Export Sample-Based Signals on page 2-52
Import and Export Frame-Based Signals on page 2-64
Musical Instrument Digital Interface on page 2-72
Display Time-Domain Data on page 2-77
Display Frequency-Domain Data in Spectrum Analyzer on page 2-93
Visualize Central Limit Theorem in Array Plot on page 2-100
Display Multiple Signals in the Time Scope on page 2-105
Discrete-Time Signals
In this section...
Time and Frequency Terminology on page 2-2
Recommended Settings for Discrete-Time Simulations on page 2-3
Other Settings for Discrete-Time Simulations on page 2-6
Symbol
Units
Notes
Sample period
Ts
Tsi
Seconds
2-2
Discrete-Time Signals
Term
Symbol
Tso
Units
Notes
Frame period
Tf
Tfi
Tfo
Seconds
Signal period
Seconds
Sample frequency Fs
Hz (samples
per second)
Frequency
Nyquist rate
Nyquist
frequency
fnyq
Normalized
frequency
fn
Two cycles
per sample
Angular
frequency
Radians per
second
Digital
(normalized
angular)
frequency
Radians per
sample
Note In the Block Parameters dialog boxes, the term sample time is used to refer to
the sample period, Ts. For example, the Sample time parameter in the Signal From
Workspace block specifies the imported signal's sample period.
2-3
In the Simulink model window, from the Simulation menu, select Model
Configuration Parameters. The Configuration Parameters dialog box opens.
2-4
Discrete-Time Signals
You can automatically set the above solver options for all new models by using DSP
Simulink model templates. For more information, see Configure the Simulink
Environment for Signal Processing Models in the DSP System Toolbox documentation.
In Fixed-step SingleTasking mode, discrete-time signals differ from the prototype
described in Time and Frequency Terminology on page 2-2 by remaining defined
between sample times. For example, the representation of the discrete-time triangle
wave looks like this.
2-5
The above signal's value at t=3.112 seconds is the same as the signal's value at t=3
seconds. In Fixed-step SingleTasking mode, a signal's sample times are the
instants where the signal is allowed to change values, rather than where the signal is
defined. Between the sample times, the signal takes on the value at the previous sample
time.
As a result, in Fixed-step SingleTasking mode, Simulink permits cross-rate
operations such as the addition of two signals of different rates. This is explained further
in Cross-Rate Operations on page 2-7.
Discrete-Time Signals
for a description of the criteria that Simulink uses to make this decision. For the typical
model containing multiple rates, Simulink selects the multitasking mode.
Cross-Rate Operations
When the Fixed-step MultiTasking solver is selected, discrete signals in Simulink
are undefined between sample times. Therefore, to perform cross-rate operations like the
addition of two signals with different sample rates, you must convert the two signals to
a common sample rate. Several blocks in the Signal Operations and Multirate Filters
libraries can accomplish this task. See Convert Sample and Frame Rates in Simulink
for more information. Rate change can happen implicitly, depending on diagnostic
settings. See Multitask rate transition, Single task rate transition. However, this
is not recommended. By requiring explicit rate conversions for cross-rate operations in
discrete mode, Simulink helps you to identify sample rate conversion issues early in the
design process.
When the Variable-step solver or Fixed-step SingleTasking solver is selected,
discrete time signals remain defined between sample times. Therefore, if you sample the
signal with a rate or phase that is different from the signal's own rate and phase, you will
still measure meaningful values:
1
2-7
Double-click the upper Signal From Workspace block. The Block Parameters:
Signal From Workspace dialog box opens.
2-8
Discrete-Time Signals
The first column of the matrix is the fast signal, (Ts=1). The second column of the
matrix is the slow signal (Ts=2). The third column is the sum of the two signals.
As expected, the slow signal changes once every 2 seconds, half as often as the fast
signal. Nevertheless, the slow signal is defined at every moment because Simulink
holds the previous value of the slower signal during time instances that the block
doesn't run.
2-9
2-10
Continuous-Time Signals
Continuous-Time Signals
In this section...
Continuous-Time Source Blocks on page 2-11
Continuous-Time Nonsource Blocks on page 2-11
From the Sources library, click-and-drag a Constant block into the model.
From the Sinks library, click-and-drag a Display block into the model.
Double-click the Constant block, and set the block parameters as follows:
Constant value = [1 2 3; 4 5 6]
Interpret vector parameters as 1D = Clear this check box
Sampling Mode = Sample based
Sample time = 1
Based on these parameters, the Constant block outputs a constant, discrete-valued,
sample-based matrix signal with a sample period of 1 second.
2-12
The Constant block's Constant value parameter can be any valid MATLAB
variable or expression that evaluates to a matrix.
6
Save these parameters and close the dialog box by clicking OK.
From the Display menu, point to Signals & Ports and select Signal Dimensions.
Run the model and expand the Display block so you can view the entire signal.
You have now successfully created a six-channel, constant sample-based signal with
a sample period of 1 second.
To view the model you just created, and to learn how to create a 1D vector signal
from the block diagram you just constructed, continue to the next section.
To add another sample-based signal to your model, copy the block diagram you
created in the previous section and paste it below the existing sample-based signal in
your model.
Double-click the Constant1 block, and set the block parameters as follows:
Constant value = [1 2 3 4 5 6]
Interpret vector parameters as 1D = Check this box
Sample time = 1
Save these parameters and close the dialog box by clicking OK.
Run the model and expand the Display1 block so you can view the entire signal.
Your model should now look similar to the following figure. You can also open this
model by typing ex_usingcnstblksb at the MATLAB command line.
2-13
The Constant1 block generates a length-6 unoriented vector signal. This means that the
output is not a matrix. However, most nonsource signal processing blocks interpret a
length-M unoriented vector as an M-by-1 matrix (column vector).
2-14
From the Sources library, click-and-drag a Signal From Workspace block into the
model.
From the Simulink Sinks library, click-and-drag a To Workspace block into the
model.
Double-click the Signal From Workspace block, and set the block parameters as
follows:
Signal = cat(3,[1 -1;0 5],[2 -2;0 5],[3 -3;0 5])
Sample time = 1
Samples per frame = 1
Form output after final data value by = Setting to zero
Based on these parameters, the Signal From Workspace block outputs a four-channel
sample-based signal with a sample period of 1 second. After the block has output the
signal, all subsequent outputs have a value of zero. The four channels contain the
following values:
Channel 1: 1, 2, 3, 0, 0,...
Channel 2: -1, -2, -3, 0, 0,...
Channel 3: 0, 0, 0, 0, 0,...
Channel 4: 5, 5, 5, 0, 0,...
Save these parameters and close the dialog box by clicking OK.
From the Display menu, point to Signals & Ports, and select Signal Dimensions.
2-15
-1
5
yout(:,:,2) =
2
0
-2
5
yout(:,:,3) =
3
0
-3
5
yout(:,:,4) =
0
0
0
0
You have now successfully created a four-channel sample-based signal with sample
period of 1 second using the Signal From Workspace block.
2-16
If the input to the block is a sample-based row vector, the slupdate function places
a Transpose block in front of the affected block. The Transpose block transposes the
sample-based row vector into a column vector, which is then input into the affected
block. Transposing the input signal ensures that your model will produce the same
results in future releases.
If the input to the block is not a sample-based row vector, the slupdate function
takes no action. Your model will continue to work as expected in future releases.
2-18
From the Sources library, click-and-drag a Sine Wave block into the model.
From the Matrix Operations library, click-and-drag a Matrix Sum block into the
model.
From the Simulink Sinks library, click-and-drag a To Workspace block into the
model.
Connect the blocks in the order in which you added them to your model.
Double-click the Sine Wave block, and set the block parameters as follows:
Amplitude = [1 3 2]
Frequency = [100 250 500]
Sample time = 1/5000
Samples per frame = 64
2-19
Based on these parameters, the Sine Wave block outputs three sinusoids with
amplitudes 1, 3, and 2 and frequencies 100, 250, and 500 hertz, respectively. The
sample period, 1/5000, is 10 times the highest sinusoid frequency, which satisfies the
Nyquist criterion. The frame size is 64 for all sinusoids, and, therefore, the output
has 64 rows.
7
Save these parameters and close the dialog box by clicking OK.
You have now successfully created a three-channel frame-based signal using the Sine
Wave block. The rest of this procedure describes how to add these three sinusoids
together.
Double-click the Matrix Sum block. Set the Sum over parameter to Specified
dimension, and set the Dimension parameter to 2. Click OK.
From the Display menu, point to Signals & Ports, and select Signal Dimensions.
2-20
The three signals are summed point-by-point by a Matrix Sum block. Then, they are
exported to the MATLAB workspace.
11 At the MATLAB command line, type plot(yout(1:100)).
Your plot should look similar to the following figure.
2-21
This figure represents a portion of the sum of the three sinusoids. You have now added
the channels of a three-channel frame-based signal together and displayed the results in
a figure window.
2-22
From the Sources library, click-and-drag a Signal From Workspace block into the
model.
From the Simulink Sinks library, click-and-drag a To Workspace block into the
model.
Double-click the Signal From Workspace block, and set the block parameters as
follows:
Signal = [1:10; 1 1 0 0 1 1 0 0 1 1]'
Sample time = 1
Samples per frame = 4
Form output after final data value by = Setting to zero
Based on these parameters, the Signal From Workspace block outputs a twochannel, frame-based signal has a sample period of 1 second, a frame period of 4
seconds, and a frame size of four samples. After the block outputs the signal, all
subsequent outputs have a value of zero. The two channels contain the following
values:
Channel 1: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0,...
Channel 2: 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0,...
Save these parameters and close the dialog box by clicking OK.
From the Display menu, point to Signals & Ports, and select Signal Dimensions.
2-23
2-24
1
1
0
0
1
1
0
0
1
1
0
Note that zeros were appended to the end of each channel. You have now successfully
created a two-channel frame-based signal and exported it to the MATLAB workspace.
2-25
2-26
Double-click the Signal From Workspace block, and set the Signal parameter to
1:10. Click OK.
Double-click the Signal From Workspace1 block, and set the Signal parameter to
-1:-1:-10. Click OK.
2-27
Double-click the Signal From Workspace2 block, and set the Signal parameter to
zeros(10,1). Click OK.
Double-click the Signal From Workspace3 block, and set the Signal parameter to
5*ones(10,1). Click OK.
Double-click the Matrix Concatenate block. Set the block parameters as follows, and
then click OK:
Number of inputs = 4
Mode = Multidimensional array
Concatenate dimension = 1
Double-click the Reshape block. Set the block parameters as follows, and then click
OK:
Output dimensionality = Customize
Output dimensions = [2,2]
The 4-by-1 matrix output by the Matrix Concatenate block and the 2-by-2 matrix
output by the Reshape block in the above model represent the same four-channel
sample-based signal. In some cases, one representation of the signal may be more
useful than the other.
2-28
2-29
2-30
Double-click the Signal From Workspace block, and set the Signal parameter to
[1:10;-1:-1:-10]'. Click OK.
Double-click the Signal From Workspace1 block, and set the Signal parameter to
[zeros(10,1) 5*ones(10,1)]. Click OK.
Double-click the Matrix Concatenate block. Set the block parameters as follows, and
then click OK:
Number of inputs = 2
Mode = Multidimensional array
Concatenate dimension = 1
2-31
frame size. In this example, a single-channel frame-based signal is combined with a twochannel frame-based signal to produce a three-channel frame-based signal:
1
2-33
Double-click the Signal From Workspace block. Set the block parameters as follows:
Signal = [1:10;-1:-1:-10]'
Sample time = 1
2-34
Save these parameters and close the dialog box by clicking OK.
Double-click the Signal From Workspace1 block. Set the block parameters as follows,
and then click OK:
Signal = 5*ones(10,1)
Sample time = 1
Samples per frame = 4
The Signal From Workspace1 block has the same sample time and frame size as
the Signal From Workspace block. When you combine frame-based signals into
multichannel signals, the original signals must have the same frame rate and frame
size.
Double-click the Matrix Concatenate block. Set the block parameters as follows, and
then click OK:
Number of inputs = 2
Mode = Multidimensional array
Concatenate dimension = 2
2-35
2-36
Double-click the Signal From Workspace block, and set the block parameters as
follows:
Signal = randn(3,1,10)
Sample time = 1
2-37
Save these parameters and close the dialog box by clicking OK.
Double-click the Multiport Selector block. Set the block parameters as follows, and
then click OK:
Select = Rows
Indices to output = {1,2,3}
Based on these parameters, the Multiport Selector block extracts the rows of the
input. The Indices to output parameter setting specifies that row 1 of the input
should be reproduced at output1, row 2 of the input should be reproduced at
output2, and row3 of the input should be reproduced at output3.
This sample-based signal is the first row of the input to the Multiport Selector
block. You can view the other two input rows by typing dsp_examples_yout1 and
dsp_examples_yout2, respectively.
You have now successfully created three, single-channel sample-based signals from a
multichannel sample-based signal using a Multiport Selector block.
2-38
2-39
Double-click the Constant block, and set the block parameters as follows:
Constant value = rand(5,7)
Interpret vector parameters as 1D = Clear this check box
Sampling mode = Sample based
Sample Time = 1
2-40
Based on these parameters, the Constant block outputs a constant-valued, samplebased signal.
3
Save these parameters and close the dialog box by clicking OK.
Double-click the Submatrix block. Set the block parameters as follows, and then click
OK:
Row span = Range of rows
Starting row = Index
Starting row index = 3
Ending row = Last
Column span = Range of columns
Starting column = Offset from last
Starting column offset = 1
Ending column = Last
Based on these parameters, the Submatrix block outputs rows three to five, the last
row of the input signal. It also outputs the second to last column and the last column
of the input signal.
2-41
Notice that the output of the Submatrix block is equivalent to the matrix created by
rows three through five and columns six through seven of the input matrix.
You have now successfully created a six-channel, sample-based signal from a 35-channel
sample-based signal using a Submatrix block.
2-42
2-43
In this example, you use the Multiport Selector block to extract a single-channel and a
two channel frame-based signal from a multichannel frame-based signal:
1
2-44
Double-click the Signal From Workspace block, and set the block parameters as
follows:
Signal = [1:10;-1:-1:-10;5*ones(1,10)]'
2-45
Save these parameters and close the dialog box by clicking OK.
Double-click the Multiport Selector block. Set the block parameters as follows, and
then click OK:
Select = Columns
Indices to output = {[1 3],2}
Based on these parameters, the Multiport Selector block outputs the first and third
columns at the first output port and the second column at the second output port of
the block. Setting the Select parameter to Columns ensures that the block preserves
the frame rate and frame size of the input.
2-46
The Multiport Selector block outputs a two-channel frame-based signal, comprised of the
first and third column of the input signal, at the first port. It outputs a single-channel
frame-based signal, comprised of the second column of the input signal, at the second
port.
You have now successfully created a single-channel and a two-channel frame-based
signal from a multichannel frame-based signal using the Multiport Selector block.
2-47
2-48
Double-click the Signal From Workspace block, and set the block parameters as
follows:
Signal = [1:10;-1:-1:-10;5*ones(1,10)]'
Sample time = 1
Samples per frame = 4
2-49
Based on these parameters, the Signal From Workspace block outputs a threechannel, frame-based signal with a sample period of 1 second and a frame size of 4.
The frame period of this block is 4 seconds.
3
Save these parameters and close the dialog box by clicking OK.
Double-click the Constant block. Set the block parameters as follows, and then click
OK:
Constant value = [1 3 2]
Interpret vector parameters as 1D = Clear this check box
Sampling mode = Frame based
Frame period = 4
The discrete-time, frame-based vector output by the Constant block tells the
Permute Matrix block to swap the second and third columns of the input signal.
Note that the frame period of the Constant block must match the frame period of the
Signal From Workspace block.
Double-click the Permute Matrix block. Set the block parameters as follows, and
then click OK:
Permute = Columns
Index mode = One-based
Based on these parameters, the Permute Matrix block rearranges the columns of the
input signal, and the index of the first column is now one.
2-50
The second and third channel of the frame-based input signal are swapped.
7
You have now successfully reordered the channels of a frame-based signal using the
Permute Matrix block.
2-51
2-52
In the following example, you use the Signal From Workspace block to import a samplebased vector signal into your model:
1
2-53
Double-click the Signal From Workspace block, and set the block parameters as
follows:
Signal = [A B]
Sample time = 1
2-54
Save these parameters and close the dialog box by clicking OK.
The first row of the input matrix [A B] is output at time t=0, the second row of the
input matrix is output at time t=1, and so on.
You have now successfully imported a sample-based vector signal into your signal
processing model using the Signal From Workspace block.
2-55
In the following example, you use the Signal From Workspace block to import a fourchannel, sample-based matrix signal into a Simulink model:
1
2-56
Also, the following variables are loaded into the MATLAB workspace:
Fs
1x1
double array
dsp_examples_A
2x2x100
3200
double array
dsp_examples_sig1
1x1x100
800
double array
dsp_examples_sig12
1x2x100
1600
double array
dsp_examples_sig2
1x1x100
800
double array
2-57
dsp_examples_sig3
1x1x100
800
double array
dsp_examples_sig34
1x2x100
1600
double array
dsp_examples_sig4
1x1x100
800
double array
mtlb
4001x1
32008
double array
Double-click the Signal From Workspace block. Set the block parameters as follows,
and then click OK:
Signal = dsp_examples_A
Sample time = 1
Samples per frame = 1
Form output after final data value = Setting to zero
The dsp_examples_A array represents a four-channel, sample-based signal with
100 samples in each channel. This is the signal that you want to import, and it was
created in the following way:
dsp_examples_sig1 = reshape(1:100,[1 1 100])
dsp_examples_sig2 = reshape(-1:-1:-100,[1 1 100])
dsp_examples_sig3 = zeros(1,1,100)
dsp_examples_sig4 = 5*ones(1,1,100)
dsp_examples_sig12 = cat(2,sig1,sig2)
dsp_examples_sig34 = cat(2,sig3,sig4)
dsp_examples_A = cat(1,sig12,sig34) % 2-by-2-by-100 array
2-58
The Signal From Workspace block imports the four-channel sample based signal
from the MATLAB workspace into the Simulink model one matrix at a time.
You have now successfully imported a sample-based matrix signal into your model using
the Signal From Workspace block.
2-59
The workspace array always has time running along its third dimension, P. Samples
are saved along the P dimension whether the input is a matrix, vector, or scalar (single
channel case).
In the following example you use a ToWorkspace block to export a sample-based matrix
signal to the MATLAB workspace:
1
2-60
Also, the following variables are loaded into the MATLAB workspace:
dsp_examples_A
2x2x100
3200
double array
dsp_examples_sig1
1x1x100
800
double array
dsp_examples_sig12
1x2x100
1600
double array
dsp_examples_sig2
1x1x100
800
double array
2-61
dsp_examples_sig3
1x1x100
800
double array
dsp_examples_sig34
1x2x100
1600
double array
dsp_examples_sig4
1x1x100
800
double array
In this model, the Signal From Workspace block imports a four-channel samplebased signal called dsp_examples_A. This signal is then exported to the MATLAB
workspace using a To Workspace block.
2
Double-click the Signal From Workspace block. Set the block parameters as follows,
and then click OK:
Signal = dsp_examples_A
Sample time = 1
Samples per frame = 1
Form output after final data value = Setting to zero
Based on these parameters, the Signal From Workspace block outputs a samplebased signal with a sample period of 1 second. After the block has output the signal,
all subsequent outputs have a value of zero.
Double-click the To Workspace block. Set the block parameters as follows, and then
click OK:
Variable name = dsp_examples_yout
Limit data points to last parameter to inf
Decimation = 1
Based on these parameters, the To Workspace block exports its sample-based input
signal to a variable called dsp_examples_yout in the MATLAB workspace. The
workspace variable can grow indefinitely large in order to capture all of the input
data. The signal is not decimated before it is exported to the MATLAB workspace.
2-62
-1
dsp_examples_yout(:,:,2) =
2
0
-2
5
dsp_examples_yout(:,:,3) =
3
0
-3
5
dsp_examples_yout(:,:,4) =
4
0
-4
5
Each page of the output represents a different sample time, and each element of the
matrices is in a separate channel.
You have now successfully exported a four-channel sample-based signal from a Simulink
model to the MATLAB workspace using the To Workspace block.
2-63
2-64
Note: Although independent channels are generally represented as columns, a singlechannel signal can be represented in the workspace as either a column vector or row
vector. The output from the Signal From Workspace block is a column vector in both
cases.
In the following example, you use the Signal From Workspace block to create a threechannel frame-based signal and import it into the model:
1
2-65
Double-click the Signal From Workspace block. Set the block parameters as follows,
and then click OK:
Signal parameter to [dsp_examples_A dsp_examples_B]
Sample time parameter to 1
Samples per frame parameter to 4
Form output after final data value parameter to Setting to zero
Based on these parameters, the Signal From Workspace block outputs a frame-based
signal with a frame size of 4 and a sample period of 1 second. The signal's frame
period is 4 seconds. The Signal parameter uses the standard MATLAB syntax for
horizontally concatenating matrices to append column vector dsp_examples_B
2-66
to the right of matrix dsp_examples_A. After the block has output the signal, all
subsequent outputs have a value of zero.
3
You have now successfully imported a three-channel frame-based signal into your model
using the Signal From Workspace block.
2-67
In the following example, you use a ToWorkspace block to export a frame-based signal to
the MATLAB workspace:
1
2-68
Double-click the Signal From Workspace block. Set the block parameters as follows,
and then click OK:
Signal = [dsp_examples_A dsp_examples_B]
Sample time = 1
2-69
Double-click the To Workspace block. Set the block parameters as follows, and then
click OK:
Variable name = dsp_examples_yout
Limit data points to last = inf
Decimation = 1
Frames = Concatenate frames (2-D array)
Based on these parameters, the To Workspace block exports its frame-based input
signal to a variable called dsp_examples_yout in the MATLAB workspace. The
workspace variable can grow indefinitely large in order to capture all of the input
data. The signal is not decimated before it is exported to the MATLAB workspace,
and each input frame is vertically concatenated to the previous frame to produce a 2D array output.
2-70
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
5
5
5
5
5
5
5
5
5
5
5
5
2-71
About MIDI
The Musical Instrument Digital Interface (MIDI) was originally developed to
interconnect electronic musical instruments. This interface is very flexible and has many
uses in many applications far beyond musical instruments. Its simple unidirectional
messaging protocol supports many different kinds of messaging.
Windows, Macintosh, and Linux platforms all have native support for MIDI, so software
on any of these platforms can send and receive MIDI messages. See http://www.midi.org
for more information about MIDI.
The simplest MIDI control surfaces are unidirectional; they end MIDI Control Change
messages, but do not receive them. More sophisticated control surfaces are bidirectional:
They can both send and receive Control Change messages. These control surfaces have
knobs or sliders that can be operated automatically. For example, a control surface can
have sliders or knobs that are motorized. When it receives a Control Change message,
the appropriate control is moved to the position in the message. You can use this feature
to synchronize software GUI with MIDI control surface. For example, moving a slider on
the MIDI control surface sends a Control Change message to a GUI slider, which then
moves to match the control surface. Similarly, moving the GUI slider sends a Control
Change message to the MIDI control surface, which then moves to match the GUI slider.
This preference persists across MATLAB sessions, so you only have to set it once, unless
you want to change devices.
If you do not set this preference, MATLAB and the host operating system choose a device
for you. However, such autoselection can cause unpredictable results because many
computers have virtual (software) MIDI devices installed that you may not be aware of.
For predictable behavior, you should set the preference.
You can always override this default and explicitly specify a device name. Thus, you can
use multiple MIDI devices simultaneously.
Identifying Controls
Before you can connect a MIDI control with MATLAB or Simulink, you must know the
identifiers for that particular control:
Control number
Device name
The control number is a fixed integer assigned by the device manufacturer. Some devices
may change the assigned number based on various modes, or you can reprogram the
number. The device name is determined by the manufacturer and the host operating
system. You use midiid to determine both.
You do not usually have to use midiid repeatedly. If you use a single device in most
cases, then specify that device as the default hardware. the You can save the control
numbers in a function, a .mat file, or whatever form you find convenient. This example
shows a function returning a struct with all the control numbers for a Behringer
BCF2000:
function ctls = BCF2000
% BCF2000 return MIDI control number assignments
% for Behringer BCF2000 MIDI control surface
2-74
ctls.knobs = 1001:1008;
ctls.buttons = [1065:1072;1073:1080];
ctls.sliders = 1081:1088;
end
MATLAB Interface
To use the MATLAB interface functions, first call midicontrols to specify any devices
or controls to listen to. midicontrols returns an object, which you pass to the other
functions for subsequent operations. You can now read the values of the specified MIDI
controls by calling midiread with that object. MATLAB can respond to changes in MIDI
controls by periodically calling midiread.
You can also set a callback on the specified MIDI controls by calling midicallback with
that object and a function handle. The next time the MIDI controls change value, the
function handle is invoked and passed to the object. The callback function typically calls
midiread to determine the new value of the MIDI controls. You can use this callback
when you want a MIDI control to trigger an action (such as update a GUI). Using this
approach prevents having a continuously running MATLAB program in the command
window.
Synchronization
If midiread is called before the MIDI control sends a Control Change message, the
midicontrols object has no information about the actual state of the MIDI control.
During this time, the midicontrols object and the actual MIDI control are out of sync
with each other. Thus, calling midiread returns the initial value that was specified in
the call to midicontrols (0 by default). You can synchronize the object with the control
by moving the MIDI control. The MIDI control responds by sending a Control Change
message causing the midicontrols object to sync to the MIDI control. If your MIDI
control surface is bidirectional, you can sync in the other direction by calling midisync
to send the midicontrols objects initial value to the actual MIDI control. The MIDI
control responds by moving into sync with the midicontrols object.
It is generally harmless to call midisync even if the MIDI control surface is not
bidirectional, so it is usually good practice to call midisync immediately after calling
midicontrols.
Synchronization is also useful to link a MIDI control with a GUI control (a uicontrol
slider, for example), so that when one control is changed, the other control tracks it.
Typically, you implement such tracking by setting callback functions on both the MIDI
control (using midicallback) and the GUI control. The MIDI control callback sends its
2-75
new value to the GUI control and the GUI control sends its value to the MIDI control,
using midisync.
Simulink Interface
The MIDI Controls block provides the Simulink interface. See the block reference page
MIDI Controls for more details.
2-76
2-77
Use the following workflow to configure the Time Scope blocks in the
ex_timescope_tut model:
1
Inspect Your Data (Scaling the Axes and Zooming) on page 2-86
2-78
The Configuration Properties dialog box has four different tabs, Main, Time, Display,
and Logging, each of which offers you a different set of options. For more information
about the options available on each of the tabs, see the Time Scope block reference page.
Note: As you progress through this workflow, notice the blue question mark icon (
in the lower-left corner of the subsequent dialog boxes. This icon indicates that contextsensitive help is available. You can get more information about any of the parameters on
the dialog box by right-clicking the parameter name and selecting What's This?
Configure Appearance and Specify Signal Interpretation
First, you configure the appearance of the Time Scope window and specify how the Time
Scope block should interpret input signals. In the Configuration Properties dialog box,
click the Main tab. Choose the appropriate parameter settings for the Main tab, as
shown in the following table.
Parameter
Setting
Open at
Checked
simulation start
Number of input 2
ports
Input
processing
Maximize axes
Auto
Axes scaling
Manual
In this tutorial, you want the block to treat the input signal as frame-based, so you must
set the Input processing parameter to Columns as channels (frame based).
Configure Axes Scaling and Data Alignment
The Main tab also allows you to control when and how Time Scope scales the axes. These
options also control how Time Scope aligns your data with respect to the axes. Click the
link labeled Configure... to the right of the Axes scaling parameter to see additional
options for axes scaling. After you click this button, the label changes to Hide... and new
parameters appear. The following table describes these additional options.
2-79
Parameter
Description
Axes scaling
Specify when the scope automatically scales the axes. You can select
one of the following options:
Manual When you select this option, the scope does not
automatically scale the axes. You can manually scale the axes in
any of the following ways:
Select Tools > Axes Scaling Properties.
Press one of the Scale Axis Limits toolbar buttons.
When the scope figure is the active window, press Ctrl and A
simultaneously.
Auto When you select this option, the scope scales the axes as
needed, both during and after simulation. Selecting this option
shows the Do not allow Y-axis limits to shrink check box.
After N Updates Selecting this option causes the scope to
scale the axes after a specified number of updates. This option is
useful and more efficient when your scope display starts with one
axis scale, but quickly reaches a different steady state axis scale.
Selecting this option shows the Number of updates edit box.
By default, this property is set to Auto. This property is Tunable.
Scale axes limits Select this check box to scale the axes when the simulation stops.
The y-axis is always scaled. The x-axis limits are only scaled if you
at stop
also select the Scale X-axis limits check box.
2-80
Allows you to specify how much white space surrounds your signal
in the Time Scope window. You can specify a value for both the
y- and x-axis. The higher the value you enter for the y-axis Data
range (%), the tighter the y-axis range is with respect to the
minimum and maximum values in your signal. For example, to have
your signal cover the entire y-axis range when the block scales the
axes, set this value to 100.
Align
Allows you to specify where the block should align your data with
respect to each axis. You can choose to have your data aligned with
the top, bottom, or center of the y-axis. Additionally, if you select the
Autoscale X-axis limits check box, you can choose to have your
data aligned with the right, left, or center of the x-axis.
Setting
Axes scaling
Manual
80
Align
Center
Setting
Time span
Time span
overrun action
Wrap
Time units
Time display
offset
Checked
The Time span parameter allows you to enter a numeric value, a variable that evaluates
to a numeric value, or select the One frame period menu option. You can also select
the Auto menu option; in this mode, Time Scope automatically calculates the appropriate
value for time span from the difference between the simulation Start time and Stop
time parameters. The actual range of values that the block displays on the time-axis
depends on the value of both the Time span and Time display offset parameters. See
the following figure.
2-81
If the Time display offset parameter is a scalar, the value of the minimum time-axis
limit is equal to the Time display offset. In addition, the value of the maximum timeaxis limit is equal to the sum of the Time display offset parameter and the Time span
parameter. For information on the other parameters in the Time Scope window, see the
Time Scope reference page.
In this tutorial, the values on the time-axis range from 0 to One frame period, where
One frame period is 0.05 seconds (50 ms).
Set Display Properties
In the Configuration Properties dialog box, click the Display tab. Set the parameters to
the values shown in the following table.
Parameter
Setting
Active display
Title
2-82
Show legend
Checked
Show grid
Checked
Unchecked
Y-limits (Minimum)
-2.5
Y-limits (Maximum)
2.5
Y-label
Amplitude
If the Time Scope window is not open, double-click the block icon in the
ex_timescope_tut model. Start model simulation. In the Time Scope window, on
the Simulation Toolbar, click the Run button (
While the simulation is running and the Time Scope is your active window, pause
the simulation. Use either of the following keyboard shortcuts:
P
Space
Alternatively, you can pause the simulation in one of two ways:
2-83
In the Time Scope window, on the Simulation Toolbar, click the Pause button
(
).
With the model simulation still paused, advance the simulation by a single time step.
To do so, in the Time Scope window, on the Simulation Toolbar, click the Next Step
button (
).
Next, try using keyboard shortcuts to achieve the same result. Press the Page
Down key to advance the simulation by a single time step.
4
).
2-84
Block Name
Time Scope
Add
Time Scope
Time Scope1
Sine Wave
Change the Plot Type parameter to Auto for each Time Scope block. This setting
ensures that Time Scope displays a line graph if the signal is continuous and a
stairstep graph if the signal is discrete.
Change the Axes colors parameters for each Time Scope block. Leave the axes
background color as black and set the ticks, labels, and grid colors to white.
Set the Properties for line parameter to the name of the signal for which you
would like to modify the line properties. Set the line properties for each signal
according to the values shown in the following table.
Block Name
Signal Name
Line
Color
Time Scope
Noisy Sine
Wave
0.5
White
none
2-85
Block Name
Signal Name
Line
Color
Time Scope
Filtered Noisy
Sine Wave
0.5
Red
Time Scope1
Original Sine
Wave
0.5
Yellow
).
it with the axes, you must first open the ToolsPlot Navigation Properties dialog box.
From the Time Scope menu, select Tools > Axes Scaling Properties .
In the Tools:Plot Navigation options dialog box, set the Data range (%) and Align
parameters. In a previous section, you set these parameters to 80 and Center,
respectively.
To decrease the amount of space surrounding your signal, set the Data range (%)
parameter on the Tools:Plot Navigation Options dialog box to 90.
To align your signal with the bottom of the Y-axis, set the Align parameter to
Bottom.
The next time you scale the axes of the Time Scope window, the window appears as
follows.
2-87
2-88
depressing the toolbar button and placing a check mark next to the Tools > Zoom X
menu option.
To zoom in on the region between 5010 ms and 5020 ms, in the Time Scope window,
click and drag your cursor from the 10 ms mark to the 20 ms mark.
While zoomed in, to activate the Pan tool, select Tools > Pan, or press the
corresponding toolbar button (
).
To zoom out of the Time Scope window, right-click inside the window, and select
Zoom Out. Alternatively, you can return to the original view of your signal by rightclicking inside the Time Scope window and selecting Reset to Original View.
2-90
The Time Scope window now appears in the Scopes group container. Next, press the Dock
Time Scope button at the top-right corner of the Time Scope window for the Time Scope1
block.
By default, the Scopes group container is situated above the MATLAB Command
Window. However, you can undock the Scopes group container by pressing the Show
Actions button ( ) at the top-right corner of the container and selecting Undock. The
Scopes group container is now independent from the MATLAB Command Window.
2-91
Once docked, the Scopes group container displays the toolbar and menu bar of the Time
Scope window. If you open additional instances of Time Scope, a new Time Scope window
appears in the Scopes group container.
You can undock any instance of Time Scope by pressing the corresponding Undock button
( ) in the title bar of each docked instance. If you close the Scopes group container, all
docked instances of Time Scope close but the Simulink model continues to run.
Close All Time Scope Windows
If you save your model with Time Scope windows open, those windows will reopen the
next time you open the model. Reopening the Time Scope windows when you open your
model can increase the amount of time it takes your model to load. If you are working
with a large model, or a model containing multiple Time Scopes, consider closing all Time
Scope windows before you save and close that model. To do so, use the File > Close All
Time Scope Windows menu option.
To use this menu option in the ex_timescope_tut model, open the Time Scope or Time
Scope1 window, and select File > Close All Time Scope Windows. Both the Time
Scope and Time Scope1 windows close. If you now save and close the model, the Time
Scope windows do not automatically open the next time you open the model. You can
open Time Scope windows at any time by double-clicking a Time Scope block in your
model. Alternatively, you can choose to automatically open the Time Scope windows at
simulation start. To do so, from the Time Scope window, select File > Open at Start of
Simulation.
2-92
2-93
Double-click the Signal From Workspace block. Set the block parameters as follows,
and then click OK:
Signal = mtlb
Sample time = 1
Samples per frame = 16
Form output after final data value = Cyclic Repetition
Based on these parameters, the Signal From Workspace block repeatedly outputs the
input signal, mtlb, as a frame-based signal with a sample period of 1 second.
2-94
Create two distinct signals to send to the Spectrum Analyzer block. Use the Digital
Filter Design block to filter the input signal, using the default parameters.
Double-click the Matrix Concatenate block. Set the block parameters as follows, and
then click OK:
Number of inputs = 2
Mode = Multidimensional array
2-95
Concatenate dimension = 2
The Matrix Concatenate block combines the two signals so that each column
corresponds to a different signal.
5
Double-click the Spectrum Analyzer block. The Spectrum Analyzer figure appears. In
the menu, select View > Spectrum Settings. The Spectrum Settings panel opens.
Expand the Main options pane, if it is not already expanded.
Set Type to Power.
Select the Full frequency span check box.
Set RBW (Hz) to 5.91e-3.
Expand the Trace options pane, if it is not already expanded.
Set Units to dBW.
Set Averages to 2.
Expand the Window options pane, if it is not already expanded.
Set Overlap (%) to 50.
Set Window to Hann.
Based on these parameters, the Spectrum Analyzer uses 128 samples from each
input channel to calculate a new windowed data segment, as shown in the following
equation.
D=
NENBW Fs
1 .512 1 Hz
=
= 128 samples
RBW
11 .8125 10 -3 Hz
There are also 128 frequency points in the FFT. Also, because Overlap (%) is set to
50, there is a buffer overlap length of 64 samples in each spectral estimate, as shown
in the following equation.
OL =
OP
50
L=
128 = 64 samples
100
100
Every time the scope updates the display, 64 points are plotted for each channel. At
16 samples per frame, Spectrum Analyzer waits for 3 frames or 48 samples before
displaying the first power spectral estimate.
2-96
Fit all the calculated data points into the display. In the Spectrum Analyzer menu,
select Tools > Automatically Scale Axes Limits.
In the Spectrum Analyzer menu, select View > Configuration Properties. Then,
select the Show legend check box.
Run the model. The Spectrum Analyzer block computes the FFT of each of the input
signals. It then displays the power spectra of the frequency-domain signals in the
Spectrum Analyzer window.
2-97
2-98
The power spectrum of the first input signal, from column one, is the yellow line. The
power spectrum of the second input signal, from column two, is the blue line.
2-99
Change the configuration of the Array Plot properties for the display of a distribution
function.
numbins
= 201;
2-101
numtrials = 100;
r = zeros(numsamples,1);
hap3.SampleIncrement = 1/numbins;
hap3.PlotType = 'Stairs';
When the simulation has finished, the Array Plot figure displays a bell curve, indicating
a distribution that is close to normal.
2-102
indented toolbar button or a check mark next to the Tools > Zoom X menu option.
Next, zoom in on the region between 0.3 and 0.7. In the Array Plot window, click on
the 0.3-second mark, and drag to the 0.7-second mark. The display reflects this new xaxis setting, as shown in the following figure.
2-103
2-104
and one 4-channel input signal to the scope block, one signal named Signal1 and one
unnamed signal coming from a block named Block2.
To see all the signal names, run the simulation and show the legend. To show the legend,
select View > Configuration Properties, click the Display tab, and select the Show
Legend check box. The following legend appears in the display.
Note: Continuous signals appear as straight lines in the legend. Discrete signals appear
as step-shaped lines.
The scope does not display signal names that were labeled within an unmasked
subsystem. You must label all input signals to the scope block that originate from an
unmasked subsystem.
Multiple Signal Colors
By default, the scope has a black axes background and chooses line colors for each
channel in the same manner as the Simulink Scope block. When the scope axes
2-106
background is black, it assigns each channel of each input signal a line color in the order
shown above.
If there are more than 7 channels, then the scope repeats this order to assign line colors
to the remaining channels. To choose line colors for each channel in the same manner
as the MATLAB plot function, change the axes background color to any color except
black. To change the axes background color to white, select View > Style, click the
Axes background color button (
When the scope axes background is not black, it assigns each channel of each input
signal a line color in order shown above.If there are more than 7 channels, then the scope
repeats this order to assign line colors to the remaining channels. To manually modify
any line color, select View > Style to open the Style dialog box. Next to Properties for
line, select the signal name whose color you want to change. Then, next to Line, click
the Line color button (
When N is greater than the number of input channels, the scope offsets each input
channel according to the corresponding value in the offset vector. The scope ignores
all values in the offset vector that do not correspond to a channel of the input.
Multiple Displays
You can display multiple channels of data on different displays in the scope window.
In the scope toolbar, select View > Layout, or select the Layout button (
dropdown below the Configuration Properties button.
) in the
Note: The Layout menu item and button are not available when the scope is in snapshot
mode.
This feature allows you to tile the window into a number of separate displays, up to a
grid of 4 rows and 4 columns. For example, if there are three inputs to the scope, you can
display the signals in separate displays by selecting row 3, column 1, as shown in the
following figure.
After you select row 3, column 1, the scope window is partitioned into three separate
displays, as shown in the following figure.
2-108
When you use the Layout option to tile the window into multiple displays, the display
highlighted in yellow is referred to as the active display. The scope dialog boxes reference
the active display.
2-109
3
Data and Signal Management
Learn concepts such as sample- and frame-based processing, sample rate, delay and
latency.
Sample- and Frame-Based Concepts on page 3-2
Inspect Sample and Frame Rates in Simulink on page 3-8
Convert Sample and Frame Rates in Simulink on page 3-19
Buffering and Frame-Based Processing on page 3-43
Delay and Latency on page 3-59
3-2
Chirp
Constant
Discrete Impulse
Identity Matrix
MIDI Controls
Multiphase Clock
N-Sample Enable
Random Source
Sine Wave
UDP Receive
Simulink Blocks
Sample-Based Processing
Frame-Based Processing
Input processing =
Elements as channels
(sample based)
Input processing =
Columns as channels
(frame based)
3-3
When you configure a block to perform sample-based processing, the block interprets
scalar input as a single-channel signal. Similarly, the block interprets an M-by-N matrix
as multichannel signal with M*N independent channels. For example, in sample-based
processing, blocks interpret the following sequence of 3-by-2 matrices as a six-channel
signal.
For more information about the recent changes to frame-based processing, see the
Frame-Based Processing section of the DSP System Toolbox Release Notes.
3-4
When you configure a block to perform frame-based processing, the block interprets an
M-by-1 vector as a single-channel signal containing M samples per frame. Similarly,
the block interprets an M-by-N matrix as a multichannel signal with N independent
channels and M samples per channel. For example, in frame-based processing, blocks
interpret the following sequence of 3-by-2 matrices as a two-channel signal with a frame
size of 3.
however, you can select frame sizes that improve throughput without creating
unacceptable latencies. For more information, see Delay and Latency on page 3-59.
Accelerate Model Simulations
The simulation of your model also benefits from frame-based processing. In this case,
you reduce the overhead of block-to-block communications by propagating frames of data
rather than individual samples.
3-7
Ts = Tf / M
3-8
More specifically, the sample periods of inputs (Tsi) and outputs (Tso) are related to their
respective frame periods by
Tsi = Tfi / M i
Tso = Tfo / M o
where Mi and Mo are the input and output frame sizes, respectively.
The illustration below shows a single-channel, frame-based signal with a frame size (Mi)
of4 and a frame period (Tfi) of 1. The sample period, Tsi, is therefore1/4, or 0.25second.
The frame rate of a signal is the reciprocal of the frame period. For instance, the input
frame rate would be 1 / Tfi . Similarly, the output frame rate would be 1 / Tfo .
The sample rate of a signal is the reciprocal of the sample period. For instance, the
sample rate would be 1 / Ts .
In most cases, the sequence sample period Tsi is most important, while the frame rate
is simply a consequence of the frame size that you choose for the signal. For a sequence
with a given sample period, a larger frame size corresponds to a slower frame rate, and
vice versa.
Note Simulink offers the ability to shift the sample time of a signal by an arbitrary
value, which is equivalent to shifting the signal's phase by a fractional sample period.
However, sample-time offsets are rarely used in signal processing systems, and DSP
System Toolbox blocks do not support them.
In this example, you use the Probe block to display the sample period of a sample-based
signal:
1
3-10
As displayed by the Probe blocks, the output from the Signal From Workspace block
is a sample-based signal with a sample period of1 second. The output from the first
Upsample block has a sample period of0.5 second, and the output from the second
Upsample block has a sample period of0.25 second.
3-11
In this example, you use the Probe block to display the frame period of a frame-based
signal:
1
3-12
As displayed by the Probe blocks, the output from the Signal From Workspace block
is a frame-based signal with a frame period of16 seconds. The output from the first
Upsample block has a frame period of8 seconds, and the output from the second
Upsample block has a sample period of4 seconds.
Note that the sample rate conversion is implemented through a change in the frame
period rather than the frame size.
3-13
From the Display menu, point to Sample Time, and select Colors.
This selection turns on sample time color coding. Simulink now assigns each sample
rate a different color.
3-14
Every sample-based signal in this model has a different sample rate. Therefore, each
signal is assigned a different color.
For more information about sample time color coding, see View Sample Time
Information in the Simulink documentation.
3-15
To turn on sample time color coding, from the Display menu, point to Sample
Time, and select Colors.
Simulink now assigns each frame rate a different color.
3-16
Because the Rate options parameter in the Upsample blocks is set to Allow
multirate processing, each Upsample block changes the frame rate. Therefore,
each frame-based signal in the model is assigned a different color.
4
Double-click on each Upsample block and change the Rate options parameter to
Enforce single-rate processing.
3-17
For more information about sample time color coding, see View Sample Time
Information in the Simulink documentation.
3-18
Library
Downsample *
Signal Operations
Block
Library
FIR Decimation *
FIR Interpolation *
Repeat *
Signal Operations
Upsample *
Signal Operations
3-20
From the Display menu, point to Signals & Ports, and select Signal Dimensions.
When you run the model, the dimensions of the signals appear next to the lines
connecting the blocks.
Double-click the Signal From Workspace block. The Source Block Parameters:
Signal From Workspace dialog box opens.
3-21
Based on these parameters, the Signal From Workspace block outputs a frame-based
signal with a sample period of 0.125 second and a frame size of 8.
5
Save these parameters and close the dialog box by clicking OK.
Set the Rate options parameter to Allow multirate processing, and then
click OK.
The Downsample block is configured to downsample the signal by changing the
frame rate rather than the frame size.
3-22
Because Tfi = M i Tsi , the input frame period, Tfi , is Tfi = 8 0.125 = 1 second. This
value is displayed by the first Probe block. Therefore the input frame rate, 1 / Tfi , is
also 1 second.
The second Probe block in the model verifies that the output from the Downsample
block has a frame period, Tfo , of2 seconds, twice the frame period of the input.
3-23
However, because the frame rate of the output, 1 Tfo , is 0.5 second, the Downsample
block actually downsampled the original signal to half its original rate. As a result,
the output sample period, Tso = Tfo / M o , is doubled to 0.25second without any
change to the frame size. The signal dimensions in the model confirm that the frame
size did not change.
3-24
From the Display menu, point to Signals & Ports, and select Signal Dimensions.
When you run the model, the dimensions of the signals appear next to the lines
connecting the blocks.
Double-click the Signal From Workspace block. The Source Block Parameters:
Signal From Workspace dialog box opens.
3-25
Based on these parameters, the Signal From Workspace block outputs a frame-based
signal with a sample period of 0.125 second and a frame size of 8.
5
Save these parameters and close the dialog box by clicking OK.
3-26
Because Tfi = M i Tsi , the input frame period, Tfi , is Tfi = 8 0.125 = 1 second. This
value is displayed by the first Probe block. Therefore the input frame rate, 1 / Tfi , is
also 1 second.
The Downsample block downsampled the input signal to half its original frame
size. The signal dimensions of the output of the Downsample block confirm that the
3-27
downsampled output has a frame size of4, half the frame size of the input. As a
result, the sample period of the output, Tso = Tfo / M o , now has a sample period of
0.25 second. This process occurred without any change to the frame rate ( Tfi = Tfo ).
Double-click the upper Sine Wave block. The Source Block Parameters: Sine
Wave dialog box opens.
Save these parameters and close the dialog box by clicking OK.
3-28
Select the Inherit FFT length from input dimensions check box, and then click
OK.
This setting instructs the block to use the input frame size (128) as the FFT length
(which is also the output size).
9
Double-click the Vector Scope block. The Sink Block Parameters: Vector Scope
dialog box opens.
3-29
The Vector Scope window displays the magnitude FFT of a signal composed of two
sine waves, with frequencies of 1Hz and 2Hz.
3-30
The Vector Scope block uses the input frame size (128) and period (12.8) to deduce
the original signal's sample period (0.1), which allows it to correctly display the
peaks at 1Hz and 2Hz.
12 Double-click the Magnitude FFT block. The Function Block Parameters:
Magnitude FFT dialog box opens.
13 Set the block parameters as follows:
Clear the Inherit FFT length from input dimensions check box.
Set the FFT length parameter to 256.
Based on these parameters, the Magnitude FFT block zero-pads the length-128 input
frame to a length of256 before performing the FFT.
3-31
The Vector Scope window displays the magnitude FFT of a signal composed of two
sine waves, with frequencies of 2Hz and 4Hz.
3-32
In this case, based on the input frame size(256) and frame period(12.8), the Vector
Scope block incorrectly calculates the original signal's sample period to be (12.8/256)
or 0.05 second. As a result, the spectral peaks appear incorrectly at 2Hz and 4Hz
rather than 1Hz and 2Hz.
The source of the error described above is unintended rate conversion. The zeropad operation performed by the Magnitude FFT block halves the sample period of
the sequence by appending 128zeros to each frame. To calculate the spectral peaks
correctly, the Vector Scope block needs to know the sample period of the original
signal.
15 To correct for the unintended rate conversion, double-click the Vector Scope block.
16 Set the block parameters as follows:
3-33
Set the Sample time of original time series parameter to the actual sample
period of0.1.
17 Run the model.
The Vector Scope block now accurately plots the spectral peaks at 1Hz and 2Hz.
In general, when you zero-pad or overlap buffers, you are changing the sample period
of the signal. If you keep this in mind, you can anticipate and correct problems such as
unintended rate conversion.
Library
Buffer
Delay Line
Unbuffer
Variable Selector
3-34
signal, M, without altering the signal's sample rate Ts. This usually results in a change to
the signal's frame rate, Tf, according to the following equation:
Tf = MTs
However, the equation above is only true if no samples are added or deleted from the
original signal. Therefore, the equation above does not apply to buffering operations that
generate overlapping frames, that only partially unbuffer frames, or that alter the data
sequence by adding or deleting samples.
There are two blocks in the Buffers library that can be used to change a signal's frame
size without altering the signal itself:
Buffer redistributes signal samples to a larger or smaller frame size
Unbuffer unbuffers a frame-based signal to a sample-based signal (frame size=1)
The Buffer block preserves the signal's data and sample period only when its Buffer
overlap parameter is set to0. The output frame period,Tfo, is
Tfo =
M o Tfi
Mi
where Tfi is the input frame period, Mi is the input frame size, andMo is the output frame
size specified by the Output buffer size (per channel) parameter.
The Unbuffer block unbuffers a frame-based signal to its sample-based equivalent, and
always preserves the signal's data and sample period
Tso = Tfi / M i
where Tfi and Mi are the period and size, respectively, of the frame-based input.
Both the Buffer and Unbuffer blocks preserve the sample period of the sequence in the
conversion (Tso=Tsi).
Blocks for Frame Rebuffering with Alteration of the Signal
Some forms of buffering alter the signal's data or sample period in addition to adjusting
the frame size. This type of buffering is desirable when you want to create sliding
windows by overlapping consecutive frames of a signal, or select a subset of samples from
each input frame for processing.
3-35
The blocks that alter a signal while adjusting its frame size are listed below. In this list,
Tsi is the input sequence sample period, and Tfi and Tfo are the input and output frame
periods, respectively:
The Buffer block adds duplicate samples to a sequence when the Buffer overlap
parameter, L, is set to a nonzero value. The output frame period is related to the
input sample period by
Tfo = ( M o - L) Tsi
where Mo is the output frame size specified by the Output buffer size (per
channel) parameter. As a result, the new output sample period is
Tso =
( M o - L) Tsi
Mo
The Delay Line block adds duplicate samples to the sequence when the Delay line
size parameter, Mo, is greater than1. The output and input frame periods are the
same, Tfo=Tfi =Tsi, and the new output sample period is
Tso =
Tsi
Mo
The Variable Selector block can remove, add, and/or rearrange samples in the input
frame when Select is set to Rows. The output and input frame periods are the same,
Tfo=Tfi, and the new output sample period is
Tso =
M i Tsi
Mo
where Mo is the length of the block's output, determined by the Elements vector.
In all of these cases, the sample period of the output sequence is not equal to the sample
period of the input sequence.
3-36
frame period from 1 to 2 seconds, but does not change the sample period of the signal
(Tso=Tsi=0.125). The process also does not add or delete samples from the original
signal:
1
Double-click the Signal From Workspace block. The Source Block Parameters:
Signal From Workspace dialog box opens.
Save these parameters and close the dialog box by clicking OK.
Double-click the Buffer block. The Function Block Parameters: Buffer dialog box
opens.
3-38
Note that the input to the Buffer block has a frame size of 8 and the output of the
block has a frame size of 16. As shown by the Probe blocks, the rebuffering process
doubles the frame period from 1 to 2 seconds.
3-39
Double-click the Signal From Workspace block. The Source Block Parameters:
Signal From Workspace dialog box opens.
3-40
Save these parameters and close the dialog box by clicking OK.
Double-click the Buffer block. The Function Block Parameters: Buffer dialog box
opens.
3-41
Note that the input to the Buffer block has a frame size of 8 and the output of the
block has a frame size of 16. The relation for the output frame period for the Buffer
block is
Tfo = ( M o - L) Tsi
Tfo is (16-4)*0.125, or 1.5 seconds, as confirmed by the second Probe block. The
sample period of the signal at the output of the Buffer block is no longer 0.125
second. It is now Tso = Tfo / M o = 1.5 / 16 = 0 .0938 second. Thus, both the signal's
data and the signal's sample period have been altered by the buffering operation.
3-42
Frame Status
The frame status of a signal refers to whether the signal is sample based or frame
based. In a Simulink model, the frame status is symbolized by a single line ,, for a
sample-based signal and a double line, for a frame-based signal. One way to convert a
sample-based signal to a frame-based signal is by using the Buffer block. You can convert
a frame-based signal to a sample-based signal using the Unbuffer block. To change
the frame status of a signal without performing a buffering operation, use the Frame
Conversion block in the Signal Attributes library.
3-43
In the following example, a two-channel sample-based signal is buffered into a twochannel frame-based signal using a Buffer block:
1
3-44
Double-click the Signal From Workspace block. The Source Block Parameters:
Signal From Workspace dialog box opens.
Save these parameters and close the dialog box by clicking OK.
3-45
Double-click the Buffer block. The Function Block Parameters: Buffer dialog box
opens.
[4 -4]
[3 -3]
[2 -2]
[1 -1]
t=3
t=2
t=1
t=0
1
2
3
4
-1
-2
-3
-4
Note: Alternatively, you can set the Samples per frame parameter of the Signal From
Workspace block to4 and create the same frame-based signal shown above without using
a Buffer block. The Signal From Workspace block performs the buffering internally, in
order to output a two-channel frame-based signal.
3-46
data. Overlapping buffers are also needed in computing statistics on a sliding window, or
for adaptive filtering.
The Buffer overlap parameter of the Buffer block specifies the number of overlap
points,L. In the overlap case (L>0), the frame period for the output is (Mo-L)*Tsi, where
Tsi is the input sample period and Mo is the Buffer size.
Note: Set the Buffer overlap parameter to a negative value to achieve output frame
rates slower than in the nonoverlapping case. The output frame period is still Tsi*(Mo-L),
but now with L<0. Only the Mo newest inputs are included in the output buffers. The
previous L inputs are discarded.
In the following example, a four-channel sample-based signal with sample period1 is
buffered to a frame-based signal with frame size3 and frame period2. Because of the
buffer overlap, the input sample period is not conserved, and the output sample period
is2/3:
1
3-47
Also, the variable sp_examples_src is loaded into the MATLAB workspace. This
variable is defined as follows:
sp_examples_src=[1 1 5 -1; 2 1 5 -2; 3 0 5 -3; 4 0 5 -4; 5 1 5 -5; 6 1 5 -6];
Double-click the Signal From Workspace block. The Source Block Parameters:
Signal From Workspace dialog box opens.
3-48
Save these parameters and close the dialog box by clicking OK.
Double-click the Buffer block. The Function Block Parameters: Buffer dialog box
opens.
3-49
3-50
0
0
0
0
1
1
1
0
0
0
1
1
1
0
0
0
0
0
0
0
0
0
5
5
5
5
5
5
5
5
5
0
0
0
0
0
0
0
0
0
-1
-2
-2
-3
-4
-4
-5
-6
-6
0
0
0
0
0
Notice that the inputs do not begin appearing at the output until the fifth row, the
second row of the second frame. This is due to the block's latency.
See Excess Algorithmic Delay (Tasking Latency) on page 3-67 for general
information about algorithmic delay. For instructions on how to calculate buffering delay,
see Buffer Delay and Initial Conditions on page 3-54.
3-51
Also, the variable sp_examples_src is loaded into the MATLAB workspace. This
variable is defined as
sp_examples_src = [1 1; 2 1; 3 0; 4 0; 5 1; 6 1; 7 0; 8 0]
Double-click the Signal From Workspace block. The Source Block Parameters:
Signal From Workspace dialog box opens.
3-52
Save these parameters and close the dialog box by clicking OK.
Double-click the Buffer block. The Function Block Parameters: Buffer dialog box
opens.
Note that the inputs do not begin appearing at the output until the last row of the
third output matrix. This is due to the block's latency.
See Excess Algorithmic Delay (Tasking Latency) on page 3-67 for general
information about algorithmic delay. For instructions on how to calculate buffering delay,
and see Buffer Delay and Initial Conditions on page 3-54.
3-53
This result agrees with the block's output in that example. Notice that this model was
simulated in Simulink multitasking mode.
For more information about delay, see Excess Algorithmic Delay (Tasking Latency) on
page 3-67. For delay information about a specific block, see the Latency section of
the block reference page. For more information about the rebuffer_delay function, see
rebuffer_delay.
The sample period of the sample-based output,Tso, is related to the input frame
period,Tfi, by the input frame size,Mi.
Tso = Tfi / M i
The Unbuffer block always preserves the signal's sample period (Tso= Tsi). See Convert
Sample and Frame Rates in Simulink on page 3-19 for more information about rate
conversions.
In the following example, a two-channel frame-based signal is unbuffered into a twochannel sample-based signal:
1
3-55
Double-click the Signal From Workspace block. The Source Block Parameters:
Signal From Workspace dialog box opens.
3-56
Save these parameters and close the dialog box by clicking OK.
1
2
3
4
-1
-2
-3
-4
[4 -4]
[3 -3]
[2 -2]
[1 -1]
t=7
t=6
t=5
t=4
Note: The Unbuffer block generates initial conditions not shown in the figure below
with the value specified by the Initial conditions parameter. See the Unbuffer
reference page for information about the number of initial conditions that appear in
the output.
8
sp_examples_yout(:,:,2) =
0
sp_examples_yout(:,:,3) =
0
3-57
sp_examples_yout(:,:,4) =
0
sp_examples_yout(:,:,5) =
1
-1
sp_examples_yout(:,:,6) =
2
-2
sp_examples_yout(:,:,7) =
3
-3
The Unbuffer block unbuffers the frame-based signal into a two-channel, samplebased signal. Each page of the output matrix represents a different sample time.
3-58
Computational Delay
The computational delay of a block or subsystem is related to the number of operations
involved in executing that block or subsystem. For example, an FFT block operating
on a 256-sample input requires Simulink software to perform a certain number of
multiplications for each input frame. The actual amount of time that these operations
consume depends heavily on the performance of both the computer hardware and
underlying software layers, such as the MATLAB environment and the operating system.
Therefore, computational delay for a particular model can vary from one computer
platform to another.
The simulation time represented on a model's status bar, which can be accessed via the
Simulink Digital Clock block, does not provide any information about computational
delay. For example, according to the Simulink timer, the FFT mentioned above executes
instantaneously, with no delay whatsoever. An input to the FFT block at simulation time
t=25.0 is processed and output at simulation time t=25.0, regardless of the number of
operations performed by the FFT algorithm. The Simulink timer reflects only algorithmic
delay, not computational delay.
3-59
This method of starting a simulation can greatly increase the simulation speed, but
also has several limitations:
You cannot interact with the simulation (to tune parameters, for instance).
You must press Ctrl+C to stop the simulation, or specify start and stop times.
There are no graphics updates in M-file S-functions, which include blocks such as
Vector Scope,etc.
Use Simulink Coder code generation software to generate generic real-time (GRT)
code targeted to your host platform, and run the model using the generated
executable file. See the Simulink Coder documentation for more information.
3-60
Algorithmic Delay
Algorithmic delay is delay that is intrinsic to the algorithm of a block or subsystem and
is independent of CPU speed. In this guide, the algorithmic delay of a block is referred to
simply as the block's delay. It is generally expressed in terms of the number of samples
by which a block's output lags behind the corresponding input. This delay is directly
related to the time elapsed on the Simulink timer during that block's execution.
The algorithmic delay of a particular block may depend on both the block parameter
settings and the general Simulink settings. To simplify matters, it is helpful to categorize
a block's delay using the following categories:
Zero Algorithmic Delay on page 3-61
Basic Algorithmic Delay on page 3-64
Excess Algorithmic Delay (Tasking Latency) on page 3-67
The following topics explain the different categories of delay, and how the simulation and
parameter settings can affect the level of delay that a particular block experiences.
3-61
Double-click the Signal From Workspace block. The Source Block Parameters:
Signal From Workspace dialog box opens.
3-62
Save these parameters and close the dialog box by clicking OK.
Set the Sampling mode of output signal parameter to Sample based, and then
click OK.
The model prepends the current value of the Simulink timer output from the Digital
Clock block to each output frame. The Frame Conversion block converts the framebased signal to a sample-based signal so that the output in the MATLAB Command
Window is more easily readable.
The Signal From Workspace block generates a new frame containing four samples
once every second (Tfo=*4). The first few output frames are:
(t=0)
(t=1)
(t=2)
(t=3)
(t=4)
[ 1 2 3 4]'
[ 5 6 7 8]'
[ 9 10 11 12]'
[13 14 15 16]'
[17 18 19 20]'
0.0333
0.0287
0.0202
0.0154
0.0124
0.0103
0.0667
0.0345
0.0224
0.0165
0.0131
0.0108
0.1000
0.0402
0.0247
0.0177
0.0138
0.0113
0.1333
0.0460
0.0269
0.0189
0.0146
0.0118
The first column of ans is the Simulink time provided by the Digital Clock block. You
can see that the squared 2-norm of the first input,
[1 2 3 4]' ./ sum([1 2 3 4]'.^2)
appears in the first row of the output (at time t=0), the same time step that the input
was received by the block. This indicates that the Normalization block has zero
algorithmic delay.
Zero Algorithmic Delay and Algebraic Loops
When several blocks with zero algorithmic delay are connected in a feedback loop,
Simulink may report an algebraic loop error and performance may generally suffer.
You can prevent algebraic loops by injecting at least one sample of delay into a feedback
3-63
loop , for example, by including a Delay block with Delay>0. For more information, see
Algebraic Loops in the Simulink documentation.
Double-click the Signal From Workspace block. The Source Block Parameters:
Signal From Workspace dialog box opens.
3-64
Save these parameters and close the dialog box by clicking OK.
Double-click the Constant block. The Source Block Parameters: Constant dialog
box opens.
Double-click the Variable Integer Delay block. The Function Block Parameters:
Variable Integer Delay dialog box opens.
Set the Initial conditions parameter to -1, and then click OK.
From the Display menu, point to Signals & Ports, and select Signal Dimensions
and Wide Nonscalar Lines.
3-65
-1
-1
-1
1
2
3
The first column is the Simulink time provided by the Digital Clock block. The
second column is the delayed input. As expected, the input to the block at t=0 is
delayed three samples and appears as the fourth output sample, att=3. You can also
see that the first three outputs from the Variable Integer Delay block inherit the
value of the block's Initial conditions parameter,-1. This period of time, from the
3-66
start of the simulation until the first input is propagated to the output, is sometimes
called the initial delay of the block.
Many DSP System Toolbox blocks have some degree of fixed or adjustable algorithmic
delay. These include any blocks whose algorithms rely on delay or storage elements, such
as filters or buffers. Often, but not always, such blocks provide an Initial conditions
parameter that allows you to specify the output values generated by the block during the
initial delay. In other cases, the initial conditions are internally set to0.
Consult the block reference pages for the delay characteristics of specific DSP System
Toolbox blocks.
select Auto, the simulation runs in single-tasking mode if the model is single-rate, or
multitasking mode if the model is multirate.
Note: Many multirate blocks have reduced latency in the Simulink single-tasking mode.
Check the Latency section of a multirate block's reference page for details. Also see
Time-Based Scheduling and Code Generation in the Simulink Coder documentation.
Block Rate Type
A block is called single-rate when all of its input and output ports operate at the same
frame rate. A block is called multirate when at least one input or output port has a
different frame rate than the others.
Many blocks are permanently single-rate. This means that all input and output ports
always have the same frame rate. For other blocks, the block parameter settings
determine whether the block is single-rate or multirate. Only multirate blocks are subject
to tasking latency.
Note: Simulink may report an algebraic loop error if it detects a feedback loop composed
entirely of multirate blocks. To break such an algebraic loop, insert a single-rate block
with nonzero delay, such as a Unit Delay block. See the Simulink documentation for
more information about Algebraic Loops.
Model Rate Type
When all ports of all blocks in a model operate at a single frame rate, the model is called
single-rate. When the model contains blocks with differing frame rates, or at least one
multirate block, the model is called multirate. Note that Simulink prevents a single-rate
model from running in multitasking mode by generating an error.
Block Sample Mode
Many blocks can operate in either sample-based or frame-based modes. In source blocks,
the mode is usually determined by the Samples per frame parameter. If, for the
Samples per frame parameter, you enter 1, the block operates in sample-based mode.
If you enter a value greater than 1, the block operates in frame-based mode. In nonsource
blocks, the sample mode is determined by the input signal. See the block reference pages
for additional information about specific blocks.
3-68
In the Solver pane, from the Type list, select Fixed-step. From the Solver list,
select discrete (no continuous states).
From the Tasking mode for periodic sample times list, select MultiTasking,
and then click OK.
3-69
Most multirate blocks experience tasking latency only in the Simulink multitasking
mode.
5
Double-click the Signal From Workspace block. The Source Block Parameters:
Signal From Workspace dialog box opens.
Double-click the Digital Clock block. The Source Block Parameters: Digital
Clock dialog box opens.
10 Set the Sample time parameter to0.25, and then click OK.
This matches the sample period of the Upsample block's output.
11 Double-click the Frame Conversion block. The Function Block Parameters:
Frame Conversion dialog box opens.
12 Set the Sampling mode of output signal parameter to Sample based, and then
click OK.
13 Run the model.
The model should now look similar to the following figure.
3-70
The model prepends the current value of the Simulink timer, from the Digital Clock
block, to each output frame. The Frame Conversion block converts the frame-based
signal into a sample-based signal so that the output in the MATLAB Command
Window is easily readable.
In the example, the Signal From Workspace block generates a new frame containing
four samples once every second (Tfo=*4). The first few output frames are:
(t=0)
(t=1)
(t=2)
(t=3)
(t=4)
[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]
[17 18 19 20]
The Upsample block upsamples the input by a factor of4, inserting three zeros
between each input sample. The change in rates is confirmed by the Probe blocks in
the model, which show a decrease in the frame period from Tfi=1 to Tfo=0.25.
3-71
Latency and Initial Conditions in the Upsample block's reference page indicates
that when Simulink is in multitasking mode, the first sample of the block's framebased input appears in the output as sampleMiL+D+1, where Miis the input frame
size, Lis the Upsample factor, and Dis the Sample offset. This formula predicts
that the first input in this example should appear as output sample17 (that is,
4*4+0+1).
The first column of the output is the Simulink time provided by the Digital Clock
block. The four values to the right of each time are the values in the output frame at
that time. You can see that the first sample in each of the first four output frames
inherits the value of the Upsample block's Initial conditions parameter. As a result
of the tasking latency, the first input value appears as the first sample of the 5th
output frame (att=1). This is sample17.
Now try running the model in single-tasking mode.
15 From the Simulation menu, select Model Configuration Parameters.
16 In the Solver pane, from the Type list, select Fixed-step. From the Solver list,
select Discrete (no continuous states).
17 From the Tasking mode for periodic sample times list, select SingleTasking.
18 Run the model.
The model now runs in single-tasking mode.
3-72
Latency and Initial Conditions in the Upsample block's reference page indicates
that the block has zero latency for all multirate operations in the Simulink singletasking mode.
The first column of the output is the Simulink time provided by the Digital Clock
block. The four values to the right of each time are the values in the output frame
at that time. The first input value appears as the first sample of the first output
frame (att=0). This is the expected behavior for the zero-latency condition. For the
particular parameter settings used in this example, running upsample_tut1 in
single-tasking mode eliminates the 17-sample delay that is present when you run the
model in multitasking mode.
You have now successfully used the Upsample block's reference page to predict the
tasking latency of a model.
3-73
4
Filter Analysis, Design, and
Implementation
Design a Filter in Fdesign Process Overview on page 4-2
Design a Filter in the Filterbuilder GUI on page 4-10
Use FDATool with DSP System Toolbox Software on page 4-14
Digital Frequency Transformations on page 4-77
Digital Filter Design Block on page 4-111
Filter Realization Wizard on page 4-121
Digital Filter Implementations on page 4-133
Analog Filter Design Block on page 4-143
Removing High-Frequency Noise from an ECG Signal on page 4-145
4-2
The first four steps of the filter design process relate to the filter Specifications Object,
while the last two steps involve the filter Implementation Object. Both of these objects
are discussed in more detail in the following sections. Step 5 - the design of the filter, is
the transition step from the filter Specifications Object to the Implementation object. The
4-3
analysis and verification step is completely optional. It provides methods for the filter
designer to ensure that the filter complies with all design criteria. Depending on the
results of this verification, you can loop back to steps 3 and 4, to either choose a different
algorithm, or to customize the current one. You may also wish to go back to steps 3 or 4
after you filter the input data with the designed filter (step 7), and find that you wish to
tweak the filter or change it further.
The diagram shows the help command for each step. Enter the help line at the MATLAB
command prompt to receive instructions and further documentation links for the
particular step. Not all of the steps have to be executed explicitly. For example, you could
go from step 1 directly to step 5, and the interim three steps are done for you by the
software.
The following are the details for each of the steps shown above.
Select a Response
If you type:
help fdesign/responses
at the MATLAB command prompt, you see a list of all available filter responses. The
responses marked with an asterisk require the DSP System Toolbox.
You must select a response to initiate the filter. In this example, a bandpass filter
Specifications Object is created by typing the following:
d = fdesign.bandpass
Select a Specification
A specification is an array of design parameters for a given filter. The specification is a
property of the Specifications Object.
Note: A specification is not the same as the Specifications Object. A Specifications Object
contains a specification as one of its properties.
When you select a filter response, there are a number of different specifications available.
Each one contains a different combination of design parameters. After you create a
filter Specifications Object, you can query the available specifications for that response.
Specifications marked with an asterisk require the DSP System Toolbox.
4-4
The set command can be used to select one of the available specifications as follows:
>> d = fdesign.lowpass; % step 1
>> % step 2: get a list of available specifications
>> set (d, 'specification')
ans =
'Fp,Fst,Ap,Ast'
'N,F3dB'
'N,F3dB,Ap'
'N,F3dB,Ap,Ast'
'N,F3dB,Ast'
'N,F3dB,Fst'
'N,Fc'
'N,Fc,Ap,Ast'
'N,Fp,Ap'
'N,Fp,Ap,Ast'
4-5
'N,Fp,F3dB'
'N,Fp,Fst'
'N,Fp,Fst,Ap'
'N,Fp,Fst,Ast'
'N,Fst,Ap,Ast'
'N,Fst,Ast'
'Nb,Na,Fp,Fst'
>> %step 2: set the required specification
>> set (d, 'specification', 'N,Fc')
If you do not perform this step explicitly, fdesign returns the default specification for
the response you chose in Select a Response on page 4-4, and provides default
values for all design parameters included in the specification.
Select an Algorithm
The availability of algorithms depends the chosen filter response, the design parameters,
and the availability of the DSP System Toolbox. In other words, for the same lowpass
filter, changing the specification string also changes the available algorithms. In the
following example, for a lowpass filter and a specification of 'N, Fc', only one algorithm
is availablewindow.
>> %step 2: set the required specification
>> set (d, 'specification', 'N,Fc')
>> designmethods (d) %step3: get available algorithms
window
butter
cheby1
4-6
cheby2
ellip
equiripple
kaiserwin
If the user additionally has the DSP System Toolbox installed, the number of available
algorithms for this response and specification string increases:
>>set(d,'specification','Fp,Fst,Ap,Ast')
>>designmethods(d)
butter
cheby1
cheby2
ellip
equiripple
ifir
kaiserwin
multistage
The user chooses a particular algorithm and implements the filter with the design
function.
>>Hd=design(d,'butter');
The preceding code actually creates the filter, where Hd is the filter Implementation
Object. This concept is discussed further in the next step.
If you do not perform this step explicitly, design automatically selects the optimum
algorithm for the chosen response and specification.
Customize the Algorithm
The customization options available for any given algorithm depend not only on the
algorithm itself, selected in Select an Algorithm on page 4-6, but also on the
specification selected in Select a Specification on page 4-4. To explore all the
available options, type the following at the MATLAB command prompt:
help (d, 'algorithm-name')
where d is the Filter Specification Object, and algorithm-name is the name of the
algorithm in single quotes, such as 'butter' or 'cheby1'.
4-7
The application of these customization options takes place while Design the Filter
on page 4-8, because these options are the properties of the filter Implementation
Object, not the Specification Object.
If you do not perform this step explicitly, the optimum algorithm structure is selected.
Design the Filter
This next task introduces a new object, the Filter Object, or dfilt. To create a filter, use
the design command:
>> % design filter w/o specifying the algorithm
>> Hd = design(d);
where Hd is the Filter Object and d is the Specifications Object. This code creates a filter
without specifying the algorithm. When the algorithm is not specified, the software
selects the best available one.
To apply the algorithm chosen in Select an Algorithm on page 4-6, use the same
design command, but specify the Butterworth algorithm as follows:
>> Hd = design(d, 'butter');
This help command describes not only the options for the design command itself, but
also options that pertain to the method or the algorithm. If you are customizing the
algorithm, you apply these options in this step. In the following example, you design a
bandpass filter, and then modify the filter structure:
>> Hd = design(d, 'butter', 'filterstructure', 'df2sos')
f =
FilterStructure:
Arithmetic:
sosMatrix:
ScaleValues:
PersistentMemory:
The filter design step, just like the first task of choosing a response, must be performed
explicitly. A Filter Object is created only when design is called.
4-8
Design Analysis
After the filter is designed you may wish to analyze it to determine if the filter satisfies
the design criteria. Filter analysis is broken into three main sections:
Frequency domain analysis Includes the magnitude response, group delay, and
pole-zero plots.
Time domain analysis Includes impulse and step response
Implementation analysis Includes quantization noise and cost
To display help for analysis of a discrete-time filter, type:
>> help dfilt/analysis
This step is never automatically performed for you. To filter your data, you must
explicitly execute this step. To understand how the filtering commands work, type:
>> help dfilt/filter
Note: If you have Simulink, you have the option of exporting this filter to a Simulink
block using the realizemdl command. To get help on this command, type:
>> help realizemdl
4-9
4-10
Select a Response
When you open the filterbuilder tool by typing:
filterbuilder
at the MATLAB command prompt, the Response Selection dialog box appears, listing
all possible filter responses available in the software. If you have the DSP System
Toolbox software installed, you have access to the full complement of filter responses.
Note: This step cannot be skipped because it is not automatically completed for you by
the software. You must select a response to initiate the filter design process.
After you choose a response, say bandpass, you start the design of the Specifications
Object, and the Bandpass Design dialog box appears. This dialog box contains a Main
pane, a Data Types pane and a Code Generation pane. The specifications of your filter
are generally set in the Main pane of the dialog box.
The Data Types pane provides settings for precision and data types, and the Code
Generation pane contains options for various implementations of the completed filter
design.
For the initial design of your filter, you will mostly use the Main pane.
The Bandpass Design dialog box contains all the parameters you need to determine
the specifications of a bandpass filter. The parameters listed in the Main pane depend
upon the type of filter you are designing. However, no matter what type of filter you have
chosen in the Response Selection dialog box, the filter design dialog box contains the
Main, Data Types, and Code Generation panes.
Select a Specification
To choose the specification for the bandpass filter, you can begin by selecting an Impulse
Response, Order Mode, and Filter Type in the Filter Specifications frame of the
Main Pane. You can further specify the response of your filter by setting frequency and
magnitude specifications in the appropriate frames on the Main Pane.
Note: Frequency, Magnitude, and Algorithm specifications are interdependent
and may change based upon your Filter Specifications selections. When choosing
specifications for your filter, select your Filter Specifications first and work your
4-11
way down the dialog box- this approach ensures that the best settings for dependent
specifications display as available in the dialog box.
Select an Algorithm
The algorithms available for your filter depend upon the filter response and design
parameters you have selected in the previous steps. For example, in the case of a
bandpass filter, if the impulse response selected is IIR and the Order Mode field is set
toMinimum, the design methods available are Butterworth, Chebyshev type I or II,
or Elliptic, whereas if the Order Mode field is set to Specify, the design method
available is IIR least p-norm.
Customize the Algorithm
By expanding the Design options section of the Algorithm frame, you can further
customize the algorithm specified. The options available will depend upon the algorithm
and settings that have already been selected in the dialog box. In the case of a bandpass
IIR filter using the Butterworth method, design options such as Match Exactly are
available.
Analyze the Design
To analyze the filter response, click on the View Filter Response button. The Filter
Visualization Tool opens displaying the magnitude plot of the filter response.
4-12
Tip If you have Simulink, you have the option of exporting this filter to a Simulink block
using the realizemdl command. To get help on this command, type:
>> help realizemdl
4-13
Quantize double-precision filters you import into this GUI using the import mode.
Analyze quantized filters.
Scale second-order section filters.
Select the quantization settings for the properties of the quantized filter displayed by
the tool:
Coefficients select the quantization options applied to the filter coefficients
Input/output control how the filter processes input and output data
Filter Internals specify how the arithmetic for the filter behaves
Design multirate filters.
Transform both FIR and IIR filters from one response to another.
After you import a filter into FDATool, the options on the quantization dialog box let you
quantize the filter and investigate the effects of various quantization settings.
Options in the frequency transformations dialog box let you change the frequency
response of your filter, keeping various important features while changing the response
shape.
Use FDATool with DSP System Toolbox Software
Adding DSP System Toolbox software to your tool suite adds a number of filter design
techniques to FDATool. Use the new filter responses to develop filters that meet more
complex requirements than those you can design in Signal Processing Toolbox software.
While the designs in FDATool are available as command line functions, the graphical
user interface of FDATool makes the design process more clear and easier to accomplish.
As you select a response type, the options in the right panes in FDATool change to let
you set the values that define your filter. You also see that the analysis area includes
a diagram (called a design mask) that describes the options for the filter response you
choose.
By reviewing the mask you can see how the options are defined and how to use them.
While this is usually straightforward for lowpass or highpass filter responses, setting
the options for the arbitrary response types or the peaking/notching filters is more
complicated. Having the masks leads you to your result more easily.
Changing the filter design method changes the available response type options.
Similarly, the response type you select may change the filter design methods you can
choose.
4-15
Select IIR in Filter Design Method and choose Single Notch from the list.
For the Frequency Specifications, set Units to Hz and Fs, the full scale
frequency, to 1000.
Set the location of the center of the notch, in either normalized frequency orHz. For
the notch center at 440 Hz, enter 440.
Leave the Magnitude Specification in dB (the default) and leave Apass as1.
When you design a single notch filter, you do not have the option of setting the filter
order the Filter Order options are disabled.
Your filter should look about like this:
4-16
For more information about a design method, refer to the online Help system. For
instance, to get further information about the Q setting for the notch filter in FDATool,
enter
doc iirnotch
at the command line. This opens the Help browser and displays the reference page for
function iirnotch.
4-17
Designing other filters follows a similar procedure, adjusting for different design
specification options as each design requires.
Any one of the designs may be quantized in FDATool and analyzed with the available
analyses on the Analysis menu.
When FDATool opens, click the Set Quantization Parameters button on the side bar.
FDATool switches to quantization mode and you see the following panel at the bottom of
FDATool, with the default double-precision option shown for Filter arithmetic.
4-18
The Filter arithmetic option lets you quantize filters and investigate the effects of
changing quantization settings. To enable the quantization settings in FDATool, select
Fixed-point from the Filter Arithmetic.
The quantization options appear in the lower panel of FDATool. You see tabs that access
various sets of options for quantizing your filter.
You use the following tabs in the dialog box to perform tasks related to quantizing filters
in FDATool:
Coefficients provides access the settings for defining the coefficient quantization.
This is the default active panel when you switch FDATool to quantization mode
without a quantized filter in the tool. When you import a fixed-point filter into
FDATool, this is the active pane when you switch to quantization mode.
4-19
Input/Output switches FDATool to the options for quantizing the inputs and outputs
for your filter.
Filter Internals lets you set a variety of options for the arithmetic your filter
performs, such as how the filter handles the results of multiplication operations or
how the filter uses the accumulator.
Apply applies changes you make to the quantization parameters for your filter.
if you have an IIR filter). The following table lists each coefficients option and a short
description of what the option setting does in the filter.
Option Name
When Used
Description
FIR/IIR
FIR/IIR
IIR filters
IIR filters
Best-precision fraction
lengths
All filters
Option Name
When Used
Description
Selecting this option disables all of
the fraction length options for the
filter.
Use unsigned
representation
All filters
All filters
Input/Output Options
The options that specify how the quantized filter uses input and output values are listed
in the table below.
Option Name
When Used
Description
All filters
All filters
All filters
4-22
Option Name
When Used
Description
resulting range is -x to x. Range must be a
positive integer.
All filters
Avoid overflow
All filters
All filters
Avoid overflow
Avoid overflow
4-23
Option Name
When Used
Description
Description
Round towards
RoundMode
Overflow Mode
4-24
OverflowMode
Option
Description
(set overflowing values to the nearest
representable value using modular
arithmetic.
ProductMode
*ProdWordLength
NumProdFracLength
DenProdFracLength
Accum. mode
AccumMode
*AccumWordLength
4-25
Option
Description
NumAccumFracLength
DenAccumFracLength
CastBeforeSum
*StateWordLength
Avoid overflow
None
*StateFracLength
Note: When you apply changes to the values in the Filter Internals pane, the plots for
the Magnitude response estimate and Round-off noise power spectrum analyses
update to reflect those changes. Other types of analyses are not affected by changes to
the values in the Filter Internals pane.
Filter Internals Options for CIC Filters
CIC filters use slightly different options for specifying the fixed-point arithmetic in the
filter. The next table shows and describes the options.
4-26
When you are quantizing a double-precision filter by switching to fixed-point or singleprecision floating point arithmetic, follow these steps.
1
In the quantization panes, set the options for your filter. Set options for
Coefficients, Input/Output, and Filter Internals.
Click Apply.
FDATool quantizes your filter using your new settings.
Use the analysis features in FDATool to determine whether your new quantized
filter meets your requirements.
When you are changing the settings for the quantization of a quantized filter, or after
you import a quantized filter from your MATLAB workspace, follow these steps to set the
property values for the filter:
1
Review and select property settings for the filter quantization: Coefficients, Input/
Output, and Filter Internals. Settings for options on these panes determine how
your filter quantizes data during filtering operations.
Click Apply to update your current quantized filter to use the new quantization
property settings from Step 3.
Use the analysis features in FDATool to determine whether your new quantized
filter meets your requirements.
4-27
Default Setting
Description
Number of Points
512
Frequency Range
0 to Fs/2
Frequency Units
Hz
Sampling Frequency
48000
Frequency Scale
dB
Normalized Frequency
Off
After your first analysis run ends, open the Analysis Parameters dialog box and adjust
your settings appropriately, such as changing the number of trials or number of points.
4-28
To open the Analysis Parameters dialog box, use either of the next procedures when
you have a quantized filter in FDATool:
Select Analysis > Analysis Parameters from the menu bar
Right-click in the filter analysis area and select Analysis Parameters from the
context menu
Whichever option you choose opens the dialog box. Notice that the settings for the options
reflect the defaults.
Noise Method Applied to a Filter
To set the filter order to 6, select Specify order under Filter Order. Enter 6 in the
text box.
To generate the quantized version of your filter, using default quantizer settings,
click
Finally, to use noise-based estimation on your quantized filter, select Analysis >
Magnitude Response Estimate from the menu bar.
FDATool runs the trial, calculates the estimated magnitude response for the filter,
and displays the result in the analysis area as shown in this figure.
4-29
In the above figure you see the magnitude response as estimated by the analysis
method.
View the Noise Power Spectrum
When you use the noise method to estimate the magnitude response of a filter, FDATool
simulates and applies a spectrum of noise values to test your filter response. While the
simulated noise is essentially white, you might want to see the actual spectrum that
FDATool used to test your filter.
From the Analysis menu bar option, select Round-off Noise Power Spectrum. In the
analysis area in FDATool, you see the spectrum of the noise used to estimate the filter
response. The details of the noise spectrum, such as the range and number of data points,
appear in the Analysis Parameters dialog box.
For more information, refer to McClellan, et al., Computer-Based Exercises for Signal
Processing Using MATLAB 5, Prentice-Hall, 1998. See Project 5: Quantization Noise in
Digital Filters, page 231.
Change Your Noise Analysis Parameters
In Noise Method Applied to a Filter on page 4-29, you used synthetic white noise
to estimate the magnitude response for a fixed-point highpass Butterworth filter. Since
you ran the estimate only once in FDATool, your noise analysis used the default analysis
parameters settings shown in Analyze Filters with the Magnitude Response Estimate
Method on page 4-28.
4-30
To change the settings, follow these steps after the first time you use the noise estimate
on your quantized filter.
1
With the results from running the noise estimating method displayed in the
FDATool analysis area, select Analysis > Analysis Parameters from the menu
bar.
To give you access to the analysis parameters, the Analysis Parameters dialog box
opens (with default settings).
To use more points in the spectrum to estimate the magnitude response, change
Number of Points to 1024 and click OK to run the analysis.
FDATool closes the Analysis Parameters dialog box and reruns the noise estimate,
returning the results in the analysis area.
To rerun the test without closing the dialog box, press Enter after you type your new
value into a setting, then click Apply. Now FDATool runs the test without closing
the dialog box. When you want to try many different settings for the noise-based
analysis, this is a useful shortcut.
4-31
Toolbox documentation. You might notice that filters you design in FDATool, rather than
filters you imported, are implemented in SOS form.
View Filter Structures in FDATool
To open the demonstration, click Help > Show filter structures. After the Help
browser opens, you see the reference page for the current filter. You find the filter
structure signal flow diagram on this reference page, or you can navigate to reference
pages for other filter.
4-33
4-34
Parameter
Scale
No Overflow High
SNR slider
Maximum Numerator
Numerator Constraint
Overflow Mode
Parameter
Various combinations of settings let you scale filter numerators without changing the
scale values, or adjust the filter scale values without changing the numerators. There is
no scaling control for denominators.
Scale an SOS Filter
Start the process by designing a lowpass elliptical filter in FDATool.
1
Launch FDATool.
In Design Method, select IIR and Elliptic from the IIR design methods list.
Switch the frequency units by choosing Normalized(0 to 1) from the Units list.
To set the passband specifications, enter 0.45 for wpass and 0.55 for wstop.
Finally, in Magnitude Specifications, set Astop to 60.
You kept the Options setting for Match exactly as both, meaning the filter design
matches the specification for the passband and the stopband.
8
To switch to scaling the filter, select Edit > Reorder and Scale Second-Order
Sections from the menu bar.
To see the filter coefficients, return to FDATool and select Filter Coefficients from
the Analysis menu. FDATool displays the coefficients and scale values in FDATool.
With the coefficients displayed you can see the effects of scaling your filter directly in the
scale values and filter coefficients.
4-36
Now try scaling the filter in a few different ways. First scale the filter to maximize the
SNR.
1
Click Apply to scale the filter and leave the dialog box open.
After a few moments, FDATool updates the coefficients displayed so you see the new
scaling.
All of the scale factors are now 1, and the SOS matrix of coefficients shows that
none of the numerator coefficients are 1 and the first denominator coefficient of each
section is 1.
Click Revert to Original Filter to restore the filter to the original settings for
scaling and coefficients.
4-37
4-38
Control Option
Description
Auto
Control Option
Description
Automatic ordering adapts to the specification type of your
filter.
None
Numerator Order
Specify
Specify
Lets you specify the order of the scale values, rather than
using the numerator order. Enter a vector of the indices of
the sections to specify the order of the denominators to use.
For example, a filter with five sections has indices 1, 2, 3, 4,
and 5. To switch the second and fourth sections, the vector
would be [1,4,3,2,5].
4-39
Control Option
Description
Revert to Original Filter Returns your filter to the original section ordering. Being
able to revert to your original filter makes comparing
the results of changing the order of the sections easier to
assess.
Reorder an SOS Filter
With FDATool open a second-order filter as the current filter, you use the following
process to access the reordering capability and reorder you filter. Start by launching
FDATool from the command prompt.
1
Design a lowpass Butterworth filter with order 10 and the default frequency
specifications by entering the following settings:
Under Response Type select Lowpass.
Under Design Method, select IIR and Butterworth from the list.
Specify the order equal to 10 in Specify order under Filter Order.
Keep the default Fs and Fc values in Frequency Specifications.
To reorder your filter, select Edit > Reorder and Scale Second-Order Sections
from the FDATool menus.
Now you are ready to reorder the sections of your filter. Note that FDATool performs the
reordering on the current filter in the session.
Use Least Selective to Most Selective Section Reordering
To let FDATool reorder your filter so the least selective section is first and the most
selective section is last, perform the following steps in the Reordering and Scaling of
Second-Order Sections dialog box.
4-40
In FDATool, select View > SOS View Settings from the menu bar so you see the
sections of your filter displayed in FDATool.
In the SOS View Settings dialog box, select Individual sections. Making this
choice configures FDATool to show the magnitude response curves for each section of
your filter in the analysis area.
Back in the Reordering and Scaling of Second-Order Sections dialog box, click
Apply to reorder your filter according to the Qs of the filter sections, and keep the
dialog box open. In response, FDATool presents the responses for each filter section
(there should be five sections) in the analysis area.
In the next two figures you can compare the ordering of the sections of your filter. In
the first figure, your original filter sections appear. In the second figure, the sections
have been rearranged from least selective to most selective.
4-41
You see what reordering does, although the result is a bit subtle. Now try custom
reordering the sections of your filter or using the most selective to least selective
reordering option.
4-42
SOS View uses a few options to control how FDATool displays the sections, or which
sections to display. When you select View > SOS View from the FDATool menu bar, you
see this dialog box containing options to configure SOS View operation.
By default, SOS View shows the overall response of SOS filters. Options in the SOS View
dialog box let you change the display. This table lists all the options and describes the
effects of each.
Option
Description
Overall Filter
This is the familiar display in FDATool. For a secondorder section filter you see only the overall response
rather than the responses for the individual sections.
This is the default configuration.
Individual sections
Cumulative sections
Option
Description
The first curve plots the response for the first filter
section.
The second curve plots the response for the
combined first and second sections.
The third curve plots the response for the first,
second, and third sections combined.
And so on until all filter sections appear in the display.
The final curve represents the overall filter response.
Compare to Cumulative sections and Overall
Filter.
User defined
Use secondary-scaling
points
4-44
FDATool configures the tool to display the sections of SOS filters whenever the current
filter is an SOS filter.
These next steps demonstrate using SOS View to see your filter sections displayed in
FDATool.
1
Launch FDATool.
Create a lowpass SOS filter using the Butterworth design method. Specify the filter
order to be 6. Using a low order filter makes seeing the sections more clear.
To enable SOS View, select View > SOS View from the menu bar.
By default the analysis area in FDATool shows the overall filter response, not the
individual filter section responses. This dialog box lets you change the display
configuration to see the sections.
To see the magnitude responses for each filter section, select Individual sections.
Click Apply to update FDATool to display the responses for each filter section. The
analysis area changes to show you something like the following figure.
4-45
If you switch FDATool to display filter phase responses (by selecting Analysis >
Phase Response), you see the phase response for each filter section in the analysis
area.
To define your own display of the sections, you use the User defined option and
enter a vector of section indices to display. Now you see a display of the first section
response, and the cumulative first, second, and third sections response:
Select User defined to enable the text entry box in the dialog box.
Enter the cell array {1,1:3} to specify that FDATool should display the response
of the first section and the cumulative response of the first three sections of the
filter.
To apply your new SOS View selection, click Apply or OK (which closes the SOS
View dialog box).
In the FDATool analysis area you see two curves one for the response of the first
filter section and one for the combined response of sections 1, 2, and 3.
4-46
4-47
Direct form II
Direct form I transposed
Direct form II transposed
Direct form symmetric FIR
Direct form antisymmetric FIR
Lattice allpass
Lattice AR
Lattice MA minimum phase
Lattice MA maximum phase
Lattice ARMA
Lattice coupled-allpass
Lattice coupled-allpass power complementary
Import Quantized Filters
After you design or open a quantized filter in your MATLAB workspace, FDATool lets
you import the filter for analysis. Follow these steps to import your filter in to FDATool:
1
Open FDATool.
Select File > Import Filter from Workspace from the menu bar, or choose the
Import Filter from Workspace icon in the side panel:
.
In the lower region of FDATool, the Design Filter pane becomes Import Filter,
and options appear for importing quantized filters, as shown.
4-48
Note: If, during any FDATool session, you switch to quantization mode and create
a fixed-point filter, FDATool remains in quantization mode. If you import a doubleprecision filter, FDATool automatically quantizes your imported filter applying the most
recent quantization parameters.
4-49
When you check the current filter information for your imported filter, it will indicate
that the filter is Source: imported (quantized) even though you did not import a
quantized filter.
To Export Quantized Filters
To save your filter design, FDATool lets you export the quantized filter to your MATLAB
workspace (or you can save the current session in FDATool). When you choose to save the
quantized filter by exporting it, you select one of these options:
Export to your MATLAB workspace
Export to a text file
Export to a MAT-file
Export Coefficients, Objects, or System Objects to the Workspace
You can save the filter as filter coefficients variables, dfilt filter object variables, or
System object variables.
To save the filter to the MATLAB workspace:
1
Select Export from the File menu. The Export dialog box appears.
4-50
If you have variables with the same names in your workspace and you want to
overwrite them, select the Overwrite Variables box.
5
Click Export.
Do not try to export the filter to a variable name that exists in your workspace
without selecting Overwrite existing variables, in the previous step. If you do so,
FDATool stops the export operation. The tool returns a warning that the variable
you specified as the quantized filter name already exists in the workspace.
To continue to export the filter to the existing variable, click OK to dismiss the
warning.
Then select the Overwrite existing variables check box and click Export.
To extract the filter coefficients from your quantized filter after you export the filter to
MATLAB, use the celldisp function in MATLAB. For example, create a quantized
filter in FDATool, and export the filter as Hq. To extract the filter coefficients for Hq, use
celldisp(Hq.referencecoefficients)
which returns the cell array containing the filter reference coefficients, or
celldisp(Hq.quantizedcoefficients
Click OK to export the filter and close the dialog box. Click Apply to export the
filter without closing the Export dialog box. Clicking Apply lets you export your
quantized filter to more than one name without leaving the Export dialog box.
The Export Filter Coefficients to Text-file dialog box appears. This is the
standard Microsoft Windows save file dialog box.
Choose or enter a folder and filename for the text file, and click OK.
4-51
FDATool exports your quantized filter as a text file with the name you provided, and
the MATLAB editor opens, displaying the file for editing.
Export Filter Coefficients as a MAT-File
Click OK to export the filter and close the dialog box. Click Apply to export the
filter without closing the Export dialog box. Clicking Apply lets you export your
quantized filter to more than one name without leaving the Export dialog box.
The Export Filter Coefficients to MAT-file dialog box appears. This dialog box is
the standard Microsoft Windows save file dialog box.
Choose or enter a folder and filename for the text file, and click OK.
FDATool exports your quantized filter as a MAT-file with the specified name.
This option is similar to the previous option with the difference that a System object is
generated instead of a DFILT/MFILT object. The option is disabled when the current
filter is not supported by system objects.
This option generates MATLAB code that filters input data with the current filter
design. The MATLAB code is ready to be converted to C/C++ code using the codegen
command. This option is disabled when the current filter is not supported by system
objects.
4-52
Select File > Import Filter From XILINX Coefficient (.COE) File in FDATool.
In the Import Filter From XILINX Coefficient (.COE) File dialog box, find and
select the .coe file to import.
Click Open to dismiss the dialog box and start the import process.
FDATool imports the coefficient file and creates a quantized, single-section, directform FIR filter.
Lowpass to lowpass.
Lowpass to highpass.
Lowpass to bandpass.
Lowpass to bandstop.
When you click the Transform Filter button,
Filter panel opens in FDATool, as shown here.
Your options for Original filter type refer to the type of your current filter to transform.
If you select lowpass, you can transform your lowpass filter to another lowpass filter or to
a highpass filter, or to numerous other filter formats, real and complex.
Note: When your original filter is an FIR filter, both the FIR and IIR transformed filter
type options appear on the Transformed filter type list. Both options remain active
because you can apply the IIR transforms to an FIR filter. If your source is as IIR filter,
only the IIR transformed filter options show on the list.
Original Filter Type
Select the magnitude response of the filter you are transforming from the list. Your
selection changes the types of filters you can transform to. For example:
When you select Lowpass with an IIR filter, your transformed filter type can be
Lowpass
Highpass
4-54
Bandpass
Bandstop
Multiband
Bandpass (complex)
Bandstop (complex)
Multiband (complex)
When you select Lowpass with an FIR filter, your transformed filter type can be
Lowpass
Lowpass (FIR)
Highpass
Highpass (FIR) narrowband
Highpass (FIR) wideband
Bandpass
Bandstop
Multiband
Bandpass (complex)
Bandstop (complex)
Multiband (complex)
In the following table you see each available original filter type and all the types of filter
to which you can transform your original.
Original Filter
Lowpass FIR
Lowpass
Lowpass (FIR)
Highpass
Highpass (FIR) narrowband
Highpass (FIR) wideband
Bandpass
Bandstop
Multiband
4-55
Original Filter
Lowpass IIR
Lowpass
Highpass
Bandpass
Bandstop
Multiband
Bandpass (complex)
Bandstop (complex)
Multiband (complex)
Highpass FIR
Lowpass
Lowpass (FIR) narrowband
Lowpass (FIR) wideband
Highpass (FIR)
Highpass
Bandpass
Bandstop
Multiband
Bandpass (complex)
Bandstop (complex)
Multiband (complex)
4-56
Original Filter
Highpass IIR
Lowpass
Highpass
Bandpass
Bandstop
Multiband
Bandpass (complex)
Bandstop (complex)
Multiband (complex)
Bandpass FIR
Bandpass
Bandpass (FIR)
Bandpass IIR
Bandpass
Bandstop FIR
Bandstop
Bandstop (FIR)
Bandstop IIR
Bandstop
Note also that the transform options change depending on whether your original filter is
FIR or IIR. Starting from an FIR filter, you can transform to IIR or FIR forms. With an
IIR original filter, you are limited to IIR target filters.
After selecting your response type, use Frequency point to transform to specify the
magnitude response point in your original filter to transfer to your target filter. Your
target filter inherits the performance features of your original filter, such as passband
ripple, while changing to the new response form.
For more information about transforming filters, refer to Frequency Transformations for
Real Filters on page 4-85 and Frequency Transformations for Complex Filters on
page 4-99.
Frequency Point to Transform
The frequency point you enter in this field identifies a magnitude response value (in dB)
on the magnitude response curve.
4-57
When you enter frequency values in the Specify desired frequency location option,
the frequency transformation tries to set the magnitude response of the transformed
filter to the value identified by the frequency point you enter in this field.
While you can enter any location, generally you should specify a filter passband or
stopband edge, or a value in the passband or stopband.
The Frequency point to transform sets the magnitude response at the values you
enter in Specify desired frequency location. Specify a value that lies at either the
edge of the stopband or the edge of the passband.
If, for example, you are creating a bandpass filter from a highpass filter, the
transformation algorithm sets the magnitude response of the transformed filter at
the Specify desired frequency location to be the same as the response at the
Frequency point to transform value. Thus you get a bandpass filter whose response
at the low and high frequency locations is the same. Notice that the passband between
them is undefined. In the next two figures you see the original highpass filter and the
transformed bandpass filter.
For more information about transforming filters, refer to Digital Frequency
Transformations on page 4-77.
Transformed Filter Type
Select the magnitude response for the target filter from the list. The complete list of
transformed filter types is:
Lowpass
Lowpass (FIR)
Highpass
Highpass (FIR) narrowband
Highpass (FIR) wideband
Bandpass
Bandstop
Multiband
Bandpass (complex)
Bandstop (complex)
Multiband (complex)
4-58
Not all types of transformed filters are available for all filter types on the Original filter
types list. You can transform bandpass filters only to bandpass filters. Or bandstop
filters to bandstop filters. Or IIR filters to IIR filters.
For more information about transforming filters, refer to Frequency Transformations for
Real Filters on page 4-85 and Frequency Transformations for Complex Filters on
page 4-99.
Specify Desired Frequency Location
The frequency point you enter in Frequency point to transform matched a magnitude
response value. At each frequency you enter here, the transformation tries to make the
magnitude response the same as the response identified by your Frequency point to
transform value.
While you can enter any location, generally you should specify a filter passband or
stopband edge, or a value in the passband or stopband.
For more information about transforming filters, refer to Digital Frequency
Transformations on page 4-77.
Transform Filters
To transform the magnitude response of your filter, use the Transform Filter option on
the side bar.
1
2
From the Original filter type list, select the response form of the filter you are
transforming.
When you select the type, whether is lowpass, highpass, bandpass, or bandstop,
FDATool recognizes whether your filter form is FIR or IIR. Using both your filter
type selection and the filter form, FDATool adjusts the entries on the Transformed
filter type list to show only those that apply to your original filter.
From the Transformed filter type list, select the type of filter you want to
transform to.
Your filter type selection changes the options here.
When you pick a lowpass or highpass filter type, you enter one value in Specify
desired frequency location.
When you pick a bandpass or bandstop filter type, you enter two values one in
Specify desired low frequency location and one in Specify desired high
frequency location. Your values define the edges of the passband or stopband.
When you pick a multiband filter type, you enter values as elements in a vector
in Specify a vector of desired frequency locations one element for each
desired location. Your values define the edges of the passbands and stopbands.
After you click Transform Filter, FDATool transforms your filter, displays
the magnitude response of your new filter, and updates the Current Filter
Information to show you that your filter has been transformed. In the filter
information, the Source is Transformed.
For example, the figure shown here includes the magnitude response curves for
two filters. The original filter is a lowpass filter with rolloff between 0.2 and 0.25.
The transformed filter is a lowpass filter with rolloff region between 0.8 and 0.85.
4-60
Magnitude Response
20
Magnitude (dB)
20
40
60
80
100
0.1
0.2
0.3
0.4
0.5
0.6
Normalized Frequency ( rad/sample)
0.7
0.8
0.9
4-61
Magnitude Response
20
Magnitude (dB)
20
40
60
80
100
120
0.1
0.2
0.3
0.4
0.5
0.6
Normalized Frequency ( rad/sample)
0.7
0.8
0.9
For the narrowband case, the transformation algorithm essentially reverses the
magnitude response, like reflecting the curve around the y-axis, then translating
the curve to the right until the origin lies at 1 on the x-axis. After reflecting and
translating, the passband at high frequencies is the reverse of the passband of the
original filter at low frequencies with the same rolloff and ripple characteristics.
4-62
Introduction
Not only can you design multirate filters from the MATLAB command prompt, FDATool
provides the same design capability in a graphical user interface tool. By starting
FDATool and switching to the multirate filter design mode you have access to all of the
multirate design capabilities in the toolbox decimators, interpolators, and fractional
rate changing filters, among others.
Switch FDATool to Multirate Filter Design Mode
The multirate filter design mode in FDATool lets you specify and design a wide range of
multirate filters, including decimators and interpolators.
With FDATool open, click Create a Multirate Filter,
, on the side bar. You see
FDATool switch to the design mode showing the multirate filter design options. Shown
in the following figure is the default multirate design configuration that designs an
interpolating filter with an interpolation factor of 2. The design uses the current FIR
filter in FDATool.
4-63
When the current filter in FDATool is not an FIR filter, the multirate filter design panel
removes the Use current FIR filter option and selects the Use default Nyquist FIR
filter option instead as the default setting.
Controls on the Multirate Design Panel
You see the options that allow you to design a variety of multirate filters. The Type
option is your starting point. From this list you select the multirate filter to design.
Based on your selection, other options change to provide the controls you need to specify
your filter.
Notice the separate sections of the design panel. On the left is the filter type area
where you choose the type of multirate filter to design and set the filter performance
specifications.
In the center section FDATool provides choices that let you pick the filter design method
to use.
4-64
The rightmost section offers options that control filter configuration when you select
Cascaded-Integrator Comb (CIC) as the design method in the center section. Both the
Decimator type and Interpolator type filters let you use the Cascaded-Integrator
Comb (CIC) option to design multirate filters.
Here are all the options available when you switch to multirate filter design mode. Each
option listed includes a brief description of what the option does when you use it.
Select and Configure Your Filter
Option
Description
Type
Interpolation Factor
4-65
Option
Description
Decimation Factor
Sampling Frequency
Units
Fs
4-66
Option
Description
Design CIC filters using the options provided in the righthand area of the multirate design panel.
Hold Interpolator
(Zero-order)
Linear Interpolator
(First-order)
To see the difference between hold interpolation and linear interpolation, the following
figure presents a sine wave signal s1 in three forms:
The top subplot in the figure presents signal s1 without interpolation.
The middle subplot shows signal s1 interpolated by a linear interpolator with an
interpolation factor of 5.
The bottom subplot shows signal s1 interpolated by a hold interpolator with an
interpolation factor of 5.
You see in the bottom figure the sample and hold nature of hold interpolation, and the
first-order linear interpolation applied by the linear interpolator.
Uninterpolated Signal s1
1
0.5
0
0.5
1
10
40
45
50
40
45
50
10
15
20
25
30
35
10
15
20
25
Samples
30
35
We used FDATool to create interpolators similar to the following code for the figure:
Linear interpolator hm=mfilt.linearinterp(5)
Hold interpolator hm=mfilt.holdinterp(5)
4-67
Sets the differential delay for the CIC filter. Usually a value of one
or two is appropriate.
Number of Sections
To introduce the process you use to design a multirate filter in FDATool, this example
uses the options to design a fractional rate convertor which uses 7/3 as the fractional
rate. Begin the design by creating a default lowpass FIR filter in FDATool. You do not
have to begin with this FIR filter, but the default filter works fine.
1
Launch FDATool.
Select the settings for a minimum-order lowpass FIR filter, using the Equiripple
design method.
When FDATool displays the magnitude response for the filter, click
in the side
bar. FDATool switches to multirate filter design mode, showing the multirate design
panel.
In Interpolation Factor, use the up arrow to set the interpolation factor to7.
Select Use a default Nyquist FIR filter. You could design the rate convertor
with the current FIR filter as well.
4-68
You can test the filter by exporting it to your workspace and using it to filter a signal. For
information about exporting filters, refer to Import and Export Quantized Filters on
page 4-47.
Design a CIC Decimator for 8 Bit Input/Output Data
Another kind of filter you can design in FDATool is Cascaded-Integrator Comb (CIC)
filters. FDATool provides the options needed to configure your CIC to meet your needs.
1
2
Launch FDATool and design the default FIR lowpass filter. Designing a filter at this
time is an optional step.
Switch FDATool to multirate design mode by clicking
4-70
Follow these steps to convert your multirate filter to fixed-point arithmetic and set the
fixed-point options.
1
Design or import your multirate filter and make sure it is the current filter in
FDATool.
From the Filter Arithmetic list on the Filter Arithmetic pane, select Fixedpoint. If your filter is a CIC filter, the Fixed-point option is enabled by default
and you do not set this option.
In the quantization panes, set the options for your filter. Set options for
Coefficients, Input/Output, and Filter Internals.
Click Apply.
4-71
When you current filter is a CIC filter, the options on the Input/Output and Filter
Internals panes change to provide specific features for CIC filters.
Input/Output
The options that specify how your CIC filter uses input and output values are listed in
the table below.
Option Name
Description
Lets you set the range the inputs represent. You use this
instead of the Input fraction length option to set the
precision. When you enter a value x, the resulting range is x to x. Range must be a positive integer.
Avoid overflow
Directs the filter to set the fraction length for the input
to prevent the output values from exceeding the available
range as defined by the word length. Clearing this option
lets you set Output fraction length.
Lets you set the range the outputs represent. You use this
instead of the Output fraction length option to set the
precision. When you enter a value x, the resulting range is x to x. Range must be a positive integer.
The available options change when you change the Filter precision setting. Moving
from Full to Specify all adds increasing control by enabling more input and output
word options.
Filter Internals
With a CIC filter as your current filter, the Filter precision option on the Filter
Internals pane includes modes for controlling the filter word and fraction lengths.
There are four usage modes for this (the same mode you select for the FilterInternals
property in CIC filters at the MATLAB prompt).
4-72
Full All word and fraction lengths set to Bmax + 1, called Baccum by Harris in [2].
Full Precision is the default setting.
Minimum section word lengths Set the section word lengths to minimum
values that meet roundoff noise and output requirements as defined by Hogenauer in
[3].
Specify word lengths Enables the Section word length option for you to
enter word lengths for each section. Enter either a scalar to use the same value for
every section, or a vector of values, one for each section.
Specify all Enables the Section fraction length option in addition to Section
word length. Now you can provide both the word and fraction lengths for each
section, again using either a scalar or a vector of values.
Export Individual Phase Coefficients of a Polyphase Filter to the Workspace
After designing a polyphase filter in Filter Design Analysis Tool (FDATool), you can
obtain the individual phase coefficients of the filter by:
1
In FDATool, open the File menu and select Export.... This opens the dialog box for
exporting the filter coefficients.
(Optional) For Variable Names, enter the name of the Multirate Filter object that
will be created in the MATLAB workspace.
Click the Export button. The multirate filter object, Hm in this example, appears in
the MATLAB workspace.
object, Hm. Each row of p consists of the coefficients of an individual phase subfilter. The
first row contains to the coefficients of the first phase subfilter, the second row contains
those of the second phase subfilter, and so on.
4-74
on
For information on these parameters, see the descriptions on the Filter Realization
Wizard block reference page.
Realize a Filter Using FDATool
After your quantized filter in FDATool is performing the way you want, with your desired
phase and magnitude response, and with the right coefficients and form, follow these
steps to realize your filter as a subsystem that you can use in a Simulink model.
1
2
Click Realize Model on the sidebar to change FDATool to realize model mode.
From the Destination list under Model, select either:
Current model to add the realized filter subsystem to your current model
New model to open a new Simulink model window and add your filter
subsystem to the new window
3
4
Provide a name for your new filter subsystem in the Name field.
Decide whether to overwrite an existing block with this new one, and select or clear
the Overwrite generated Filter block check box.
Select the Build model using basic elements check box to implement your filter
as a subsystem block that consists of Sum, Gain, and Delay blocks.
Click Realize Model to realize your quantized filter as a subsystem block according
to the settings you selected.
If you double-click the filter block subsystem created by FDATool, you see the filter
implementation in Simulink model form. Depending on the options you chose when you
realized your filter, and the filter you started with, you might see one or more sections, or
different architectures based on the form of your quantized filter. From this point on, the
subsystem filter block acts like any other block that you use in Simulink models.
4-75
FDATool lets you realize discrete-time and multirate filters from the following forms:
4-76
Structure
Description
firdecim
firtdecim
linearinterp
Linear interpolators
firinterp
multirate polyphase
Multirate filters
holdinterp
dfilt.allpass
dfilt.cascadeallpass
dfilt.cascadewdfallpass
mfilt.iirdecim
mfilt.iirwdfdecim
mfilt.iirinterp
mfilt.iirwdfinterp
dfilt.wdfallpass
HT ( z) = H o[ H A ( z)]
The HA(z) is an Nth-order allpass mapping filter given by
4-77
ai z i
N ( z)
H A ( z) = S Ni = 0
= A
DA ( z)
ai z N + i
a0 = 1
i= 0
where
Ho(z) Transfer function of the prototype filter
HA(z) Transfer function of the allpass mapping filter
HT(z) Transfer function of the target filter
Let's look at a simple example of the transformation given by
HT ( z) = H o ( z)
The target filter has its poles and zeroes flipped across the origin of the real and
imaginary axes. For the real filter prototype, it gives a mirror effect against 0.5, which
means that lowpass Ho(z) gives rise to a real highpass HT(z). This is shown in the
following figure for the prototype filter designed as a third-order halfband elliptic filter.
4-78
Target filter
0
10
10
20
20
|H()| in dB
|H()| in dB
Prototype filter
0
30
40
50
60
30
40
50
0.2
0.4
0.6
0.8
1
Normalized Frequency ( rad/sample)
60
0.2
0.4
0.6
0.8
1
Normalized Frequency ( rad/sample)
H (wnew ) = w old
The graphical interpretation of the frequency transformation is shown in the figure
below. The complex multiband transformation takes a real lowpass filter and converts it
into a number of passbands around the unit circle.
4-79
1 + a1 z1 + a 2 z2
a 2 + a1 z 1 + z 2
The two degrees of freedom provided by 1 and 2 choices are not fully used by the usual
restrictive set of flat-top classical mappings like lowpass to bandpass. Instead, any
two transfer function features can be migrated to (almost) any two other frequency
locations if 1 and 2 are chosen so as to keep the poles of HA(z) strictly outside the unit
circle (since HA(z) is substituted for z in the prototype transfer function). Moreover, as
first pointed out by Constantinides, the selection of the outside sign influences whether
the original feature at zero can be moved (the minus sign, a condition known as DC
mobility) or whether the Nyquist frequency can be migrated (the Nyquist mobility case
arising when the leading sign is positive).
4-80
All the transformations forming the package are explained in the next sections of the
tutorial. They are separated into those operating on real filters and those generating
or working with complex filters. The choice of transformation ranges from standard
Constantinides first and second-order ones [1][2] up to the real multiband filter by Mullis
and Franchitti [3], and the complex multiband filter and real/complex multipoint ones by
Krukowski, Cain and Kale [4].
Select Features Subject to Transformation
Choosing the appropriate frequency transformation for achieving the required effect
and the correct features of the prototype filter is very important and needs careful
consideration. It is not advisable to use a first-order transformation for controlling more
than one feature. The mapping filter will not give enough flexibility. It is also not good
to use higher order transformation just to change the cutoff frequency of the lowpass
filter. The increase of the filter order would be too big, without considering the additional
replica of the prototype filter that may be created in undesired places.
features were the left and the right band edges of the lowpass filter passband, in the
second case they were the left band edge and the DC, in the third case they were DC and
the right band edge.
Magniture responses |H()| in dB
0
10
20
30
40
50
60
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
0.9
In the example the requirements are set to create a real bandpass filter with passband
edges at 0.1 and 0.3 out of the real lowpass filter having the cutoff frequency at 0.5. This
is attempted in three different ways. In the first approach both edges of the passband
are selected, in the second approach the left edge of the passband and the DC are chosen,
while in the third approach the DC and the right edge of the passband are taken:
[num1,den1] = iirlp2xn(b, a, [-0.5, 0.5], [0.1, 0.3]);
[num2,den2] = iirlp2xn(b, a, [-0.5, 0.0], [0.1, 0.2]);
[num3,den3] = iirlp2xn(b, a, [ 0.0, 0.5], [0.2, 0.3]);
H o ( z) =
(z zi )
i =1
N
(z pi )
i =1
the mapping will replace each pole, pi, and each zero, zi, with a number of poles and zeros
equal to the order of the allpass mapping filter:
N 1
N 1
a k z k zi
ak z N k
S
k= 0
H o ( z) = i =1 k =0
N N 1
N 1
a k z k pi
S
ak z N k
i =1 k =0
k= 0
4-83
The root finding needs to be used on the bracketed expressions in order to find the poles
and zeros of the target filter.
When the prototype filter is described in the numerator-denominator form:
HT ( z) =
b 0 z N + b1 z N 1 + + b N
a 0 z N + a1 z N 1 + + a N
z = H A ( z)
Then the mapping process will require a number of convolutions in order to calculate the
numerator and denominator of the target filter:
b N ( z) N + b 2 N A ( z) N 1 DA ( z) + + b N D A ( z) N
HT ( z) = 1 A
b1 N A ( z) N + b 2 N A ( z) N 1 DA ( z) + + b N D A ( z) N
For each coefficient i and i of the prototype filter the NAth-order polynomials must be
convolved N times. Such approach may cause rounding errors for large prototype filters
and/or high order mapping filters. In such a case the user should consider the alternative
of doing the mapping using via poles and zeros.
Summary of Frequency Transformations
Advantages
There are cases when using optimization methods to design the required filter gives
better results.
High-order transformations increase the dimensionality of the target filter, which
may give expensive final results.
4-84
H A ( z) = z1
1 a z1
a z1
with given by
4-85
p
2
cos wold
2
a =
sin p (w 2w )
new
2 ol d
otherwise
p
sin
w
2 old
where
old Frequency location of the selected feature in the prototype filter
new Position of the feature originally at old in the target filter
The following example shows how this transformation can be used to move the response
of the prototype lowpass filter in either direction. Please note that because the target
filter must also be real, the response of the target filter will inherently be disturbed at
frequencies close to Nyquist and close to DC. Here is the MATLAB code for generating
the example in the figure.
The prototype filter is a halfband elliptic, real, third-order lowpass filter:
[b, a] = ellip(3, 0.1, 30, 0.409);
4-86
Prototype filter
0
|H()|in dB
10
20
30
40
o
50
60
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
0.9
0.9
Target filter
0
|H()| in dB
10
20
30
40
t
50
60
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
a z 1
with given by
4-87
p
sin (wold wnew )
2
a =
p
sin (wold wnew )
2
where
old Frequency location of the selected feature in the prototype filter
new Frequency location of the same feature in the target filter
The example below shows how to modify the cutoff frequency of the prototype filter. The
MATLAB code for this example is shown in the following figure.
The prototype filter is a halfband elliptic, real, third-order filter:
[b, a] = ellip(3, 0.1, 30, 0.409);
4-88
Prototype filter
0
|H()|in dB
10
20
30
40
o
50
60
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
0.9
0.8
0.9
Target filter
0
|H()| in dB
10
20
30
40
t
50
60
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
a + z1
with given by
4-89
p
cos (wold wnew )
where
old Frequency location of the selected feature in the prototype filter
new Frequency location of the same feature in the target filter
The example below shows how to convert the lowpass filter into a highpass filter with
arbitrarily chosen cutoff frequency. In the MATLAB code below, the lowpass filter is
converted into a highpass with cutoff frequency shifted from 0.5 to 0.75. Results are
shown in the figure.
The prototype filter is a halfband elliptic, real, third-order filter:
[b, a] = ellip(3, 0.1, 30, 0.409);
4-90
Prototype filter
0
|H()|in dB
10
20
30
40
o
50
60
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
0.9
0.8
0.9
Target filter
0
|H()| in dB
10
20
30
40
t
50
60
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
4-91
p
sin ( 2w old wnew,2 + wnew,1)
4
a =
p
sin ( 2w old + w new,2 wnew,1)
4
p
b = cos (wnew,1 + wnew,2 )
2
where
old Frequency location of the selected feature in the prototype filter
new,1 Position of the feature originally at (-old) in the target filter
new,2 Position of the feature originally at (+old) in the target filter
The example below shows how to move the response of the prototype lowpass filter in
either direction. Please note that because the target filter must also be real, the response
of the target filter will inherently be disturbed at frequencies close to Nyquist and close
to DC. Here is the MATLAB code for generating the example in the figure.
The prototype filter is a halfband elliptic, real, third-order lowpass filter:
[b, a] = ellip(3, 0.1, 30, 0.409);
The example transformation creates the passband between 0.5 and 0.75:
[num,den] = iirlp2bp(b, a, 0.5, [0.5, 0.75]);
4-92
Prototype filter
0
|H()|in dB
10
20
30
40
o
50
60
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
0.9
0.8
0.9
Target filter
0
|H()| in dB
10
20
30
40
t1
50
60
0.1
0.2
t2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
H A ( z) =
1 b (1 + a ) z1 + a z 2
a b (1 + a ) z 1 + z 2
4-93
p
(2wold + wnew,2 wnew,1 )
4
a =
p
cos (2wold wnew,2 + wnew,1 )
4
p
b = cos (wnew,1 + wnew,2 )
2
cos
where
old Frequency location of the selected feature in the prototype filter
new,1 Position of the feature originally at (-old) in the target filter
new,2 Position of the feature originally at (+old) in the target filter
The following example shows how this transformation can be used to convert the
prototype lowpass filter with cutoff frequency at 0.5 into a real bandstop filter with the
same passband and stopband ripple structure and stopband positioned between 0.5 and
0.75. Here is the MATLAB code for generating the example in the figure.
The prototype filter is a halfband elliptic, real, third-order lowpass filter:
[b, a] = ellip(3, 0.1, 30, 0.409);
4-94
Prototype filter
0
|H()|in dB
10
20
30
40
o
50
60
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
0.9
0.9
Target filter
0
|H()| in dB
10
20
30
40
t1
50
60
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
t2
0.8
ai zi
H A ( z) = S Ni = 0
ai z N +i
a0 = 1
i= 0
a 0 = 1 k = 1,, N
2
a k = S
p
sin (( N 2k)wnew + ( 1) kw old )
where
old,k Frequency location of the first feature in the prototype filter
new,k Position of the feature originally at old,k in the target filter
The mobility factor, S, specifies the mobility or either DC or Nyquist feature:
1 Nyquist
S=
DC
1
The example below shows how this transformation can be used to convert the prototype
lowpass filter with cutoff frequency at 0.5 into a filter having a number of bands
positioned at arbitrary edge frequencies 1/5, 2/5, 3/5 and 4/5. Parameter S was such that
there is a passband at DC. Here is the MATLAB code for generating the figure.
The prototype filter is a halfband elliptic, real, third-order lowpass filter:
[b, a] = ellip(3, 0.1, 30, 0.409);
The example transformation creates three stopbands, from DC to 0.2, from 0.4 to 0.6 and
from 0.8 to Nyquist:
[num,den] = iirlp2mb(b, a, 0.5, [0.2, 0.4, 0.6, 0.8], `pass');
4-96
Prototype filter
0
|H()|in dB
10
20
30
40
o
50
60
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
0.9
0.9
Target filter
0
|H()| in dB
10
20
30
40
t1
50
60
0.1
0.2
t2
t3
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
t4
0.8
ai z i
H A ( z) = S Ni = 0
ai z N + i
a0 = 1
i= 0
N
i
Ni
a N i zold ,k znew, k S znew,k = zold ,k S znew, k
i =1
jpw
zold ,k = e old, k
j pw
znew, k = e new,k
k = 1,, N
where
old,k Frequency location of the first feature in the prototype filter
new,k Position of the feature originally at old,k in the target filter
The mobility factor, S, specifies the mobility of either DC or Nyquist feature:
1 Nyquist
S=
DC
1
The example below shows how this transformation can be used to move features of the
prototype lowpass filter originally at -0.5 and 0.5 to their new locations at 0.5 and 0.75,
effectively changing a position of the filter passband. Here is the MATLAB code for
generating the figure.
The prototype filter is a halfband elliptic, real, third-order lowpass filter:
[b, a] = ellip(3, 0.1, 30, 0.409);
4-98
Prototype filter
0
|H()|in dB
10
20
30
40
o2
50
60
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
0.9
0.9
Target filter
0
|H()| in dB
10
20
30
40
t1
50
60
0.1
0.2
t2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
frequency response modified in respect to the frequency response of the prototype filter
according to the characteristic of the applied frequency transformation from:
Complex Frequency Shift
Complex frequency shift transformation is the simplest first-order transformation that
performs an exact mapping of one selected feature of the frequency response into its new
location. At the same time it rotates the whole response of the prototype lowpass filter
by the distance specified by the selection of the feature from the prototype filter and the
target filter.
H A ( z) = a z1
with given by
a = e j 2p (n new n ol d )
where
old Frequency location of the selected feature in the prototype filter
new Position of the feature originally at old in the target filter
A special case of the complex frequency shift is a, so called, Hilbert Transformer. It can
be designed by setting the parameter to ||=1, that is
1 forward
a =
1 inverse
The example below shows how to apply this transformation to rotate the response of the
prototype lowpass filter in either direction. Please note that because the transformation
can be achieved by a simple phase shift operator, all features of the prototype filter will
be moved by the same amount. Here is the MATLAB code for generating the example in
the figure.
The prototype filter is a halfband elliptic, real, third-order lowpass filter:
[b, a] = ellip(3, 0.1, 30, 0.409);
4-100
Prototype filter
0
|H()|in dB
10
20
30
40
o
50
60
1
0.8
0.6
0.4
0.2
0
0.2
0.4
Normalized Frequency ( rad/sample)
0.6
0.8
0.6
0.8
Target filter
0
|H()| in dB
10
20
30
40
t
50
60
1
0.8
0.6
0.4
0.2
0
0.2
0.4
Normalized Frequency ( rad/sample)
b a z1
z1 ab
p
sin ( 2w old wnew,2 + wnew,1)
4
a =
sin p (2wold + wnew,2 wnew,1 )
b = e jp (wnew wo ld )
4-101
where
old Frequency location of the selected feature in the prototype filter
new,1 Position of the feature originally at (-old) in the target filter
new,2 Position of the feature originally at (+old) in the target filter
The following example shows the use of such a transformation for converting a real
halfband lowpass filter into a complex bandpass filter with band edges at 0.5 and 0.75.
Here is the MATLAB code for generating the example in the figure.
The prototype filter is a half band elliptic, real, third-order lowpass filter:
[b, a] = ellip(3, 0.1, 30, 0.409);
|H()|in dB
10
20
30
40
o
50
60
1
0.8
0.6
0.4
0.2
0
0.2
0.4
Normalized Frequency ( rad/sample)
0.6
0.8
0.8
Target filter
0
|H()| in dB
10
20
30
40
t1
50
t2
60
1
0.8
0.6
0.4
0.2
0
0.2
0.4
Normalized Frequency ( rad/sample)
0.6
H A ( z) =
b a z1
ab z1
a =
b = e jp (wnew wo ld )
where
old Frequency location of the selected feature in the prototype filter
new,1 Position of the feature originally at (-old) in the target filter
new,2 Position of the feature originally at (+old) in the target filter
The example below shows the use of such a transformation for converting a real halfband
lowpass filter into a complex bandstop filter with band edges at 0.5 and 0.75. Here is the
MATLAB code for generating the example in the figure.
The prototype filter is a halfband elliptic, real, third-order lowpass filter:
[b, a] = ellip(3, 0.1, 30, 0.409);
4-103
Prototype filter
0
|H()|in dB
10
20
30
40
o
50
60
1
0.8
0.6
0.4
0.2
0
0.2
0.4
Normalized Frequency ( rad/sample)
0.6
0.8
Target filter
0
|H()| in dB
10
20
30
40
t1
50
60
1
0.8
0.6
0.4
0.2
0
0.2
0.4
Normalized Frequency ( rad/sample)
t2
0.6
0.8
ai z i
H A ( z) = S N i = 0
ai z N +i
a0 = 1
4-104
i= 0
N
(ai ) cos b1,k cos b 2,k + (a i ) sin b1, k + sin b 2, k = cos b 3,k
i =1
N
(a ) sin b sin b (a ) cos b + cos b = sin b
i
1, k
2, k
i
1 ,k
2, k
3, k
i =1
b = p n
( 1) k + n new,k ( N k)
1 ,k
old
b 2, k = p C + n n ew, kk
k
b 3, k = p n old ( 1) + n new, k N
k = 1 N
where
old Frequency location of the selected feature in the prototype filter
new,i Position of features originally at old in the target filter
Parameter S is the additional rotation factor by the frequency distance C, giving the
additional flexibility of achieving the required mapping:
S = e jpC
The example shows the use of such a transformation for converting aprototype real
lowpass filter with the cutoff frequency at 0.5 into a multiband complex filter with band
edges at 0.2, 0.4, 0.6 and 0.8, creating two passbands around the unit circle. Here is the
MATLAB code for generating the figure.
4-105
Prototype filter
0
|H()|in dB
10
20
30
40
o
50
60
1
0.8
0.6
0.4
0.2
0
0.2
0.4
Normalized Frequency ( rad/sample)
0.6
0.8
Target filter
0
|H()| in dB
10
20
30
40
t1
50
60
1
0.8
0.6
t2
0.4
0.2
0
0.2
0.4
Normalized Frequency ( rad/sample)
t3
0.6
t4
0.8
4-106
ai z i
H A ( z) = S N i = 0
ai z N +i
a0 = 1
i= 0
N
(ai ) cos b1,k cos b 2,k + (a i ) sin b1, k + sin b 2, k = cos b 3,k
i =1
N
(a ) sin b sin b (a ) cos b + cos b = sin b
i
1, k
2, k
i
1 ,k
2, k
3, k
i =1
p
b1,k = w old ,k + wnew,k ( N k)
2
p
b 2, k = 2C + wnew,k k
2
b = p w
old ,k + wnew,k N
3, k
2
k = 1 N
where
old,k Frequency location of the first feature in the prototype filter
new,k Position of the feature originally at old,k in the target filter
Parameter S is the additional rotation factor by the frequency distance C, giving the
additional flexibility of achieving the required mapping:
S = e jpC
The following example shows how this transformation can be used to move one selected
feature of the prototype lowpass filter originally at -0.5 to two new frequencies -0.5 and
4-107
0.1, and the second feature of the prototype filter from 0.5 to new locations at -0.25 and
0.3. This creates two nonsymmetric passbands around the unit circle, creating a complex
filter. Here is the MATLAB code for generating the figure.
The prototype filter is a halfband elliptic, real, third-order lowpass filter:
[b, a] = ellip(3, 0.1, 30, 0.409);
Prototype filter
0
|H()|in dB
10
20
30
40
50
60
1
0.8
0.6
o1
o2
o3
o4
0.4
0.2
0
0.2
0.4
Normalized Frequency ( rad/sample)
0.6
0.8
0.6
0.8
Target filter
0
|H()| in dB
10
20
30
40
50
60
1
t1
0.8
0.6
t2
t3
t4
0.4
0.2
0
0.2
0.4
Normalized Frequency ( rad/sample)
H A ( z) =
a (g b z1 )
z1 bg
p
((wold,2 wold,1) (wnew,2 wnew,1 ))
4
a =
p
sin ((wold,2 w old,,1 ) + (wnew,2 wnew,1 ))
4
sin
a =e
g =e
jp (w old ,2 wold,1 )
jp (wnew,2 wneew,1 )
where
old,1 Frequency location of the first feature in the prototype filter
old,2 Frequency location of the second feature in the prototype filter
new,1 Position of the feature originally at old,1 in the target filter
new,2 Position of the feature originally at old,2 in the target filter
The following example shows how this transformation can be used to modify the position
of the passband of the prototype filter, either real or complex. In the example below
the prototype filter passband spanned from 0.5 to 0.75. It was converted to having a
passband between -0.5 and 0.1. Here is the MATLAB code for generating the figure.
The prototype filter is a halfband elliptic, real, third-order lowpass filter:
[b, a] = ellip(3, 0.1, 30, 0.409);
4-109
Prototype filter
0
|H()|in dB
10
20
30
40
o1
50
60
1
0.8
0.6
0.4
0.2
0
0.2
0.4
Normalized Frequency ( rad/sample)
o2
0.6
0.8
0.6
0.8
Target filter
0
|H()| in dB
10
20
30
40
t1
50
60
1
0.8
0.6
t2
0.4
0.2
0
0.2
0.4
Normalized Frequency ( rad/sample)
4-110
To learn how to save your filter designs, see Saving and Opening Filter Design Sessions
in the Signal Processing Toolbox documentation. To learn how to import and export your
filter designs, see Import and Export Quantized Filters.
Note: You can use the Digital Filter Design block to design and implement a filter. To
implement a pre-designed filter, use the Discrete FIR Filter or Biquad Filter blocks.
Both methods implement a filter design in the same manner and have the same behavior
during simulation and code generation.
See the Digital Filter Design block reference page for more information. For information
on choosing between the Digital Filter Design block and the Filter Realization Wizard,
see Select a Filter Design Block on page 4-112.
Data type support The Filter Realization Wizard block supports single- and
double-precision floating-point computation for all filter structures and fixed-point
computation for some filter structures. The Digital Filter Design block only supports
single- and double-precision floating-point computation.
Block versus Wizard The Digital Filter Design block is the filter itself, but the
Filter Realization Wizard block just enables you to create new filters and put them in
an existing model. Thus, the Filter Realization Wizard is not a block that processes
data in your model, it is a wizard that generates filter blocks (or subsystems) which
you can then use to process data in your model.
When to Use Each Block
The following are specific situations where only the Digital Filter Design block or the
Filter Realization Wizard is appropriate.
Digital Filter Design
Use to simulate single- and double-precision floating-point filters.
Use to generate highly optimized ANSI C code that implements floating-point
filters for embedded systems.
Filter Realization Wizard
Use to simulate numerical behavior of fixed-point filters in a DSP chip, a fieldprogrammable gate array (FPGA), or an application-specific integrated circuit
(ASIC).
Use to simulate single- and double-precision floating-point filters with structures
that the Digital Filter Design block does not support.
Use to visualize the filter structure, as the block can build the filter from Sum,
Gain, and Delay blocks.
Use to rapidly generate multiple filter blocks.
See Filter Realization Wizard on page 4-121 and the Filter Realization Wizard block
reference page for information.
4-113
From the DSP System Toolbox Filtering library, and then from the Filter
Implementations library, click-and-drag a Digital Filter Design block into your
model.
Click Design Filter at the bottom of the GUI to design the filter.
Your Digital Filter Design block now represents a filter with the parameters you
specified.
The Digital Filter Design block now represents a lowpass filter with a Direct-Form
FIR Transposed structure. The filter passes all frequencies up to 20% of the Nyquist
frequency (half the sampling frequency), and stops frequencies greater than or equal to
50% of the Nyquist frequency as defined by the wpass and wstop parameters. In the
next topic, Create a Highpass Filter in Simulink on page 4-114, you use a Digital
Filter Design block to create a highpass filter. For more information about implementing
a pre-designed filter, see Digital Filter Implementations on page 4-133.
4-114
If the model you created in Create a Lowpass Filter in Simulink on page 4-113 is
not open on your desktop, you can open an equivalent model by typing
ex_filter_ex4
From the DSP System Toolbox Filtering library, and then from the Filter
Implementations library, click-and-drag a second Digital Filter Design block into
your model.
Click the Design Filter button at the bottom of the GUI to design the filter.
Your Digital Filter Design block now represents a filter with the parameters you
specified.
The block now implements a highpass filter with a direct form FIR transpose structure.
The filter passes all frequencies greater than or equal to 50% of the Nyquist frequency
(half the sampling frequency), and stops frequencies less than or equal to 20% of the
Nyquist frequency as defined by the wpass and wstop parameters. This highpass filter
is the opposite of the lowpass filter described in Create a Lowpass Filter in Simulink
on page 4-113. The highpass filter passes the frequencies stopped by the lowpass
filter, and stops the frequencies passed by the lowpass filter. In the next topic, Filter
High-Frequency Noise in Simulink on page 4-116, you use these Digital Filter
Design blocks to create a model capable of removing high frequency noise from a signal.
4-115
For more information about implementing a pre-designed filter, see Digital Filter
Implementations on page 4-133.
If the model you created in Create a Highpass Filter in Simulink on page 4-114
is not open on your desktop, you can open an equivalent model by typing
ex_filter_ex5
Library
Quantity
Add
Random Source
Sources
Sine Wave
Sources
Time Scope
Sinks
Set the parameters for these blocks as indicated in the following table. Leave the
parameters not listed in the table at their default settings.
Parameter Settings for the Other Blocks
Block
Parameter Setting
Add
Icon shape=rectangular
List of signs=++
Random Source
4-116
Block
Parameter Setting
Sample time=1/1000
Samples per frame=50
Sine Wave
Frequency (Hz)=75
Sample time=1/1000
Samples per frame=50
Time Scope
Connect the blocks as shown in the following figure. You might need to resize some
of the blocks to accomplish this task.
4-117
In the Solver pane, set the parameters as follows, and then click OK:
Start time = 0
Stop time = 5
Type = Fixed-step
Solver = Discrete (no continuous states)
After simulation is complete, select View > Legend from the Time Scope menu. The
legend appears in the Time Scope window. You can click-and-drag it anywhere on
the scope display. To change the channel names, double-click inside the legend and
replace the default channel names with the following:
Add = Noisy Sine Wave
Digital Filter Design Lowpass = Filtered Noisy Sine Wave
Sine Wave = Original Sine Wave
In the next step, you will set the color, style, and marker of each channel.
In the Time Scope window, select View > Line Properties, and set the following:
Line
Style
Marker
Color
None
Black
diamond
Red
Blue
4-118
You can see that the lowpass filter filters out the high-frequency noise in the noisy
sine wave.
You have now used Digital Filter Design blocks to build a model that removes high
frequency noise from a signal. For more information about these blocks, see the Digital
Filter Design block reference page. For information on another block capable of designing
4-119
and implementing filters, see Filter Realization Wizard on page 4-121. To learn how
to save your filter designs, see Saving and Opening Filter Design Sessions in the Signal
Processing Toolbox documentation. To learn how to import and export your filter designs,
see Import and Export Quantized Filters in the DSP System Toolbox documentation.
4-120
Type
load mtlb
soundsc(mtlb,Fs)
at the MATLAB command line. You should hear a voice say MATLAB. This is the
signal to which you will add noise.
2
at the command line. You can hear the noise signal by typing
soundsc(noise,Fs)
at the command line. You scale the signal to try to avoid overflows later on. You can
hear the scaled signal with noise by typing
soundsc(u,Fs)
4-122
In the spectrogram, you can see the noise signal as a line at about 2800 Hz, which is
equal to 3*Fs/8.
Part 2 Create a Fixed-Point Filter with the Filter Realization Wizard
Next you will create a fixed-point filter using the Filter Realization Wizard. You will
create a filter that reduces the effects of the noise on the signal.
1
Open a new Simulink model, and drag-and-drop a Filter Realization Wizard block
from the Filtering / Filter Implementations library into the model.
Note: You do not have to place a Filter Realization Wizard block in a model in order
to use it. You can open the GUI from within a library. However, for purposes of this
tutorial, we will keep the Filter Realization Wizard block in the model.
4-123
Double-click the Filter Realization Wizard block in your model. The Realize Model
panel of the Filter Design and Analysis Tool (FDATool) appears.
4-124
Click the Set quantization parameters button on the bottom left of FDATool
(
). This brings forward the Set quantization parameters panel of the tool.
4-125
Make sure the Best precision fraction lengths check box is selected on the
Coefficients pane.
The Set quantization parameters panel should appear as follows.
4-126
). This brings
Select the Build model using basic elements check box, then click the Realize
Model button on the bottom of FDATool. A subsystem block for the new filter
appears in your model.
Note: You do not have to keep the Filter Realization Wizard block in the same model
as the generated Filter block. However, for this tutorial, we will keep the blocks in
the same model.
9
Double-click the Filter subsystem block in your model to view the filter
implementation.
Connect a Signal From Workspace block from the Sources library to the input port of
your filter block.
Connect a To Workspace block from the Sinks library to the output port of your filter
block. Your blocks should now be connected as follows.
Open the Signal From Workspace block dialog box and set the Signal parameter to
u. Click OK to save your changes and close the dialog box.
Open the Model Configuration Parameters dialog box from the Simulation
menu of the model. In the Solver pane of the dialog, set the following fields:
Stop time = length(u)-1
Type = Fixed-step
Click OK to save your changes and close the dialog box.
4-128
From the Display menu of the model, select Signals & Ports > Port Data Types.
You can now see that the input to the Filter block is a signal of type double and the
output of the Filter block has a data type of sfix16_En11.
Type
soundsc(yout,Fs)
at the command line to hear the output of the filter. You should hear a voice say
MATLAB. The noise portion of the signal should be close to inaudible.
2
Type
4-129
figure
spectrogram(yout,256,[],[],Fs);colorbar
From the colorbars at the side of the input and output spectrograms, you can see that the
noise has been reduced by about 40 dB.
4-130
Note: You might not be able to directly access some of the supported structures through
the Convert Structure dialog of FDATool. However, you can access all of the structures
by creating a dfilt filter object with the desired structure, and then importing the filter
into FDATool. To learn more about the Import Filter panel, see Importing a Filter
Design in the Signal Processing Toolbox documentation.
Open the Realize Model pane of FDATool by clicking the Realize Model button
in the lower-left corner of FDATool.
Select the desired optimizations in the Optimization region of the Realize Model
pane. See the following descriptions and illustrations of each optimization option.
Optimize delay chainsSubstitute any delay chain made up of n unit delays with
a single delay by n.
Optimize for unity scale valuesRemove all scale value multiplications by 1
from the filter structure.
The following diagram illustrates the results of each of these optimizations.
4-132
From the DSP System Toolbox Filtering>Filter Implementations library, click-anddrag a Discrete FIR Filter block into your model.
Double-click the Discrete FIR Filter block. Set the block parameters as follows, and
then click OK:
Coefficient source = Dialog parameters
Filter structure = Direct form transposed
Coefficients = lopassNum
Input processing = Columns as channels (frame based)
Initial states = 0
Note that you can provide the filter coefficients in several ways:
Type in a variable name from the MATLAB workspace, such as lopassNum.
Type in filter design commands from Signal Processing Toolbox software or DSP
System Toolbox software, such as fir1(5, 0.2, 'low').
Type in a vector of the filter coefficient values.
The Discrete FIR Filter block in your model now represents a lowpass filter. In the next
topic, Implement a Highpass Filter in Simulink on page 4-134, you use a Discrete
FIR Filter block to implement a highpass filter. For more information about the Discrete
FIR Filter block, see the Discrete FIR Filter block reference page. For more information
about designing and implementing a new filter, see Digital Filter Design Block on page
4-111.
4-134
ex_filter_ex1
From the DSP System Toolbox Filtering library, and then from the Filter
Implementations library, click-and-drag a Discrete FIR Filter block into your model.
Double-click the Discrete FIR Filter block. Set the block parameters as follows, and
then click OK:
Coefficient source = Dialog parameters
Filter structure = Direct form transposed
Coefficients = hipassNum
Input processing = Columns as channels (frame based)
Initial states = 0
You can provide the filter coefficients in several ways:
Type in a variable name from the MATLAB workspace, such as hipassNum.
Type in filter design commands from Signal Processing Toolbox software or DSP
System Toolbox software, such as fir1(5, 0.2, 'low').
Type in a vector of the filter coefficient values.
You have now successfully implemented a highpass filter. In the next topic, Filter HighFrequency Noise in Simulink on page 4-135, you use these Discrete FIR Filter blocks
to create a model capable of removing high frequency noise from a signal. For more
information about designing and implementing a new filter, see Digital Filter Design
Block on page 4-111.
4-135
using a uniform random signal, to create high-frequency noise. After you add this noise
to a sine wave, you use the lowpass filter to filter out the high-frequency noise:
1
If you have not already done so, define the lowpass and highpass filter coefficients in
the MATLAB workspace by typing
lopassNum = [-0.0021 -0.0108 -0.0274 -0.0409 -0.0266 ...
0.0374 0.1435 0.2465 0.2896 0.2465 0.1435 0.0374 ...
-0.0266 -0.0409 -0.0274 -0.0108 -0.0021];
hipassNum = [-0.0051 0.0181 -0.0069 -0.0283 -0.0061 ...
0.0549 0.0579 -0.0826 -0.2992 0.5946 -0.2992 -0.0826 ...
0.0579 0.0549 -0.0061 -0.0283 -0.0069 0.0181 -0.0051];
Library
Quantity
Add
Random Source
Sources
Sine Wave
Sources
Time Scope
Sinks
Set the parameters for the rest of the blocks as indicated in the following table. For
any parameters not listed in the table, leave them at their default settings.
Block
Parameter Setting
Add
Random Source
Source type=Uniform
Minimum=0
Maximum=4
Sample mode=Discrete
4-136
Sample time=1/1000
Block
Parameter Setting
Samples per frame=50
Sine Wave
Frequency (Hz)=75
Sample time=1/1000
Samples per frame=50
Time Scope
Connect the blocks as shown in the following figure. You may need to resize some of
your blocks to accomplish this task.
4-137
In the Solver pane, set the parameters as follows, and then click OK:
Start time = 0
Stop time = 5
Type = Fixed-step
Solver = discrete (no continuous states)
After simulation is complete, select View > Legend from the Time Scope menu. The
legend appears in the Time Scope window. You can click-and-drag it anywhere on
the scope display. To change the channel names, double-click inside the legend and
replace the current numbered channel names with the following:
Add = Noisy Sine Wave
Digital Filter Lowpass = Filtered Noisy Sine Wave
Sine Wave = Original Sine Wave
In the next step, you will set the color, style, and marker of each channel.
10 In the Time Scope window, select View > Line Properties, and set the following:
Line
Style
Marker
Color
None
Black
diamond
Red
Blue
4-138
You have now used Discrete FIR Filter blocks to build a model that removes high
frequency noise from a signal. For more information about designing and implementing a
new filter, see Digital Filter Design Block on page 4-111.
4-139
Set the Coefficient source parameter to Input port(s), which enables extra
block input ports for the time-varying filter coefficients.
The Discrete FIR Filter block has a Num port for the numerator coefficients.
The Biquad Filter block has Num and Den ports rather than a single port for
the SOS matrix. Separate ports enable you to use different fraction lengths for
numerator and denominator coefficients. The scale values port, g, is optional.
You can disable the g port by setting Scale values mode to Assume all are
unity and optimize.
2
4-140
For Discrete FIR Filter block, the number of filter taps, N, cannot vary over time.
The input coefficients must be in a 1-by-N vector.
For Biquad Filter block, the number of filter sections, N, cannot vary over
time. The numerator coefficients input, Num, must be a 3-by-N matrix. The
denominator input coefficients, Den, must be a 2-by-N matrix. The scale values
input, g, must be a 1-by-(N+1) vector.
You can use the ss2sos and tf2sos functions from Signal Processing Toolbox software
to convert a state-space or transfer function description of your filter into the secondorder section description used by this block.
4-141
b01
b
02
M
b0 M
b11
b12
M
b1 M
b21
b22
M
b2M
a01
a02
M
a0 M
a11
a12
M
a1M
a21
a22
M
a2M
The block normalizes each row by a1i to ensure a value of 1 for the zero-delay
denominator coefficients.
4-142
Butterworth
Chebyshev I
Chebyshev II
Elliptic
Lowpass
p, Rp
s, Rs
p, Rp, Rs
Highpass
p, Rp
s, Rs
p, Rp, Rs
Bandpass
p1, p2
p1, p2, Rp
s1, s2, Rs
Bandstop
p1, p2
p1, p2, Rp
s1, s2, Rs
The Analog Filter Design block is built on the filter design capabilities of Signal
Processing Toolbox software.
Note: The Analog Filter Design block does not work with the Simulink discrete solver,
which is enabled when the Solver list is set to Discrete (no continuous states)
in the Solver pane of the Model Configuration Parameters dialog box. Select one of
the continuous solvers (such as ode4) instead.
4-144
4-145
4-146
4-147
5
Adaptive Filters
Learn how to design and implement adaptive filters.
Overview of Adaptive Filters and Applications on page 5-2
Adaptive Filters in DSP System Toolbox Software on page 5-9
LMS Adaptive Filters on page 5-12
RLS Adaptive Filters on page 5-30
Signal Enhancement Using LMS and Normalized LMS on page 5-36
Adaptive Filters in Simulink on page 5-45
Selected Bibliography on page 5-59
Adaptive Filters
5-2
Desired Signal
d(k)
Input Signal
x(k)
Output Signal
y(k)
SUM
Error Signal
e(k)
text
Block Diagram That Defines the Inputs and Output of a Generic RLS Adaptive Filter
The next figure provides the general adaptive filter setup with inputs and outputs.
Desired Signal
d(k)
Input Signal
x(k)
Output Signal
y(k)
SUM
Error Signal
e(k)
text
Adapting Algorithm
Block Diagram Defining General Adaptive Filter Algorithm Inputs and Outputs
DSP System Toolbox software includes adaptive filters of a broad range of forms, all of
which can be worthwhile for specific needs. Some of the common ones are:
Adaptive filters based on least mean squares (LMS) techniques, such as
dsp.LMSFilter and dsp.FilteredXLMSFilter
Adaptive filters based on recursive least squares (RLS) techniques, including signdata, sign-error, and sign-sign. See dsp.RLSFilter.
Adaptive filters based on lattice filters. See dsp.AdaptiveLatticeFilter.
Adaptive filters that operate in the frequency domain. See
dsp.FrequencyDomainAdaptiveFilter.
An adaptive filter designs itself based on the characteristics of the input signal to the
filter and a signal that represents the desired behavior of the filter on its input.
5-3
Adaptive Filters
Designing the filter does not require any other frequency response information or
specification. To define the self-learning process the filter uses, you select the adaptive
algorithm used to reduce the error between the output signal y(k) and the desired signal
d(k).
When the LMS performance criterion for e(k) has achieved its minimum value through
the iterations of the adapting algorithm, the adaptive filter is finished and its coefficients
have converged to a solution. Now the output from the adaptive filter matches closely the
desired signal d(k). When you change the input data characteristics, sometimes called
the filter environment, the filter adapts to the new environment by generating a new set
of coefficients for the new data. Notice that when e(k) goes to zero and remains there you
achieve perfect adaptation, the ideal result but not likely in the real world.
The adaptive filter functions in this toolbox implement the shaded portion of the figures,
replacing the adaptive algorithm with an appropriate technique. To use one of the
functions, you provide the input signal or signals and the initial values for the filter.
Adaptive Filters in DSP System Toolbox Software on page 5-9 offers details about
the algorithms available and the inputs required to use them in MATLAB.
Tools Do tools exist that make your filter development process easier? Better tools
can make it practical to use more complex adaptive algorithms.
DSP requirements Can your filter perform its job within the constraints of your
application? Does your processor have sufficient memory, throughput, and time to use
your proposed adaptive filtering approach? Can you trade memory for throughput: use
more memory to reduce the throughput requirements or use a faster signal processor?
Of the preceding considerations, characterizing filter consistency or robustness may be
the most difficult.
The simulations in DSP System Toolbox software offers a good first step in
developing and studying these issues. LMS algorithm filters provide both a relatively
straightforward filters to implement and sufficiently powerful tool for evaluating whether
adaptive filtering can be useful for your problem.
Additionally, starting with an LMS approach can form a solid baseline against which
you can study and compare the more complex adaptive filters available in the toolbox.
Finally, your development process should, at some time, test your algorithm and
adaptive filter with real data. For truly testing the value of your work there is no
substitute for actual data.
System Identification
One common adaptive filter application is to use adaptive filters to identify an unknown
system, such as the response of an unknown communications channel or the frequency
response of an auditorium, to pick fairly divergent applications. Other applications
include echo cancellation and channel identification.
In the figure, the unknown system is placed in parallel with the adaptive filter. This
layout represents just one of many possible structures. The shaded area contains the
adaptive filter system.
5-5
Adaptive Filters
Unknown System
d(k)
+
y(k)
x(k)
Adaptive Filter
text
e(k)
_ SUM
Plain old telephone systems (POTS) commonly use inverse system identification to
compensate for the copper transmission medium. When you send data or voice over
telephone lines, the copper wires behave like a filter, having a response that rolls off at
higher frequencies (or data rates) and having other anomalies as well.
Adding an adaptive filter that has a response that is the inverse of the wire response,
and configuring the filter to adapt in real time, lets the filter compensate for the rolloff
and anomalies, increasing the available frequency output range and data rate for the
telephone system.
y(k)
x(k)
Adaptive Filter
e(k)
_
SUM
Prediction
Predicting signals requires that you make some key assumptions. Assume that the signal
is either steady or slowly varying over time, and periodic over time as well.
5-7
Adaptive Filters
d(k)
+
y(k)
x(k)
s(k)
Delay
Adaptive Filter
e(k)
_
SUM
5-8
Algorithms
For adaptive filter objects, each available algorithm entry appears in one of the tables
along with a brief description of the algorithm. Click on the algorithm in the first column
to get more information about the associated adaptive filter technique.
LMS based adaptive filters
RLS based adaptive filters
Affine projection adaptive filters
Adaptive filters in the frequency domain
Lattice based adaptive filters
Least Mean Squares (LMS) Based FIR Adaptive Filters
Adaptive Filter Method
dsp.BlockLMSFilter
Adaptive Filters
For further information about an adapting algorithm, refer to the reference page for the
algorithm.
Recursive Least Squares (RLS) Based FIR Adaptive Filters
Adaptive Filter Method
dsp.FastTransversalFilter
Fast transversal least-squares adaptation algorithm
Sliding window FTF adaptation algorithm
dsp.RLSFilter
For more complete information about an adapting algorithm, refer to the reference page
for the algorithm.
Affine Projection (AP) FIR Adaptive Filters
Adaptive Filter Method
dsp.AffineProjectionFilter
Affine projection algorithm that uses direct matrix inversion
Affine projection algorithm that uses recursive matrix updating
Block affine projection adaptation algorithm
5-10
To find more information about an adapting algorithm, refer to the reference page for the
algorithm.
FIR Adaptive Filters in the Frequency Domain (FD)
Adaptive Filter Method
dsp.FrequencyDomainAdaptiveFilter
Frequency domain adaptation algorithm
Unconstrained FDAF algorithm for adaptation
For more information about an adapting algorithm, refer to the reference page for the
algorithm.
Lattice-Based (L) FIR Adaptive Filters
Adaptive Filter Method
dsp.AdaptiveLatticeFilter
Gradient adaptive lattice filter adaptation algorithm
Least squares lattice adaptation algorithm
QR decomposition RLS adaptation algorithm
For more information about an adapting algorithm, refer to the reference page for the
algorithm.
Presenting a detailed derivation of the Wiener-Hopf equation and determining solutions
to it is beyond the scope of this User's Guide. Full descriptions of the theory appear in the
adaptive filter references provided in the Selected Bibliography on page 5-59.
5-11
Adaptive Filters
From the figure you see that the filter is indeed lowpass and constrained to 0.2 ripple
in the stopband. With this as the baseline, the adaptive LMS filter examples use the
adaptive LMS algorithms to identify this filter in a system identification role.
To review the general model for system ID mode, look at System Identification on page
5-5 for the layout.
For the sign variations of the LMS algorithm, the examples use noise cancellation as the
demonstration application, as opposed to the system identification application used in
the LMS examples.
Adaptive Filters
The adaptive LMS algorithm to use. You can select the algorithm of your choice by
setting the Method property of dsp.LMSFilter to the desired algorithm.
An unknown system or process to adapt to. In this example, the filter designed by
fircband is the unknown system.
Appropriate input data to exercise the adaptation process. In terms of the generic
LMS model, these are the desired signal d(k) and the input signal x(k).
Start by defining an input signal x.
x = 0.1*randn(250,1);
The input is broadband noise. For the unknown system filter, use fircband to create a
twelfth-order lowpass filter:
[b,err,res] = fircband(12,[0 0.4 0.5 1],[1 1 0 0],[1 0.2],{'w','c'});
Although you do not need them here, include the err and res output arguments.
Now filter the signal through the unknown system to get the desired signal.
d = filter(b,1,x);
With the unknown filter designed and the desired signal in place you construct and apply
the adaptive LMS filter object to identify the unknown.
Preparing the adaptive filter object requires that you provide starting values for
estimates of the filter coefficients and the LMS step size. You could start with estimated
coefficients of some set of nonzero values; this example uses zeros for the 12 initial filter
weights. Set the InitialConditions property of dsp.LMSFilter to the desired initial
values of the filter weights.
For the step size, 0.8 is a reasonable value a good compromise between being large
enough to converge well within the 250 iterations (250 input sample points) and small
enough to create an accurate estimate of the unknown filter.
mu = 0.8;
lms = dsp.LMSFilter(13,'StepSize',mu,'WeightsOutputPort',true);
Finally, using the dsp.LMSFilter object lms, desired signal, d, and the input to
the filter, x, run the adaptive filter to determine the unknown system and plot the
results, comparing the actual coefficients from fircband to the coefficients found by
dsp.LMSFilter.
5-14
[y,e,w] = step(lms,x,d);;
stem([b.' w])
title('System Identification by Adaptive LMS Algorithm')
legend('Actual Filter Weights','Estimated Filter Weights',...
'Location','NorthEast')
As an experiment, try changing the step size to 0.2. Repeating the example with mu =
0.2 results in the following stem plot. The estimated weights fail to approximate the
actual weights closely.
mu = 0.2;
lms = dsp.LMSFilter(13,'StepSize',mu,'WeightsOutputPort',true);
[y,e,w] = step(lms,x,d);
stem([b.' w])
title('System Identification by Adaptive LMS Algorithm')
legend('Actual Filter Weights','Estimated Filter Weights',...
'Location','NorthEast')
5-15
Adaptive Filters
Since this may be because you did not iterate over the LMS algorithm enough times, try
using 1000 samples. With 1000 samples, the stem plot, shown in the next figure, looks
much better, albeit at the expense of much more computation. Clearly you should take
care to select the step size with both the computation required and the fidelity of the
estimated filter in mind.
for index = 1:4
x = 0.1*randn(250,1);
d = filter(b,1,x);
[y,e,w] = step(lms,x,d);
end
stem([b.' w])
title('System Identification by Adaptive LMS Algorithm')
legend('Actual Filter Weights','Estimated Filter Weights',...
'Location','NorthEast')
5-16
5-17
Adaptive Filters
Again d represents the desired signal d(x) as you defined it earlier and b contains the
filter coefficients for your unknown filter.
lms = dsp.LMSFilter(13,'StepSize',mu,'Method',...
'Normalized LMS','WeightsOutputPort',true);
You use the preceding code to initialize the normalized LMS algorithm. For more
information about the optional input arguments, refer to dsp.LMSFilter.
Running the system identification process is a matter of using the dsp.LMSFilter
object with the desired signal, the input signal, and the initial filter coefficients and
conditions specified in s as input arguments. Then plot the results to compare the
adapted filter to the actual filter.
[y,e,w] = step(lms,x,d);
stem([b.' w])
title('System Identification by Normalized LMS Algorithm')
legend('Actual Filter Weights','Estimated Filter Weights',...
'Location','NorthEast')
As shown in the following stem plot (a convenient way to compare the estimated and
actual filter coefficients), the two are nearly identical.
5-18
If you compare the convergence performance of the regular LMS algorithm to the
normalized LMS variant, you see the normalized version adapts in far fewer iterations to
a result almost as good as the nonnormalized version.
lms_normalized = dsp.LMSFilter(13,'StepSize',mu,...
'Method','Normalized LMS','WeightsOutputPort',true);
lms_nonnormalized = dsp.LMSFilter(13,'StepSize',mu,...
'Method','LMS','WeightsOutputPort',true);
[~,e1,~] = step(lms_normalized,x,d);
[~,e2,~] = step(lms_nonnormalized,x,d);
plot([e1,e2]);
title('Comparing the LMS and NLMS Conversion Performance');
legend('NLMS Derived Filter Weights', ...
'LMS Derived Filter Weights','Location', 'NorthEast');
Adaptive Filters
operations are as fast as add operations. Thus some of the impetus for the sign-data
algorithm (and the sign-error and sign-sign variations) has been lost to DSP technology
improvements.
In the standard and normalized variations of the LMS adaptive filter, coefficients for
the adapting filter arise from the mean square error between the desired signal and the
output signal from the unknown system. Using the sign-data algorithm changes the
mean square error calculation by using the sign of the input data to change the filter
coefficients.
When the error is positive, the new coefficients are the previous coefficients plus the
error multiplied by the step size . If the error is negative, the new coefficients are again
the previous coefficients minus the error multiplied by note the sign change.
When the input is zero, the new coefficients are the same as the previous set.
In vector form, the sign-data LMS algorithm is
w( k + 1) = w( k) + m e( k)sgn [ x( k) ] ,
1, x( k) > 0
sgn [ x( k)] = 0, x( k) = 0
1, x( k) < 0
with vector w containing the weights applied to the filter coefficients and vector x
containing the input data. e(k) (equal to desired signal - filtered signal) is the error at
time k and is the quantity the SDLMS algorithm seeks to minimize. (mu) is the step
size.
As you specify mu smaller, the correction to the filter weights gets smaller for each
sample and the SDLMS error falls more slowly. Larger mu changes the weights more for
each step so the error falls more rapidly, but the resulting error does not approach the
ideal solution as closely. To ensure good convergence rate and stability, select mu within
the following practical bounds
0<m<
1
N { InputSignalPower}
where N is the number of samples in the signal. Also, define mu as a power of two for
efficient computing.
5-20
Note How you set the initial conditions of the sign-data algorithm profoundly influences
the effectiveness of the adaptation. Because the algorithm essentially quantizes the input
signal, the algorithm can become unstable easily.
A series of large input values, coupled with the quantization process may result in the
error growing beyond all bounds. You restrain the tendency of the sign-data algorithm to
get out of control by choosing a small step size (<< 1) and setting the initial conditions
for the algorithm to nonzero positive and negative values.
In this noise cancellation example, set dsp.LMSFilter Method property to 'Sign-Data
LMS'. This example requires two input data sets:
Data containing a signal corrupted by noise. In Using an Adaptive Filter to
Remove Noise from an Unknown System, this is d(k), the desired signal. The noise
cancellation process removes the noise, leaving the signal.
Data containing random noise (x(k) in Using an Adaptive Filter to Remove Noise
from an Unknown System) that is correlated with the noise that corrupts the signal
data. Without the correlation between the noise data, the adapting algorithm cannot
remove the noise from the signal.
For the signal, use a sine wave. Note that signal is a column vector of 1000 elements.
signal = sin(2*pi*0.055*[0:1000-1]');
Now, add correlated white noise to signal. To ensure that the noise is correlated, pass
the noise through a lowpass FIR filter, and then add the filtered noise to the signal.
noise = randn(1000,1);
nfilt = fir1(11,0.4); % Eleventh order lowpass filter
fnoise = filter(nfilt,1,noise); % Correlated noise data
d = signal + fnoise;
fnoise is the correlated noise and d is now the desired input to the sign-data algorithm.
To prepare the dsp.LMSFilter object for processing, set the weight initial conditions
(InitialConditions) and mu (StepSize) for the object. As noted earlier in this
section, the values you set for coeffs and mu determine whether the adaptive filter can
remove the noise from the signal path.
In System Identification Using the LMS Algorithm on page 5-13, you constructed
a default filter that sets the filter coefficients to zeros. In most cases that approach does
5-21
Adaptive Filters
not work for the sign-data algorithm. The closer you set your initial filter coefficients to
the expected values, the more likely it is that the algorithm remains well behaved and
converges to a filter solution that removes the noise effectively.
For this example, start with the coefficients in the filter you used to filter the noise
(nfilt), and modify them slightly so the algorithm has to adapt.
coeffs = nfilt.' -0.01; % Set the filter initial conditions.
mu = 0.05;
% Set the step size for algorithm updating.
With the required input arguments for dsp.LMSFilter prepared, construct the LMS
filter object, run the adaptation, and view the results.
lms = dsp.LMSFilter(12,'Method','Sign-Data LMS',...
'StepSize',mu,'InitialConditions',coeffs);
[~,e] = step(lms,noise,d);
L = 200;
plot(0:L-1,signal(1:L),0:L-1,e(1:L));
title('Noise Cancellation by the Sign-Data Algorithm');
legend('Actual Signal','Result of Noise Cancellation',...
'Location','NorthEast');
When dsp.LMSFilter runs, it uses far fewer multiply operations than either of the
LMS algorithms. Also, performing the sign-data adaptation requires only bit shifting
multiplies when the step size is a power of two.
Although the performance of the sign-data algorithm as shown in the next figure is quite
good, the sign-data algorithm is much less stable than the standard LMS variations. In
this noise cancellation example, the signal after processing is a very good match to the
input signal, but the algorithm could very easily grow without bound rather than achieve
good performance.
Changing InitialConditions, mu, or even the lowpass filter you used to create the
correlated noise can cause noise cancellation to fail and the algorithm to become useless.
5-22
sgn [ e(k) ] = 0, e( k) = 0
1, e(k) < 0
5-23
Adaptive Filters
with vector w containing the weights applied to the filter coefficients and vector x
containing the input data. e(k) (equal to desired signal - filtered signal) is the error at
time k and is the quantity the SELMS algorithm seeks to minimize. (mu) is the step
size. As you specify mu smaller, the correction to the filter weights gets smaller for each
sample and the SELMS error falls more slowly.
Larger mu changes the weights more for each step so the error falls more rapidly, but
the resulting error does not approach the ideal solution as closely. To ensure good
convergence rate and stability, select mu within the following practical bounds
0<m<
1
N { InputSignalPower}
where N is the number of samples in the signal. Also, define mu as a power of two for
efficient computation.
Note How you set the initial conditions of the sign-data algorithm profoundly influences
the effectiveness of the adaptation. Because the algorithm essentially quantizes the error
signal, the algorithm can become unstable easily.
A series of large error values, coupled with the quantization process may result in the
error growing beyond all bounds. You restrain the tendency of the sign-error algorithm to
get out of control by choosing a small step size (<< 1) and setting the initial conditions
for the algorithm to nonzero positive and negative values.
In this noise cancellation example, the dsp.LMSFilter object requires two input data
sets:
Data containing a signal corrupted by noise. In Using an Adaptive Filter to
Remove Noise from an Unknown System, this is d(k), the desired signal. The noise
cancellation process removes the noise, leaving the signal.
Data containing random noise (x(k) in Using an Adaptive Filter to Remove Noise
from an Unknown System) that is correlated with the noise that corrupts the signal
data. Without the correlation between the noise data, the adapting algorithm cannot
remove the noise from the signal.
For the signal, use a sine wave. Note that signal is a column vector of 1000 elements.
signal = sin(2*pi*0.055*[0:1000-1]');
5-24
Now, add correlated white noise to signal. To ensure that the noise is correlated, pass
the noise through a lowpass FIR filter, then add the filtered noise to the signal.
noise = randn(1000,1);
nfilt = fir1(11,0.4); % Eleventh order lowpass filter.
fnoise = filter(nfilt,1,noise); % Correlated noise data.
d = signal + fnoise;
fnoise is the correlated noise and d is now the desired input to the sign-data algorithm.
To prepare the dsp.LMSFilter object for processing, set the weight initial conditions
(InitialConditions) and mu (StepSize) for the object. As noted earlier in this
section, the values you set for coeffs and mu determine whether the adaptive filter
can remove the noise from the signal path. In System Identification Using the LMS
Algorithm on page 5-13, you constructed a default filter that sets the filter
coefficients to zeros.
Setting the coefficients to zero often does not work for the sign-error algorithm. The
closer you set your initial filter coefficients to the expected values, the more likely it is
that the algorithm remains well behaved and converges to a filter solution that removes
the noise effectively.
For this example, you start with the coefficients in the filter you used to filter the noise
(nfilt), and modify them slightly so the algorithm has to adapt.
coeffs = nfilt.' -0.01; % Set the filter initial conditions.
mu = 0.05;
% Set step size for algorithm update.
With the required input arguments for dsp.LMSFilter prepared, run the adaptation
and view the results.
lms = dsp.LMSFilter(12,'Method','Sign-Error LMS',...
'StepSize',mu,'InitialConditions',coeffs);
[~,e] = step(lms,noise,d);
L = 200;
plot(0:199,signal(1:200),0:199,e(1:200));
title('Noise Cancellation Performance by the Sign-Error LMS Algorithm');
legend('Actual Signal','Error After Noise Reduction',...
'Location','NorthEast')
When the sign-error LMS algorithm runs, it uses far fewer multiply operations than
either of the LMS algorithms. Also, performing the sign-error adaptation requires only
bit shifting multiplies when the step size is a power of two.
Although the performance of the sign-data algorithm as shown in the next figure is quite
good, the sign-data algorithm is much less stable than the standard LMS variations. In
5-25
Adaptive Filters
this noise cancellation example, the signal after processing is a very good match to the
input signal, but the algorithm could very easily become unstable rather than achieve
good performance.
Changing the weight initial conditions (InitialConditions) and mu (StepSize),
or even the lowpass filter you used to create the correlated noise can cause noise
cancellation to fail and the algorithm to become useless.
In essence, the algorithm quantizes both the error and the input by applying the sign
operator to them.
In vector form, the sign-sign LMS algorithm is
w( k + 1) = w( k) + m sgn [ e( k)] sgn [ x( k) ] ,
1, z(k) > 0
sgn [ z( k) ] = 0, z( k) = 0
1, z( k) < 0
where
1
N { InputSignalPower}
where N is the number of samples in the signal. Also, define mu as a power of two for
efficient computation.
Note How you set the initial conditions of the sign-sign algorithm profoundly influences
the effectiveness of the adaptation. Because the algorithm essentially quantizes the input
signal and the error signal, the algorithm can become unstable easily.
A series of large error values, coupled with the quantization process may result in the
error growing beyond all bounds. You restrain the tendency of the sign-sign algorithm to
get out of control by choosing a small step size (<< 1) and setting the initial conditions
for the algorithm to nonzero positive and negative values.
5-27
Adaptive Filters
In this noise cancellation example, dsp.LMSFilter object requires two input data sets:
Data containing a signal corrupted by noise. In Using an Adaptive Filter to
Remove Noise from an Unknown System, this is d(k), the desired signal. The noise
cancellation process removes the noise, leaving the cleaned signal as the content of
the error signal.
Data containing random noise (x(k) in Using an Adaptive Filter to Remove Noise from
an Unknown System) that is correlated with the noise that corrupts the signal data,
called. Without the correlation between the noise data, the adapting algorithm cannot
remove the noise from the signal.
For the signal, use a sine wave. Note that signal is a column vector of 1000 elements.
signal = sin(2*pi*0.055*[0:1000-1]');
Now, add correlated white noise to signal. To ensure that the noise is correlated, pass
the noise through a lowpass FIR filter, then add the filtered noise to the signal.
noise = randn(1000,1);
nfilt = fir1(11,0.4); % Eleventh order lowpass filter
fnoise = filter(nfilt,1,noise); % Correlated noise data
d = signal + fnoise;
fnoise is the correlated noise and d is now the desired input to the sign-data algorithm.
To prepare the dsp.LMSFilter object for processing, set the weight initial conditions
(InitialConditions) and mu (StepSize) for the object. As noted earlier in this
section, the values you set for coeffs and mu determine whether the adaptive filter
can remove the noise from the signal path. In System Identification Using the LMS
Algorithm on page 5-13, you constructed a default filter that sets the filter
coefficients to zeros. Usually that approach does not work for the sign-sign algorithm.
The closer you set your initial filter coefficients to the expected values, the more likely
it is that the algorithm remains well behaved and converges to a filter solution that
removes the noise effectively. For this example, you start with the coefficients in the
filter you used to filter the noise (nfilt), and modify them slightly so the algorithm has
to adapt.
coeffs = nfilt.' -0.01; % Set the filter initial conditions.
mu = 0.05;
% Set the step size for algorithm updating.
With the required input arguments for dsp.LMSFilter prepared, run the adaptation
and view the results.
5-28
When dsp.LMSFilter runs, it uses far fewer multiply operations than either of the
LMS algorithms. Also, performing the sign-sign adaptation requires only bit shifting
multiplies when the step size is a power of two.
Although the performance of the sign-sign algorithm as shown in the next figure is quite
good, the sign-sign algorithm is much less stable than the standard LMS variations. In
this noise cancellation example, the signal after processing is a very good match to the
input signal, but the algorithm could very easily become unstable rather than achieve
good performance.
Changing the weight initial conditions (InitialConditions) and mu (StepSize),
or even the lowpass filter you used to create the correlated noise can cause noise
cancellation to fail and the algorithm to become useless.
As an aside, the sign-sign LMS algorithm is part of the international CCITT standard for
32 Kb/s ADPCM telephony.
5-29
Adaptive Filters
When the LMS algorithm looks at the error to minimize, it considers only the current
error value. In the RLS method, the error considered is the total error from the beginning
to the current data point.
Said another way, the RLS algorithm has infinite memory all error data is given the
same consideration in the total error. In cases where the error value might come from a
spurious input data point or points, the forgetting factor lets the RLS algorithm reduce
the value of older error data by multiplying the old data by the forgetting factor.
Since 0 < 1, applying the factor is equivalent to weighting the older error. When = 1,
all previous error is considered of equal weight in the total error.
As approaches zero, the past errors play a smaller role in the total. For example, when
= 0.9, the RLS algorithm multiplies an error value from 50 samples in the past by an
attenuation factor of 0.950 = 5.15 x 10-3, considerably deemphasizing the influence of the
past error on the current total error.
Unknown System
d(k)
+
y(k)
x(k)
Adaptive Filter
text
e(k)
_ SUM
Cascading the adaptive filter with the unknown filter causes the adaptive filter to
converge to a solution that is the inverse of the unknown system.
If the transfer function of the unknown is H(z) and the adaptive filter transfer function
is G(z), the error measured between the desired signal and the signal from the cascaded
5-31
Adaptive Filters
system reaches its minimum when the product of H(z) and G(z) is 1, G(z)*H(z) = 1. For
this relation to be true, G(z) must equal 1/H(z), the inverse of the transfer function of the
unknown system.
To demonstrate that this is true, create a signal to input to the cascaded filter pair.
x = randn(3000,1);
In the cascaded filters case, the unknown filter results in a delay in the signal arriving at
the summation point after both filters. To prevent the adaptive filter from trying to adapt
to a signal it has not yet seen (equivalent to predicting the future), delay the desired
signal by 32 samples, the order of the unknown system.
Generally, you do not know the order of the system you are trying to identify. In that
case, delay the desired signal by the number of samples equal to half the order of the
adaptive filter. Delaying the input requires prepending 12 zero-values samples to x.
delay = zeros(12,1);
d = [delay; x(1:2988)]; % Concatenate the delay and the signal.
You have to keep the desired signal vector d the same length as x, hence adjust the
signal element count to allow for the delay samples.
Although not generally true, for this example you know the order of the unknown filter,
so you add a delay equal to the order of the unknown filter.
For the unknown system, use a lowpass, 12th-order FIR filter.
ufilt = fir1(12,0.55,'low');
Filtering x provides the input data signal for the adaptive algorithm function.
xdata = filter(ufilt,1,x);
To set the RLS algorithm, instatiate a dsp.RLSFilter object and set its Length,
ForgettingFactor, and InitialInverserCovariance properties.
For more information about the input conditions to prepare the RLS algorithm object,
refer to dsp.RLSFilter.
p0 = 2 * eye(13);
lambda = 0.99;
5-32
rls = dsp.RLSFilter(13,'ForgettingFactor',lambda,...
'InitialInverseCovariance',p0);
Most of the process to this point is the same as the preceding examples. However, since
this example seeks to develop an inverse solution, you need to be careful about which
signal carries the data and which is the desired signal.
Earlier examples of adaptive filters use the filtered noise as the desired signal. In this
case, the filtered noise (xdata) carries the unknown system information. With Gaussian
distribution and variance of 1, the unfiltered noise d is the desired signal. The code to
run this adaptive filter example is
[y,e] = step(rls,xdata,d);
where y returns the filtered output and e contains the error signal as the filter adapts
to find the inverse of the unknown system. To view the estimated coefficient of the RLS
filter, type rls.Coefficients.
The next figure presents the results of the adaptation. In the figure, the magnitude
response curves for the unknown and adapted filters show. As a reminder, the unknown
filter was a lowpass filter with cutoff at 0.55, on the normalized frequency scale from 0 to
1.
5-33
Adaptive Filters
Magnitude (dB)
50
50
100
Inverse Filter
Unknown System
150
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
0.9
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
0.9
Phase (degrees)
200
400
600
800
1000
1200
Viewed alone (refer to the following figure), the inverse system looks like a fair
compensator for the unknown lowpass filter a high pass filter with linear phase.
5-34
Magnitude (dB)
30
20
10
0
10
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
0.9
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Normalized Frequency ( rad/sample)
0.8
0.9
Phase (degrees)
200
400
600
800
1000
1200
5-35
Adaptive Filters
a noisy signal that contains both the desired signal and an added noise component.
Generate the Noise Signal
To create a noise signal, assume that the noise v1 is autoregressive, meaning that
the value of the noise at time t depends only on its previous values and on a random
disturbance.
v = 0.8*randn(1000,1); % Random noise part.
ar = [1,1/2];
% Autoregression coefficients.
v1 = filter(1,ar,v);
% Noise signal. Applies a 1-D digital
% filter.
where s is the desired signal and the noise is v1. Adaptive filter processing seeks to
recover s from x by removing v1. To complete the signals needed to perform adaptive
filtering, the adaptation process requires a reference signal.
Create a Reference Signal
Define a moving average signal v2 that is correlated with v1. This v2 is the reference
signal for the examples.
ma = [1, -0.8, 0.4 , -0.2];
v2 = filter(ma,1,v);
5-37
Adaptive Filters
If you know the step size to use, you can set the step size value when you create the
object. For example,
5-38
lms = dsp.LMSFilter(L,'Method','LMS','StepSize',0.2);
5-39
Adaptive Filters
As a reference point, include the noisy signal as a dotted line in the plot.
hold on
plot(n(900:end),x(900:end),'k:')
xlabel('Time index (n)');
ylabel('Amplitude');
hold off
5-40
0.8879
0.1359
0.0036
0.0023
0.0810
0.0184
-0.0001
1.0712
0.4070
0.1539
0.0549
0.1098
0.0521
0.0041
5-41
Adaptive Filters
If you do not reset the filter object, the filter uses the final states and coefficients from
the previous run as the initial conditions for the next run and set of data.
5-42
msenlms = msesim(nlms,v2,x,M);
plot(1:M:n(end),[mselms,msenlms])
legend('LMS learning curve','NLMS learning curve')
xlabel('Time index (n)');
ylabel('MSE');
In the next plot you see the calculated learning curves for the LMS and NLMS adaptive
filters.
5-43
Adaptive Filters
[mmselms,emselms,meanwlms,pmselms] = msepred(lms,v2,x,M);
plot(1:M:n(end),[mmselms*ones(500,1),emselms*ones(500,1),...
pmselms,mselms])
legend('MMSE','EMSE','predicted LMS learning curve',...
'LMS learning curve')
xlabel('Time index (n)');
ylabel('MSE');
5-44
5-45
Adaptive Filters
Copy and paste the subsystem called Acoustic Environment into a new model.
5-46
block is added to signal coming from a .wav file to produce the signal sent to the
Pilot's Mic output port.
You have now created an acoustic environment. In the following topics, you use this
acoustic environment to produce a model capable of adaptive noise cancellation.
From the DSP System Toolbox Filtering library, and then from the Adaptive Filters
library, click-and-drag an LMS Filter block into the model that contains the Acoustic
Environment subsystem.
Double-click the LMS Filter block. Set the block parameters as follows, and then
click OK:
Algorithm = Normalized LMS
Filter length = 40
Step size (mu) = 0.002
Leakage factor (0 to 1) = 1
The block uses the normalized LMS algorithm to calculate the forty filter
coefficients. Setting the Leakage factor (0 to 1) parameter to 1 means that the
current filter coefficient values depend on the filter's initial conditions and all of the
previous input values.
Adaptive Filters
5-48
Block
Library
Quantity
Constant
Simulink/Sources
Manual Switch
Simulink/Signal Routing
Terminator
Simulink/Sinks
Downsample
Signal Operations
To Audio Device
Sinks
Waterfall Scope
Sinks
Connect the blocks so that your model resembles the following figure.
Double-click the Constant block. Set the Constant value parameter to 0 and then
click OK.
5-49
Adaptive Filters
The filter weights are being updated so often that there is very little change from one
update to the next. To see a more noticeable change, you need to downsample the
output from the Wts port.
8
Double-click the Waterfall Scope block. The Waterfall scope window opens.
5-50
5-51
Adaptive Filters
14 In the model window, from the Simulation menu, select Model Configuration
Parameters. In the Select pane, click Solver. Set the parameters as follows, and
then click OK:
Stop time = inf
Type = Fixed-step
Solver = Discrete (no continuous states)
15 Run the simulation and view the results in the Waterfall scope window. You can
also listen to the simulation using the speakers attached to your computer.
16 Experiment with changing the Manual Switch so that the input to the Acoustic
Environment subsystem is either 0 or 1.
When the value is 0, the Gaussian noise in the signal is being filtered by a lowpass
filter. When the value is 1, the noise is being filtered by a bandpass filter. The
adaptive filter can remove the noise in both cases.
5-52
You have now created a model capable of adaptive noise cancellation. The adaptive filter
in your model is able to filter out both low frequency noise and noise within a frequency
range. In the next topic, Modify Adaptive Filter Parameters During Model Simulation
on page 5-53, you modify the LMS Filter block and change its parameters during
simulation.
Double-click the LMS filter block. Set the block parameters as follows, and then click
OK:
Specify step size via = Input port
Initial value of filter weights = 0
Select the Adapt port check box.
Reset port = Non-zero sample
The Block Parameters: LMS Filter dialog box should now look similar to the
following figure.
5-53
Adaptive Filters
Step-size, Adapt, and Reset ports appear on the LMS Filter block.
3
5-54
Block
Library
Quantity
Constant
Simulink/Sources
Manual Switch
Simulink/Signal Routing
5-55
Adaptive Filters
5-56
Double-click the Constant2 block. Set the block parameters as follows, and then click
OK:
Constant value = 0.002
Select the Interpret vector parameters as 1-D check box.
Sample time (-1 for inherited) = inf
Output data type mode = Inherit via back propagation
Double-click the Constant3 block. Set the block parameters as follows, and then click
OK:
Constant value = 0.04
Select the Interpret vector parameters as 1-D check box.
Sample time (-1 for inherited) = inf
Output data type mode = Inherit via back propagation
Double-click the Constant4 block. Set the Constant value parameter to 0 and then
click OK.
Double-click the Constant6 block. Set the Constant value parameter to 0 and then
click OK.
In the model window, from the Display menu, point to Signals & Ports, and select
Wide Nonscalar Lines and Signal Dimensions.
Adaptive Filters
You can see that the system reaches steady state faster when the step size is larger.
15 Double-click the Manual Switch3 block so that the input to the Reset port is 1.
The block resets the filter weights to their initial values. In the Block Parameters:
LMS Filter dialog box, from the Reset port list, you chose Non-zero sample. This
means that any nonzero input to the Reset port triggers a reset operation.
You have now experimented with adaptive noise cancellation using the LMS Filter
block. You adjusted the parameters of your adaptive filter and viewed the effects of your
changes while the model was running.
For more information about adaptive filters, see the following block reference pages:
LMS Filter
RLS Filter
Block LMS Filter
Fast Block LMS Filter
lmsadeq
lmsadtde
5-58
rlsdemo
Selected Bibliography
Selected Bibliography
[1] Hayes, Monson H., Statistical Digital Signal Processing and Modeling, John Wiley &
Sons, 1996, 493552.
[2] Haykin, Simon, Adaptive Filter Theory, Prentice-Hall, Inc., 1996
5-59
6
Multirate and Multistage Filters
Learn how to analyze, design, and implement multirate and multistage filters in
MATLAB and Simulink.
Multirate Filters on page 6-2
Multistage Filters on page 6-6
Example Case for Multirate/Multistage Filters on page 6-7
Filter Banks on page 6-11
Multirate Filtering in Simulink on page 6-19
Multirate Filters
In this section...
Why Are Multirate Filters Needed? on page 6-2
Overview of Multirate Filters on page 6-2
6-2
Multirate Filters
If you start with the top signal, sampled at a frequency Fs, then the bottom signal is
sampled at Fs/2 frequency. In this case, the decimation factor, or M, is 2.
The following figure illustrates effect of decimation in the frequency domain.
In the first graphic in the figure you can see a signal that is critically sampled, i.e.
the sample rate is equal to two times the highest frequency component of the sampled
6-3
signal. As such the period of the signal in the frequency domain is no greater than
the bandwidth of the sampling frequency. When reduce the sampling frequency
(decimation), aliasing can occur, where the magnitudes at the frequencies near the
edges of the original period become indistinguishable, and the information about these
values becomes lost. To work around this problem, the signal can be filtered before the
decimation process, avoiding overlap of the signal spectra at Fs/2.
Multirate Filters
When decimating, you should apply the filter first, then perform the decimation.
When interpolating a signal, you should interpolate first, then filter the signal.
Typically in decimation of a signal a filter is applied first, thereby allowing decimation
without aliasing, as shown in the following figure:
6-5
Multistage Filters
In this section...
Why Are Multistage Filters Needed? on page 6-6
Optimal Multistage Filters in DSP System Toolbox on page 6-6
6-6
Example Overview
This example shows the efficiency gains that are possible when using multirate and
multistage filters for certain applications. In this case a distinct advantage is achieved
over regular linear-phase equiripple design when a narrow transition-band width is
required. A more detailed treatment of the key points made here can be found in the
example entitled Efficient Narrow Transition-Band FIR Filter Design.
=
=
=
=
0.13;
0.14;
0.001;
0.0005;
%
%
%
%
Passband
Stopband
Passband
Stopband
edge
edge
ripple, 0.0174 dB peak to peak
ripple, 66.0206 dB minimum attenuation
Hf = fdesign.lowpass(Fpass,Fstop,Rpass,Rstop,'linear');
When you determine the cost of this design, you can see that 695 multipliers are
required.
cost(Hd)
6-7
You can then view the cost of the filter created using this design step, and you can see
that a significant cost advantage has been achieved.
cost(Hd_multi)
6-8
Notice that the stopband attenuation for the multistage design is about twice that of the
other designs. This is because the decimators must attenuate out-of-band components
by 66 dB in order to avoid aliasing that would violate the specifications. Similarly, the
interpolators must attenuate images by 66 dB. You can also see that the passband gain
for this design is no longer 0 dB, because each interpolator has a nominal gain (in linear
units) equal to its interpolation factor, and the total interpolation factor for the three
interpolators is 6.
=
=
=
=
0:1799;
sin(0.1*pi*n') + 2*sin(0.15*pi*n');
filter(Hd,x);
filter(Hd_multi,x);
6-9
[Pxx,w]
= periodogram(x);
Pyy
= periodogram(y);
Pyy_multi = periodogram(y_multi);
plot(w/pi,10*log10([Pxx,Pyy,Pyy_multi]));
xlabel('Normalized Frequency (x\pi rad/sample)');
ylabel('Power density (dB/rad/sample)');
legend('Input signal PSD','Equiripple output PSD',...
'Multirate/multistage output PSD')
axis([0 1 -50 30])
grid on
6-10
Filter Banks
Filter Banks
Multirate filters alter the sample rate of the input signal during the filtering process.
Such filters are useful in both rate conversion and filter bank applications.
The Dyadic Analysis Filter Bank block decomposes a broadband signal into a collection of
subbands with smaller bandwidths and slower sample rates. The Dyadic Synthesis Filter
Bank block reconstructs a signal decomposed by the Dyadic Analysis Filter Bank block.
To use a dyadic synthesis filter bank to perfectly reconstruct the output of a dyadic
analysis filter bank, the number of levels and tree structures of both filter banks must
be the same. In addition, the filters in the synthesis filter bank must be designed
to perfectly reconstruct the outputs of the analysis filter bank. Otherwise, the
reconstruction will not be perfect.
Each unit consists of a lowpass (LP) and highpass (HP) FIR filter pair, followed by a
decimation by a factor of 2. The filters are halfband filters with a cutoff frequency of
Fs/4, a quarter of the input sampling frequency. Each filter passes the frequency band
that the other filter stops.
The unit decomposes its input into adjacent high-frequency and low-frequency subbands.
Compared to the input, each subband has half the bandwidth (due to the half-band
filters) and half the sample rate (due to the decimation by 2).
Note The following figures illustrate the concept of a filter bank, but not how the block
implements a filter bank; the block uses a more efficient polyphase implementation.
6-11
6-12
Filter Banks
6-13
The following table summarizes the key characteristics of the symmetric and asymmetric
dyadic analysis filter bank.
Notable Characteristics of Asymmetric and Symmetric Dyadic Analysis Filter Banks
Characteristic
N-Level Symmetric
N-Level Asymmetric
Number of Output
Subbands
n+1
2n
Bandwidth and
For an input with
For an input with bandwidth BW and N samples,
yk has the bandwidth BWk, and Nk samples,
Number of Samples bandwidthBW
in Output Subbands and N samples,
where
all outputs have
bandwidthBW/2n and
BW / 2k (1 k n)
n
BW
=
k
N/2 samples.
n
(k = n + 1)
BW / 2
N / 2 k (1 k n)
Nk =
n
( k = n + 1)
N / 2
6-14
si ) (k = n + 1)
Filter Banks
Characteristic
N-Level Symmetric
N-Level Asymmetric
Due to the decimations by 2, the sample period of
each subband (except the last) is twice that of the
previous subband. The last two subbands have
the same sample period since they originate from
the same level in the filter bank.
Total Number of
Output Samples
The total number of samples in all of the output subbands is equal to the
number of samples in the input (due to the of decimations by2 at each
level).
Wavelet
Applications
Each unit consists of a lowpass (LP) and highpass (HP) FIR filter pair, preceded by an
interpolation by a factor of 2. The filters are halfband filters with a cutoff frequency of
Fs/4, a quarter of the input sampling frequency. Each filter passes the frequency band
that the other filter stops.
The unit takes in adjacent high-frequency and low-frequency subbands, and reconstructs
them into a wide-band signal. Compared to each subband input, the output has twice the
bandwidth and twice the sample rate.
Note The following figures illustrate the concept of a filter bank, but not how the block
implements a filter bank; the block uses a more efficient polyphase implementation.
6-15
6-16
Filter Banks
N-Level Symmetric
N-Level Asymmetric
Input Paths
Through the
Filter Bank
Characteristic
N-Level Symmetric
N-Level Asymmetric
Number of Input
Subbands
n+1
Bandwidth
and Number of
Samples in Input
Subbands
BW / 2k
BWk =
n
BW / 2
(1 k n)
(k = n + 1)
N / 2 k (1 k n)
Nk =
n
( k = n + 1)
N / 2
Input Sample
Periods
The number of samples in the output is always equal to the total number of
samples in all of the input subbands.
Wavelet
Applications
6-18
Description
Audio Sample
Rate Conversion
Sigma-Delta A/D
Converter
Wavelet
Reconstruction
and Noise
Reduction
dspwavelet
6-19
7
Transforms, Estimation, and Spectral
Analysis
Learn about transforms, estimation and spectral analysis.
Transform Time-Domain Data into Frequency Domain on page 7-2
Transform Frequency-Domain Data into Time Domain on page 7-7
Linear and Bit-Reversed Output Order on page 7-12
Calculate Channel Latencies Required for Wavelet Reconstruction on page 7-14
Spectral Analysis on page 7-23
Power Spectrum Estimates on page 7-24
Spectrograms on page 7-35
7-2
Double-click the Sine Wave block. The Block Parameters: Sine Wave dialog box
opens.
7-3
Save these parameters and close the dialog box by clicking OK.
Double-click the Matrix Sum block. The Block Parameters: Matrix Sum dialog
box opens.
Set the Sum over parameter to Specified dimension and the Dimension
parameter to 2. Click OK to save your changes.
Because each column represents a different signal, you need to sum along the
individual rows in order to add the values of the sinusoids at each time step.
7-4
You have now transformed two sinusoidal signals from the time domain to the
frequency domain.
Note that the sequence of FFT, Complex to Magnitude-Angle, and Vector Scope blocks
could be replaced by a single Spectrum Analyzer block, which computes the magnitude
FFT internally. Other blocks that compute the FFT internally are the blocks in the
7-5
Power Spectrum Estimation library. See Spectral Analysis on page 7-23 for more
information about these blocks.
7-6
7-7
Double-click the Sine Wave block. The Block Parameters: Sine Wave dialog box
opens.
7-8
Based on these parameters, the Sine Wave block outputs two sinusoidal signals with
identical amplitudes, phases, and sample times. One sinusoid oscillates at 15 Hz and
the other at 40 Hz.
4
Save these parameters and close the dialog box by clicking OK.
Double-click the Matrix Sum block. The Block Parameters: Matrix Sum dialog
box opens.
Set the Sum over parameter to Specified dimension and the Dimension
parameter to 2. Click OK to save your changes.
Because each column represents a different signal, you need to sum along the
individual rows in order to add the values of the sinusoids at each time step.
Double-click the FFT block. The Block Parameters: FFT dialog box opens.
Select the Output in bit-reversed order check box., and then click OK.
Double-click the IFFT block. The Block Parameters: IFFT dialog box opens.
7-9
The flat line on the scope suggests that there is no difference between the original
signal and the estimate of the original signal. Therefore, the IFFT block has
accurately reconstructed the original time-domain signal from the frequency-domain
input.
14 Right-click in the Vector Scope window, and select Autoscale.
7-10
In actuality, the two signals are identical to within round-off error. The previous
figure shows the enlarged trace. The differences between the two signals is on the
order of 10-15.
7-11
Translate the indices into their binary representation with the minimum number
of bits. In this example, the minimum number of bits is three because the binary
representation of 7 is 111.
Find the mirror image of each binary entry, and write it beside the original binary
representation.
7-12
The next diagram illustrates the linear and bit-reversed outputs of the FFT block. The
output values are the same, but they appear in different order.
7-13
7-14
Before you can begin calculating the latencies required for perfect wavelet reconstruction,
you must know the types of filters being used in your model.
The Dyadic Analysis Filter Bank and the Dyadic Synthesis Filter Bank blocks in the
ex_wavelets model have the following settings:
Filter = Biorthogonal
Filter order [synthesis/analysis] = [3/5]
Number of levels = 3
Tree structure = Asymmetric
Input = Multiple ports
Based on these settings, the Dyadic Analysis Filter Bank and the Dyadic Synthesis Filter
Bank blocks construct biorthogonal filters using the Wavelet Toolbox wfilters function.
7-15
7-16
Note: Repeat this procedure to analyze the group delay of each of the filters in your
model. This section does not show the results for each filter in the ex_wavelets model
because all wavelet filters in this particular example have the same group delay.
7-17
F1
F0
F1
F0
F0
F1
F0
F0
F0
G1
Path 4
G1
G0
Path 3
G1
G0
G0
Path 2
G0
G0
G0
Path 1
Delay M
The extra delay values of M and N on paths 3 and 4 in the previous figure ensure that
the total delay on each of the four filter paths is identical.
Equivalent to
z-1
z-1
z-2
Equivalent to
You can apply the Noble identities by summing the delay on each signal path from right
to left. The first Noble identity indicates that moving a delay of 1 before a downsample of
2 is equivalent to multiplying that delay value by 2. Similarly, the second Noble identity
indicates that moving a delay of 2 before an upsample of 2 is equivalent to dividing that
delay value by 2.
The fvtool analysis in step 1 found that both the low- and high-pass filters of the
analysis filter bank have the same group delay (F0 = F1 = 5.5). Thus, you can use F to
represent the group delay of the analysis filter bank. Similarly, the group delay of the
low- and high-pass filters of the synthesis filter bank is the same (G0=G1=5.5), so you can
use G to represent the group delay of the synthesis filter bank.
The following figure shows the filter bank system with the intermediate delay sums
displayed below each path.
7-19
2N+(F+G)
Delay N
2N+G
F
N+0.5G
2
7(F+G)
6F+7G
F
7(F+G)
3F+3.5G
2
6F+7G
3F+3.5G
0.5G
Delay M
0.75G
2
0.875G
2
0.875G
1.75G
2
1.75G
1.5G
0.75G
0.5G
1.5G
Path 3
Path 2
Path 1
1.5G
G
2
0.5G
G
0.75G
Path 4
G
2
M+0.75G
G
2
0.5G
You can see from the previous figure that the signal delays on paths 1 and 2 are
identical: 7(F+G). Because each path of the filter bank system has identical delay, you
can equate the delay equations for paths 3 and 4 with the delay equation for paths 1 and
2. After constructing these equations, you can solve for M and N, respectively:
Path 3 = Path 1 fi 4 M + 3 ( F + G) = 7( F + G)
fi M = F + G
Path 4 = Path 1 fi 2 N + ( F + G) = 7( F + G )
fi N = 3( F + G)
The fvtool analysis in step 1 found the group delay of each biorthogonal wavelet filter
in this model to be 5.5 samples. Therefore, F = 5.5 and G = 5.5. By inserting these values
into the two previous equations, you get M = 11 and N = 33. Because the total delay on
each filter path must be the same, you can find the overall delay of the filter bank system
by inserting F = 5.5 and G = 5.5 into the delay equation for any of the four filter paths.
Inserting the values of F and G into 7(F+G) yields an overall delay of 77 samples for the
filter bank system of the ex_wavelets model.
7-20
After you run the model, examine the reconstruction error in the Difference scope. To
further examine any particular areas of interest, use the zoom tools available on the
toolbar of the scope window or from the View menu.
7-21
References
[1] Strang, G. and Nguyen, T. Wavelets and Filter Banks. Wellesley, MA: WellesleyCambridge Press, 1996.
7-22
Spectral Analysis
Spectral Analysis
The Power Spectrum Estimation library provides a number of blocks for spectral
analysis. Many of them have correlates in Signal Processing Toolbox software, which are
shown in parentheses:
Burg Method (pburg)
Covariance Method (pcov)
Magnitude FFT (periodogram)
Modified Covariance Method (pmcov)
Short-Time FFT
Yule-Walker Method (pyulear)
See Spectral Analysis in the Signal Processing Toolbox documentation for an overview
of spectral analysis theory and a discussion of the above methods.
DSP System Toolbox software provides two examples that illustrate the spectral analysis
blocks:
A Comparison of Spectral Analysis Techniques (dspsacomp)
Spectral Analysis: Short-Time FFT (dspstfft)
7-23
Add the following blocks to your model. Subsequent topics describe how to use these
blocks.
7-24
Block
Library
Sources
Buffer
Periodogram
Vector Scope
Sinks
Once you have assembled the blocks needed to calculate the power spectrum of your
speech signal, you can set the block parameters.
If the model you created in Create the Block Diagram on page 7-24 is not open
on your desktop, you can open an equivalent model by typing
ex_gstut9
Load the speech signal into the MATLAB workspace by typing load mtlb at
the MATLAB command prompt. This speech signal is a woman's voice saying
MATLAB.
7-25
Use the Signal From Workspace block to import the speech signal from the MATLAB
workspace into your Simulink model. Open the Signal From Workspace dialog box by
double-clicking the block. Set the block parameters as follows:
Signal = mtlb
Sample time = 1/8000
Samples per frame = 80
Form output after final data value by = Setting to zero
Once you are done setting these parameters, the Signal From Workspace dialog box
should look similar to the figure below. Click OK to apply your changes.
7-26
Use the Buffer block to buffer the input signal into frames that contain 128 samples.
Open the Buffer dialog box by double-clicking the block. Set the block parameters as
follows:
Output buffer size (per channel) = 128
Buffer overlap = 48
Initial conditions = 0
Treat Mx1 and unoriented sample-based signals as = One channel
Once you are done setting these parameters, the Buffer dialog box should look
similar to the figure below. Click OK to apply your changes.
7-27
Based on these parameters, the first output frame contains 48 initial condition
values followed by the first 80 samples from the first input frame. The second output
frame contains the last 48 values from the previous frame followed by the second 80
samples from the second input frame, and so on. You are buffering your input signal
into an output signal with 128 samples per frame to minimize the estimation noise
added to your signal. Because 128 is a power of 2, this operation also enables the
Periodogram block to perform an FFT on the signal.
5
7-28
Based on these parameters, the block applies a Hamming window periodically to the
input speech signal and averages two spectra at one time. The length of the FFT is
assumed to be 128, which is the number of samples per frame being output from the
Buffer block.
6
Use the Vector Scope block to view the power spectrum of the speech signal. Open
the Vector Scope dialog box by double-clicking the block. Set the block parameters as
follows:
Input domain = Frequency
Click the Axis Properties tab.
Clear the Inherit sample time from input check box.
7-29
7-30
7-31
Because you are buffering the input with a nonzero overlap, you have altered the
sample time of the signal. As a result, you need to specify the sample time of the
original time series. Otherwise, the overlapping buffer samples lead the block to
believe that the sample time is shorter than it actually is.
After you have set the block parameter values, you can calculate and view the power
spectrum of the speech signal.
If the model you created in Set the Model Parameters on page 7-25 is not open
on your desktop, you can open an equivalent model by typing
ex_gstut10
Set the configuration parameters. Open the Configuration Parameters dialog box by
selecting Model Configuration Parameters from the Simulation menu. Select
Solver from the menu on the left side of the dialog box, and set the parameters as
follows:
Stop time = 0.5
Type = Fixed-step
Solver = Discrete (no continuous states)
7-32
Apply these parameters and close the Configuration Parameters dialog box by
clicking OK. These parameters are saved only when you save your model.
If you have not already done so, load the speech signal into the MATLAB workspace
by typing load mtlb.
Run the model to open the Vector Scope window. The data is not immediately visible
at the end of the simulation. To autoscale the y-axis to fit the data, in the Vector
Scope window, right-click and choose Autoscale. The following figure shows the
data displayed in the Vector Scope window.
7-33
During the simulation, the Vector Scope window displays a series of frames output from
the Periodogram block. Each of these frames corresponds to a window of the original
speech signal. The data in each frame represents the power spectrum, or contribution of
every frequency to the power of the original speech signal, for a given window.
In the next section, Spectrograms on page 7-35, you use these power spectra to
create a spectrogram of the speech signal.
7-34
Spectrograms
Spectrograms
In this section...
Modify the Block Diagram on page 7-35
Set the Model Parameters on page 7-37
View the Spectrogram of the Speech Signal on page 7-41
If the model you created in View the Power Spectrum Estimates on page 7-32 is not
open on your desktop, you can open an equivalent model by typing
ex_gstut11
7-35
7-36
Add the following blocks to your model. Subsequent topics describe how to use these
blocks.
Block
Library
Selector
dB Conversion
Buffer
Reshape
Matrix Viewer
Sinks
Connect the blocks as shown in the figure below. These blocks extract the positive
frequencies of each power spectrum and concatenate them into a matrix that
represents the spectrogram of the speech signal.
Spectrograms
Once you have assembled the blocks needed to view the spectrogram of your speech
signal, you can set the block parameters.
If the model you created in Modify the Block Diagram on page 7-35 is not open
on your desktop, you can open an equivalent model by typing
ex_gstut12
Use the Selector block to extract the first 64 elements, or the positive frequencies, of
each power spectrum. Open the Selector dialog box by double-clicking the block. Set
the block parameters as follows:
Number of input dimensions = 1
7-37
The dB Conversion block converts the magnitude of the input FFT signal to decibels.
Leave this block at its default parameters.
Use the Buffer1 block to buffer up the individual power spectrums. Open the Buffer1
dialog box by double-clicking the block. Set the block parameters as follows:
Output buffer size (per channel) = 64*48
Buffer overlap = 64*46
7-38
Spectrograms
Setting the value of the Buffer overlap parameter slightly less than the value of
the Output buffer size (per channel) parameter ensures that your spectrogram
represents smooth movement through time. The Initial conditions parameter
represents the initial values in the buffer; -70 represents silence.
5
Use the Reshape block to reshape the input signal into a 64-by-48 matrix. To do so,
set the Output dimensionality to Customize and the Output dimensions to [64
48].
The Matrix Viewer enables you to view the spectrogram of the speech signal. Open
the Matrix Viewer dialog box by double-clicking the block. Set the block parameters
as follows:
Click the Image Properties tab.
7-39
Spectrograms
In this case, you are assuming that the power spectrum values do not exceed -65 dB.
Once you are done setting these parameters, the Axis Properties pane should look
similar to the figure below. To apply your changes, click OK.
After you have set the parameter values, you can calculate and view the spectrogram of
the speech signal.
If the model you created in Set the Model Parameters on page 7-37 is not open
on your desktop, you can open an equivalent model by typing
7-41
ex_gstut13
7-42
Run the model. During the simulation, the Vector Scope window displays a sequence
of power spectrums, one for each window of the original speech signal. The power
spectrum is the contribution of every frequency to the power of the speech signal.
Spectrograms
The Matrix Viewer window, shown below, displays the spectrogram of the speech
signal. This spectrogram is calculated using the Periodogram power spectrum
estimation method. Note the harmonics that are visible in the signal when the
vowels are spoken. Most of the signal's energy is concentrated in these harmonics;
therefore, two distinct peaks are visible in the spectrogram.
7-43
In this example, you viewed the spectrogram of your speech signal using a Matrix
Viewer block. You can find additional DSP System Toolbox product examples in the Help
browser. To access these examples, click the Contents tab, double-click DSP System
Toolbox, and then click Examples. A list of the examples in the DSP System Toolbox
documentation appears in the right pane of the Help browser.
7-44
8
Mathematics
Learn about statistics and linear algebra.
Statistics on page 8-2
Linear Algebra and Least Squares on page 8-6
Mathematics
Statistics
In this section...
Statistics Blocks on page 8-2
Basic Operations on page 8-2
Running Operations on page 8-3
Statistics Blocks
The Statistics library provides fundamental statistical operations such as minimum,
maximum, mean, variance, and standard deviation. Most blocks in the Statistics library
support two types of operations; basic and running.
The blocks listed below toggle between basic and running modes using the Running
check box in the parameter dialog box:
Histogram
Mean
RMS
Standard Deviation
Variance
An unselected Running check box means that the block is operating in basic mode,
while a selected Running box means that the block is operating in running mode.
The Maximum and Minimum blocks are slightly different from the blocks above, and
provide a Mode parameter in the block dialog box to select the type of operation. The
Value and Index, Value, and Index options in the Mode menu all specify basic
operation, in each case enabling a different set of output ports on the block. The Running
option in the Mode menu selects running operation.
Basic Operations
A basic operation is one that processes each input independently of previous and
subsequent inputs. For example, in basic mode (with Value and Index selected, for
example) the Maximum block finds the maximum value in each column of the current
input, and returns this result at the top output (Val). Each consecutive Val output
8-2
Statistics
therefore has the same number of columns as the input, but only one row. Furthermore,
the values in a given output only depend on the values in the corresponding input. The
block repeats this operation for each successive input.
This type of operation is exactly equivalent to the MATLAB command
val = max(u)
The Buffer block's Buffer size (Mo) parameter determines the size of the window. The
Buffer overlap (L) parameter defines the slide factor for the window. At each sample
instant, the window slides by Mo-L points. The Buffer overlap is often Mo-1, so that a
new statistic is computed for every new signal sample.
Running Operations
A running operation is one that processes successive inputs, and computes a result that
reflects both current and past inputs. In this mode, you must use the Input processing
parameter to specify whether the block performs sample- or frame-based processing on
the inputs. A reset port enables you to restart this tracking at any time. The running
8-3
Mathematics
statistic is computed for each input channel independently, so the block's output is the
same size as the input.
For example, in running mode (Running selected from the Mode parameter) the
Maximum block outputs a record of the input's maximum value over time.
8-4
Statistics
The following figure illustrates how a Maximum block in running mode operates on a
3-by-2 matrix input,u, when the Input processing parameter is set to Columns as
channels (frame based). The running maximum is reset at t=2 by an impulse to the
block's optional Rst port.
8-5
Mathematics
1 -2 3
A = 4 0 6 b =
2 -1 3
1
- 2
- 1
You can verify the solution by using the Matrix Multiply block to perform the
multiplication Ax, as shown in the following ex_matrixmultiply_tut1 model.
8-7
Mathematics
Matrix Factorizations
The Matrix Factorizations library provides the following blocks for factoring various
kinds of matrices:
Cholesky Factorization
LDL Factorization
LU Factorization
QR Factorization
Singular Value Decomposition
Some of the blocks offer particular strengths for certain classes of problems. For example,
the Cholesky Factorization block is particularly suited to factoring a Hermitian positive
definite matrix into triangular components, whereas the QR Factorization is particularly
suited to factoring a rectangular matrix into unitary and upper triangular components.
Factor a Matrix into Upper and Lower Submatrices Using the LU Factorization Block
In the following ex_lufactorization_tut model, the LU Factorization block factors a matrix
Ap into upper and lower triangular submatrices U and L, where Ap is row equivalent to
input matrixA, where
8-8
The lower output of the LU Factorization, P, is the permutation index vector, which
indicates that the factored matrix Ap is generated fromA by interchanging the first and
second rows.
Ap
4 0 6
= 1 -2 3
2 -1 3
The upper output of the LU Factorization, LU, is a composite matrix containing the two
submatrix factors, U andL, whose product LU is equal to Ap.
6
0 0
4 0
1
U = 0 -2 1.5 L = 0 .25 1 0
0 0 -0 .75
0 .5 0.5 1
You can check that LU=Ap with the Matrix Multiply block, as shown in the following
ex_matrixmultiply_tut2 model.
Matrix Inverses
The Matrix Inverses library provides the following blocks for inverting various kinds of
matrices:
Cholesky Inverse
LDL Inverse
8-9
Mathematics
LU Inverse
Pseudoinverse
Find the Inverse of a Matrix Using the LU Inverse Block
In the following ex_luinverse_tut model, the LU Inverse block computes the inverse of
input matrixA, where
1 -2 3
A = 4 0 6
2 -1 3
and then forms the product A-1A, which yields the identity matrix of order3, as expected.
8-10
-1
-0 .5
2
-1
= 0
0.5
-1
0.6667 0.5 - 1.333
9
Fixed-Point Design
Learn about fixed-point data types and how to convert floating-point models to fixedpoint.
Fixed-Point Signal Processing on page 9-2
Fixed-Point Concepts and Terminology on page 9-4
Arithmetic Operations on page 9-9
Fixed-Point Support for MATLAB System Objects on page 9-19
Using the Fixed-Point Converter App with System Objects on page 9-25
Use the Fixed-Point Converter App with a System object on page 9-26
Specify Fixed-Point Attributes for Blocks on page 9-33
Quantizers on page 9-55
Fixed-Point Filter Design on page 9-69
Fixed-Point Design
Fixed-Point Features
Many of the blocks in this product have fixed-point support, so you can design signal
processing systems that use fixed-point arithmetic. Fixed-point support in DSP System
Toolbox software includes
Signed two's complement and unsigned fixed-point data types
Word lengths from 2 to 128 bits in simulation
Word lengths from 2 to the size of a long on the Simulink Coder C code-generation
target
Overflow handling and rounding methods
C code generation for deployment on a fixed-point embedded processor, with Simulink
Coder code generation software. The generated code uses all allowed data types
supported by the embedded target, and automatically includes all necessary shift and
scaling operations
its large dynamic range reduces the risk of overflow, quantization errors, and the need
for scaling. In contrast, the smaller dynamic range of fixed-point hardware that allows
for low-power, inexpensive units brings the possibility of these problems. Therefore,
fixed-point development must minimize the negative effects of these factors, while
exploiting the benefits of fixed-point hardware; cost- and size-effective units, less power
and memory usage, and fast real-time processing.
9-3
Fixed-Point Design
where
bi is the ith binary digit.
9-4
Scaling
Fixed-point numbers can be encoded according to the scheme
9-5
Fixed-Point Design
or
For both signed and unsigned fixed-point numbers of any data type, the number of
different bit patterns is 2wl.
For example, in two's complement, negative numbers must be represented as well as
zero, so the maximum value is 2wl1. Because there is only one representation for zero,
there are an unequal number of positive and negative numbers. This means there is a
representation for -2wl1 but not for 2wl 1:
9-6
Overflow Handling
Because a fixed-point data type represents numbers within a finite range, overflows can
occur if the result of an operation is larger or smaller than the numbers in that range.
System Toolbox software does not allow you to add guard bits to a data type on-the-fly
in order to avoid overflows. Any guard bits must be allocated upon model initialization.
However, the software does allow you to either saturate or wrap overflows. Saturation
represents positive overflows as the largest positive number in the range being used, and
negative overflows as the largest negative number in the range being used. Wrapping
uses modulo arithmetic to cast an overflow back into the representable range of the data
type. See Modulo Arithmetic on page 9-9 for more information.
Precision
The precision of a fixed-point number is the difference between successive values
representable by its data type and scaling, which is equal to the value of its least
significant bit. The value of the least significant bit, and therefore the precision of the
number, is determined by the number of fractional bits. A fixed-point value can be
represented to within half of the precision of its data type and scaling.
For example, a fixed-point representation with four bits to the right of the binary point
has a precision of 2-4 or 0.0625, which is the value of its least significant bit. Any number
within the range of this data type and scaling can be represented to within (2-4)/2 or
0.03125, which is half the precision. This is an example of representing a number with
finite precision.
Rounding Modes
When you represent numbers with finite precision, not every number in the available
range can be represented exactly. If a number cannot be represented exactly by the
specified data type and scaling, it is rounded to a representable number. Although
precision is always lost in the rounding operation, the cost of the operation and the
9-7
Fixed-Point Design
amount of bias that is introduced depends on the rounding mode itself. To provide you
with greater flexibility in the trade-off between cost and bias, DSP System Toolbox
software currently supports the following rounding modes:
Ceiling rounds the result of a calculation to the closest representable number in the
direction of positive infinity.
Convergent rounds the result of a calculation to the closest representable number.
In the case of a tie, Convergent rounds to the nearest even number. This is the least
biased rounding mode provided by the toolbox.
Floor, which is equivalent to truncation, rounds the result of a calculation to the
closest representable number in the direction of negative infinity.
Nearest rounds the result of a calculation to the closest representable number. In the
case of a tie, Nearest rounds to the closest representable number in the direction of
positive infinity.
Round rounds the result of a calculation to the closest representable number. In the
case of a tie, Round rounds positive numbers to the closest representable number
in the direction of positive infinity, and rounds negative numbers to the closest
representable number in the direction of negative infinity.
Simplest rounds the result of a calculation using the rounding mode (Floor or
Zero) that adds the least amount of extra rounding code to your generated code.
For more information, see Rounding Mode: Simplest in the Fixed-Point Designer
documentation.
Zero rounds the result of a calculation to the closest representable number in the
direction of zero.
To learn more about each of these rounding modes, see Rounding in the Fixed-Point
Designer documentation.
For a direct comparison of the rounding modes, see Choosing a Rounding Method in the
Fixed-Point Designer documentation.
9-8
Arithmetic Operations
Arithmetic Operations
In this section...
Modulo Arithmetic on page 9-9
Two's Complement on page 9-10
Addition and Subtraction on page 9-11
Multiplication on page 9-12
Casts on page 9-14
Note: These sections will help you understand what data type and scaling choices result
in overflows or a loss of precision.
Modulo Arithmetic
Binary math is based on modulo arithmetic. Modulo arithmetic uses only a finite set of
numbers, wrapping the results of any calculations that fall outside the given set back
into the set.
For example, the common everyday clock uses modulo 12 arithmetic. Numbers in this
system can only be 1 through 12. Therefore, in the clock system, 9 plus 9 equals 6. This
can be more easily visualized as a number circle:
9-9
Fixed-Point Design
Similarly, binary math can only use the numbers 0 and 1, and any arithmetic results
that fall outside this range are wrapped around the circle to either 0 or 1.
Two's Complement
Two's complement is a way to interpret a binary number. In two's complement, positive
numbers always start with a 0 and negative numbers always start with a 1. If the
leading bit of a two's complement number is 0, the value is obtained by calculating the
standard binary value of the number. If the leading bit of a two's complement number
is 1, the value is obtained by assuming that the leftmost bit is negative, and then
calculating the binary value of the number. For example,
01 = (0 + 20 ) = 1
11 = ((- 21 ) + ( 20 )) = (-2 + 1) = -1
9-10
Arithmetic Operations
For example, consider taking the negative of 11010 (-6). First, take the one's complement
of the number, or flip the bits:
11010 00101
00101
+1
00110 (6)
010010.1
(18.5)
+0110.110 (6.75)
011001.010 (25.25)
Fixed-point subtraction is equivalent to adding while using the two's complement value
for any negative values. In subtraction, the addends must be sign extended to match each
other's length. For example, consider subtracting 0110.110 (6.75) from 010010.1 (18.5):
Most fixed-point DSP System Toolbox blocks that perform addition cast the adder inputs
to an accumulator data type before performing the addition. Therefore, no further
9-11
Fixed-Point Design
shifting is necessary during the addition to line up the binary points. See Casts on page
9-14 for more information.
Multiplication
The multiplication of two's complement fixed-point numbers is directly analogous to
regular decimal multiplication, with the exception that the intermediate results must be
sign extended so that their left sides align before you add them together.
For example, consider the multiplication of 10.11 (-1.25) with 011 (3):
Arithmetic Operations
Real-Real Multiplication
The following diagram shows the data types used in the multiplication of two real
numbers in System Toolbox software. The software returns the output of this operation
in the product output data type, as the next figure shows.
Real-Complex Multiplication
The following diagram shows the data types used in the multiplication of a real and a
complex fixed-point number in System Toolbox software. Real-complex and complex-real
multiplication are equivalent. The software returns the output of this operation in the
product output data type, as the next figure shows.
Complex-Complex Multiplication
The following diagram shows the multiplication of two complex fixed-point numbers in
System Toolbox software. Note that the software returns the output of this operation in
the accumulator output data type, as the next figure shows.
9-13
Fixed-Point Design
System Toolbox blocks cast to the accumulator data type before performing addition or
subtraction operations. In the preceding diagram, this is equivalent to the C code
acc=ac;
acc-=bd;
Casts
Many fixed-point System Toolbox blocks that perform arithmetic operations allow you
to specify the accumulator, intermediate product, and product output data types, as
9-14
Arithmetic Operations
applicable, as well as the output data type of the block. This section gives an overview of
the casts to these data types, so that you can tell if the data types you select will invoke
sign extension, padding with zeros, rounding, and/or overflow.
Casts to the Accumulator Data Type
For most fixed-point System Toolbox blocks that perform addition or subtraction, the
operands are first cast to an accumulator data type. Most of the time, you can specify
the accumulator data type on the block mask. See Accumulator Parameters. Since the
addends are both cast to the same accumulator data type before they are added together,
no extra shift is necessary to insure that their binary points align. The result of the
addition remains in the accumulator data type, with the possibility of overflow.
Casts to the Intermediate Product or Product Output Data Type
For System Toolbox blocks that perform multiplication, the output of the multiplier is
placed into a product output data type. Blocks that then feed the product output back
into the multiplier might first cast it to an intermediate product data type. Most of the
time, you can specify these data types on the block mask. See Intermediate Product
Parameters and Product Output Parameters.
Casts to the Output Data Type
Many fixed-point System Toolbox blocks allow you to specify the data type and scaling of
the block output on the mask. Remember that the software does not allow mixed types
on the input and output ports of its blocks. Therefore, if you would like to specify a fixedpoint output data type and scaling for a System Toolbox block that supports fixed-point
data types, you must feed the input port of that block with a fixed-point signal. The final
cast made by a fixed-point System Toolbox block is to the output data type of the block.
Note that although you can not mix fixed-point and floating-point signals on the input
and output ports of blocks, you can have fixed-point signals with different word and
fraction lengths on the ports of blocks that support fixed-point signals.
Casting Examples
It is important to keep in mind the ramifications of each cast when selecting these
intermediate data types, as well as any other intermediate fixed-point data types that
are allowed by a particular block. Depending upon the data types you select, overflow
and/or rounding might occur. The following two examples demonstrate cases where
overflow and rounding can occur.
9-15
Fixed-Point Design
Consider the cast of a nonzero number, represented by a four-bit data type with two
fractional bits, to an eight-bit data type with seven fractional bits:
As the diagram shows, the source bits are shifted up so that the binary point matches
the destination binary point position. The highest source bit does not fit, so overflow
might occur and the result can saturate or wrap. The empty bits at the low end of the
destination data type are padded with either 0's or 1's:
If overflow does not occur, the empty bits are padded with 0's.
If wrapping occurs, the empty bits are padded with 0's.
If saturation occurs,
The empty bits of a positive number are padded with 1's.
The empty bits of a negative number are padded with 0's.
You can see that even with a cast from a shorter data type to a longer data type, overflow
might still occur. This can happen when the integer length of the source data type (in
this case two) is longer than the integer length of the destination data type (in this case
9-16
Arithmetic Operations
one). Similarly, rounding might be necessary even when casting from a shorter data type
to a longer data type, if the destination data type and scaling has fewer fractional bits
than the source.
Cast from a Longer Data Type to a Shorter Data Type
Consider the cast of a nonzero number, represented by an eight-bit data type with seven
fractional bits, to a four-bit data type with two fractional bits:
As the diagram shows, the source bits are shifted down so that the binary point matches
the destination binary point position. There is no value for the highest bit from the
source, so the result is sign extended to fill the integer portion of the destination
data type. The bottom five bits of the source do not fit into the fraction length of the
destination. Therefore, precision can be lost as the result is rounded.
In this case, even though the cast is from a longer data type to a shorter data type, all
the integer bits are maintained. Conversely, full precision can be maintained even if you
cast to a shorter data type, as long as the fraction length of the destination data type is
the same length or longer than the fraction length of the source data type. In that case,
however, bits are lost from the high end of the result and overflow might occur.
9-17
Fixed-Point Design
The worst case occurs when both the integer length and the fraction length of the
destination data type are shorter than those of the source data type and scaling. In that
case, both overflow and a loss of precision can occur.
9-18
Description
Estimation
dsp.LevinsonSolver
Filters
dsp.AllpoleFilter
dsp.BiquadFilter
dsp.CICInterpolator
dsp.DigitalFilter
dsp.FIRDecimator
Fixed-Point Design
Object
Description
dsp.FIRFilter
dsp.FIRInterpolator
dsp.FIRRateConverter
dsp.IIRFilter
dsp.LMSFilter
dsp.SubbandAnalysisFilter
dsp.SubbandSynthesisFilter
Math Functions
9-20
dsp.ArrayVectorAdder
dsp.ArrayVectorDivider
dsp.ArrayVectorMultiplier
dsp.ArrayVectorSubtractor
dsp.CumulativeProduct
dsp.CumulativeSum
dsp.LDLFactor
dsp.LevinsonSolver
dsp.LowerTriangularSolver
dsp.LUFactor
dsp.Normalizer
Normalize input
dsp.UpperTriangularSolver
Object
Description
Quantizers
dsp.ScalarQuantizerDecoder
dsp.ScalarQuantizerEncoder
dsp.VectorQuantizerDecoder
dsp.VectorQuantizerEncoder
Signal Management
dsp.Buffer
dsp.Counter
Signal Operations
dsp.Convolver
dsp.DigitalDownConverter
dsp.DigitalUpConverter
dsp.HDLNCO
dsp.NCO
dsp.PeakFinder
Window object
Sinks
dsp.SignalSink
dsp.TimeScope
Sources
dsp.SignalSource
dsp.SineWave
9-21
Fixed-Point Design
Object
Description
Statistics
dsp.Autocorrelator
dsp.Crosscorrelator
dsp.Histogram
dsp.Maximum
dsp.Mean
dsp.Median
dsp.Minimum
dsp.Variance
Transforms
dsp.DCT
dsp.FFT
dsp.HDLFFT
dsp.HDLIFFT
dsp.IDCT
dsp.IFFT
opens. Scroll down and select System Objects. Finally, select or deselect Show fixedpoint properties.
If an object supports fixed-point data processing, its fixed-point properties are active
regardless of whether they are displayed or not.
Fixed-Point Design
the Fixed-Point Designer numerictype object to specify the desired data type as fixedpoint, the signedness, and the word- and fraction-lengths. System objects support these
values of DataTypeMode: Boolean, Double, Single, and Fixed-point: binary
point scaling.
In the same way as for blocks, the data type properties of many System objects can set
the appropriate word lengths and scalings automatically by using full precision. System
objects assume that the target specified on the Configuration Parameters Hardware
Implementation target is ASIC/FPGA.
If you have not set the property that activates a dependent property and you attempt
to change that dependent property, a warning message displays. For example, for the
dsp.FFT object, before you set CustomOutputDataType to numerictype(1,32,30)
you must set OutputDataType to 'Custom'.
Note: System objects do not support fixed-point word lengths greater than 128 bits.
For any System object provided in the Toolbox, the fimath settings for any fimath
attached to a fi input or a fi property are ignored. Outputs from a System object never
have an attached fimath.
9-24
Related Examples
Fixed-Point Design
Create a test bench, myFIRFilter_tb, for the filter. The test bench generates a signal
that gathers range information for conversion. Save the test bench.
% Test bench for myFIRFilter
% Remove high-frequency sinusoid using an FIR filter.
% Initialize
f1 = 1000;
f2 = 3000;
Fs = 8000;
Fcutoff = 2000;
9-26
% Generate input
SR = dsp.SineWave('Frequency',[f1,f2],'SampleRate',Fs,...
'SamplesPerFrame',1024);
% Filter coefficients
num = fir1(130,Fcutoff/(Fs/2));
% Visualize input and output spectra
plot = dsp.SpectrumAnalyzer('SampleRate',Fs,'PlotAsTwoSidedSpectrum',...
false,'ShowLegend',true,'YLimits',[-120 30],...
'Title','Input Signal (Channel 1) Output Signal (Channel 2)');
% Stream
for k = 1:100
input = sum(step(SR),2); % Add the two sinusoids together
filteredOutput = myFIRFilter(input, num); % Filter
step(plot,[input,filteredOutput]); % Visualize
end
To add the entry-point function myFIRFilter to the project, browse to the file
myFIRFilter.m, and then click Open.
By default, the app saves information and settings for this project in the current
folder in a file named myFirFilter.prj.
9-27
Fixed-Point Design
9-28
7
8
Click Next to go to the Check for Run-Time Issues step. On the Check for RunTimes Issues page, the app populates the test file field with myFIRFilter_tb, the
test file that you used to define the input types.
Click Check for Issues. The app generates instrumented MEX function. It runs
the test file myFIRFilter_tb replacing calls to myFIRFilter with calls to the
generated MEX. If the app finds issues, it provides warning and error messages. You
can click a message to highlight the problematic code in a window where you can edit
the code. In this example, the app does not detect issues.
Click Next to go to the Convert to Fixed Point step.
On the Convert to Fixed Point page, click Simulate to collect range information.
The Variables tab displays the collected range information and type proposals.
Manually edit the data type proposals as needed.
9-29
Fixed-Point Design
9-30
fm = fimath('RoundingMethod', 'Floor',...
'OverflowAction', 'Wrap', 'ProductMode', 'FullPrecision',...
'MaxProductWordLength', 128, ...
'SumMode', 'FullPrecision', 'MaxSumWordLength', 128);
persistent lowpassFIR
if isempty( lowpassFIR )
lowpassFIR = dsp.FIRFilter( 'NumeratorSource', 'Input port',...
'FullPrecisionOverride', false, 'ProductDataType', 'Full precision',...
'AccumulatorDataType', 'Custom',...
'CustomAccumulatorDataType', numerictype(1, 16, 14),...
'OutputDataType', 'Custom', 'CustomOutputDataType', numerictype(1, 8, 6
% default
end
9-31
Fixed-Point Design
More About
9-32
9-33
Fixed-Point Design
All System Toolbox blocks with fixed-point capabilities share a set of common
parameters, but each block can have a different subset of these fixed-point parameters.
The following table provides an overview of the most common fixed-point block
parameters.
Fixed-Point Data Type
Parameter
Description
Rounding Mode
Specifies the rounding mode for the block to use when the
specified data type and scaling cannot exactly represent the
result of a fixed-point calculation.
See Rounding Modes on page 9-7 for more information on the
available options.
Overflow Mode
Specifies the overflow mode to use when the result of a fixedpoint calculation does not fit into the representable range of
the specified data type.
See Overflow Handling on page 9-7 for more information on
the available options.
9-34
Description
Intermediate Product
Product Output
Specifies the data type and scaling of the product output for
fixed-point blocks that must compute multiplication results.
See the reference page of a specific block to learn about the
product output data type for that block. For or complexcomplex multiplication, the multiplication result is in the
accumulator data type. See Multiplication Data Types
on page 9-12 for more information on complex fixed-point
multiplication in System toolbox software.
Accumulator
Output
9-35
Fixed-Point Design
9-36
Fixed-Point Design
affected by your particular hardware. See The Effect of the Hardware Implementation
Pane on the Internal Rule on page 9-38 for more information.
Internal Rule for Product Data Types
The internal rule for product data types first calculates the ideal, full-precision result:
Parameters dialog box. You can open this dialog box from the Simulation menu in your
model.
ASIC/FPGA
On an ASIC/FPGA target, the ideal, full-precision word length and fraction length
calculated by the internal rule are used. If the calculated ideal word length is larger than
the largest allowed word length, you receive an error. The largest word length allowed for
Simulink and System Toolbox software is 128 bits.
Other targets
For all targets other than ASIC/FPGA, the ideal, full-precision word length calculated
by the internal rule is rounded up to the next available word length of the target. The
calculated ideal fraction length is used, keeping the least-significant bits.
If the calculated ideal word length for a product data type is larger than the largest
word length on the target, you receive an error. If the calculated ideal word length for an
accumulator or output data type is larger than the largest word length on the target, the
largest target word length is used.
9-39
Fixed-Point Design
9-40
In the preceding model, the Device type parameter in the Hardware Implementation
pane of the Configuration Parameters dialog box is set to ASIC/FPGA. Therefore, the
accumulator data type used by the internal rule is the ideal, full-precision result.
Calculate the full-precision word length for each of the Difference blocks in the model:
WLideal accumulator = WLinput to accumulator + floor(log 2 (numb er of accumulations)) + 1
WLideal accumulator = 9 + floor(log 2 (1))) + 1
WLideal accumulator = 9 + 0 + 1 = 10
WLideal accumulator1 = WLinpput to accumulator1 + floor(log 2 ( number of accumulations)) + 1
WLideal accumulator1 = 16 + floor(log 2 (1)) + 1
WLideal accumulator1 = 16 + 0 + 1 = 17
WLideal accumulator 2 = WLinput to accumulator2 + floor(log 2 (number of accumulations)) + 1
WLideal accumulatoor 2 = 127 + floor(log 2 (1)) + 1
WLideal accumulator 2 = 127 + 0 + 1 = 128
Calculate the full-precision fraction length, which is the same for each Matrix Sum block
in this example:
FLideal accumulator = FLinput to accumulator
FLideal accumulator = 4
Now change the Device type parameter in the Hardware Implementation pane
of the Configuration Parameters dialog box to 32bit Embedded Processor, by
changing the parameters as shown in the following figure.
9-41
Fixed-Point Design
As you can see in the dialog box, this device has 8-, 16-, and 32-bit word lengths
available. Therefore, the ideal word lengths of 10, 17, and 128 bits calculated by the
internal rule cannot be used. Instead, the internal rule uses the next largest available
word length in each case You can see this if you rerun the model, as shown in the
following figure.
9-42
9-43
Fixed-Point Design
In the Array-Vector Multiply blocks, the Product Output parameter is set to Inherit:
Inherit via internal rule, and the Output parameter is set to Inherit: Same
as product output. Therefore, you can see the product output data type calculated
by the internal rule on the output signal in the model. The setting of the Accumulator
parameter does not matter because this example uses real values.
For the preceding model, the Device type parameter in the Hardware
Implementation pane of the Configuration Parameters dialog box is set to ASIC/FPGA.
Therefore, the product data type used by the internal rule is the ideal, full-precision
result.
Calculate the full-precision word length for each of the Array-Vector Multiply blocks in
the model:
9-44
Calculate the full-precision fraction length, which is the same for each Array-Vector
Multiply block in this example:
FLideal accumulator = FLinput to accumulator
FLideal accumulator = 4
Now change the Device type parameter in the Hardware Implementation pane of
the Configuration Parameters dialog box to 32bit Embedded Processor, as shown in
the following figure.
9-45
Fixed-Point Design
As you can see in the dialog box, this device has 8-, 16-, and 32-bit word lengths
available. Therefore, the ideal word lengths of 12 and 31 bits calculated by the internal
rule cannot be used. Instead, the internal rule uses the next largest available word
length in each case. You can see this if you rerun the model, as shown in the following
figure.
9-46
9-47
Fixed-Point Design
This model uses the Cumulative Sum block to sum the input coming from the FixedPoint Sources subsystem. The Fixed-Point Sources subsystem outputs two signals
with different data types:
The Signed source has a word length of 16 bits and a fraction length of 15 bits.
2
The Unsigned source has a word length of 16 bits and a fraction length of 16 bits.
Run the model to check for overflow. MATLAB displays the following warnings at
the command line:
Warning: Overflow occurred. This originated from
'ex_fixedpoint_tut/Signed Cumulative Sum'.
Warning: Overflow occurred. This originated from
'ex_fixedpoint_tut/Unsigned Cumulative Sum'.
9-48
from the model menu. Turn on logging for all blocks in your model by setting the
Fixed-point instrumentation mode parameter to Minimums, maximums and
overflows.
Now that you have turned on logging, rerun the model by clicking the Simulation
button.
9-49
Fixed-Point Design
The results of the simulation appear in a table in the central Contents pane of the
Fixed-Point Tool. Review the following columns:
Name Provides the name of each signal in the following format: Subsystem
Name/Block Name: Signal Name.
SimDT The simulation data type of each logged signal.
SpecifiedDT The data type specified on the block dialog for each signal.
SimMin The smallest representable value achieved during simulation for each
logged signal.
SimMax The largest representable value achieved during simulation for each
logged signal.
OverflowWraps The number of overflows that wrap during simulation.
For more information on each of the columns in this table, see the Contents Pane
section of the Simulink fxptdlg function reference page.
You can also see that the SimMin and SimMax values for the Accumulator data
types range from 0 to .9997. The logged results indicate that 8,192 overflows
wrapped during simulation in the Accumulator data type of the Signed Cumulative
Sum block. Similarly, the Accumulator data type of the Unsigned Cumulative Sum
block had 16,383 overflows wrap during simulation.
To get more information about each of these data types, highlight them in the
Contents pane, and click the Show details for selected result button (
)
Assume a target hardware that supports 32-bit integers, and set the Accumulator
word length in both Cumulative Sum blocks to 32. To do so, perform the following
steps:
1
Right-click the Signed Cumulative Sum: Accumulator row in the FixedPoint Tool pane, and select Highlight Block In Model.
Double-click the block in the model, and select the Data Types pane of the
dialog box.
Open the Data Type Assistant for Accumulator by clicking the Assistant
button (
9-50
Set the Mode to Fixed Point. To see the representable range of the current
specified data type, click the Fixed-point details link. The tool displays the
representable maximum and representable minimum values for the current data
type.
Change the Word length to 32, and click the Refresh details button in the
Fixed-point details section to see the updated representable range. When you
change the value of the Word length parameter, the data type string in the
Data Type edit box automatically updates.
Click OK on the block dialog box to save your changes and close the window.
9-51
Fixed-Point Design
Set the word length of the Accumulator data type of the Unsigned Cumulative
Sum block to 32 bits. You can do so in one of two ways:
Type the data type string fixdt([],32,0) directly into Data Type edit box
for the Accumulator data type parameter.
Perform the same steps you used to set the word length of the Accumulator
data type of the Signed Cumulative Sum block to 32 bits.
To verify your changes in word length and check for overflow, rerun your model. To
do so, click the Simulate button in the Fixed-Point Tool.
The Contents pane of the Fixed-Point Tool updates, and you can see that no
overflows occurred in the most recent simulation. However, you can also see that the
SimMin and SimMax values range from 0 to 0. This underflow happens because
the fraction length of the Accumulator data type is too small. The SpecifiedDT
cannot represent the precision of the data values. The following sections discuss how
to find a floating-point benchmark and use the Fixed-Point Tool to propose fraction
lengths.
9-52
Open the Fixed-Point Tool and set Data type override to Double.
Run your model by clicking the Run simulation and store active results button.
Examine the results in the Contents pane of the Fixed-Point Tool. Because you ran
the model in Double override mode, you get an accurate, idealized representation of
the simulation minimums and maximums. These values appear in the SimMin and
SimMax parameters.
Now that you have an accurate reference representation of the simulation minimum
and maximum values, you can more easily choose appropriate fraction lengths.
Before making these choices, save your active results to reference so you can use
them as your floating-point benchmark. To do so, select Results > Move Active
Results To Reference from the Fixed-Point Tool menu. The status displayed in the
Run column changes from Active to Reference for all signals in your model.
To propose fraction lengths for your data types, you must have a set of Active
results available in the Fixed-Point Tool. To produce an active set of results,
simply rerun your model. The tool now displays both the Active results and the
Reference results for each signal.
Select the Use simulation min/max if design min/max is not available check
box. You did not specify any design minimums or maximums for the data types
in this model. Thus, the tool uses the logged information to compute and propose
fraction lengths. For information on specifying design minimums and maximums,
see Signal Ranges in the Simulink documentation.
Click the Propose fraction lengths button (
). The tool populates the proposed
data types in the ProposedDT column of the Contents pane. The corresponding
proposed minimums and maximums are displayed in the ProposedMin and
ProposedMax columns.
In the Contents pane of the Fixed-Point Tool, you can see the proposed fraction
lengths for the data types in your model.
The proposed fraction length for the Accumulator data type of both the Signed
and Unsigned Cumulative Sum blocks is 17 bits.
To get more details about the proposed scaling for a particular data type,
highlight the data type in the Contents pane of the Fixed-Point Tool.
Open the Autoscale Information window for the highlighted data type by clicking
Fixed-Point Design
To accept the proposed data types, select the check box in the Accept column for
each data type whose proposed scaling you want to keep. Then, click the Apply
accepted fraction lengths button (
on the block dialog boxes and the SpecifiedDT column in the Contents pane.
To verify the newly accepted scaling, set the Data type override parameter back
to Use local settings, and run the model. Looking at Contents pane of the FixedPoint Tool, you can see the following details:
The SimMin and SimMax values of the Active run match the SimMin and
SimMax values from the floating-point Reference run.
There are no longer any overflows.
The SimDT does not match the SpecifiedDT for the Accumulator data type of
either Cumulative Sum block. This difference occurs because the Cumulative
Sum block always inherits its Signedness from the input signal and only allows
you to specify a Signedness of Auto. Therefore, the SpecifiedDT for both
Accumulator data types is fixdt([],32,17). However, because the Signed
Cumulative Sum block has a signed input signal, the SimDT for the Accumulator
parameter of that block is also signed (fixdt(1,32,17)). Similarly, the SimDT
for the Accumulator parameter of the Unsigned Cumulative Sum block inherits
its Signedness from its input signal and thus is unsigned (fixdt(0,32,17)).
9-54
Quantizers
Quantizers
In this section...
Scalar Quantizers on page 9-55
Vector Quantizers on page 9-62
Scalar Quantizers
Analysis and Synthesis of Speech on page 9-55
Identify Your Residual Signal and Reflection Coefficients on page 9-57
Create a Scalar Quantizer on page 9-58
Analysis and Synthesis of Speech
You can use blocks from the DSP System Toolbox Quantizers library to design scalar
quantizer encoders and decoders. A speech signal is usually represented in digital
format, which is a sequence of binary bits. For storage and transmission applications,
it is desirable to compress a signal by representing it with as few bits as possible,
while maintaining its perceptual quality. Quantization is the process of representing
a signal with a reduced level of precision. If you decrease the number of bits allocated
for the quantization of your speech signal, the signal is distorted and the speech quality
degrades.
In narrowband digital speech compression, speech signals are sampled at a rate of 8000
samples per second. Each sample is typically represented by 8 bits. This corresponds to
a bit rate of 64 kbits per second. Further compression is possible at the cost of quality.
Most of the current low bit rate speech coders are based on the principle of linear
predictive speech coding. This topic shows you how to use the Scalar Quantizer Encoder
and Scalar Quantizer Decoder blocks to implement a simple speech coder.
1
Type ex_sq_example1 at the MATLAB command line to open the example model.
9-55
Fixed-Point Design
This model preemphasizes the input speech signal by applying an FIR filter. Then,
it calculates the reflection coefficients of each frame using the Levinson-Durbin
algorithm. The model uses these reflection coefficients to create the linear prediction
analysis filter (lattice-structure). Next, the model calculates the residual signal
by filtering each frame of the preemphasized speech samples using the reflection
coefficients. The residual signal, which is the output of the analysis stage, usually
has a lower energy than the input signal. The blocks in the synthesis stage of the
model filter the residual signal using the reflection coefficients and apply an all-pole
deemphasis filter. Note that the deemphasis filter is the inverse of the preemphasis
filter. The result is the full recovery of the original signal.
2
9-56
Quantizers
Double-click the Original Signal and Processed Signal blocks and listen to both the
original and the processed signal.
There is no significant difference between the two because no quantization was
performed.
To better approximate a real-world speech analysis and synthesis system, you need to
quantize the residual signal and reflection coefficients before they are transmitted. The
following topics show you how to design scalar quantizers to accomplish this task.
Identify Your Residual Signal and Reflection Coefficients
In the previous topic, Analysis and Synthesis of Speech on page 9-55, you learned
the theory behind the LPC Analysis and Synthesis of Speech example model. In this
topic, you define the residual signal and the reflection coefficients in your MATLAB
workspace as the variables E and K, respectively. Later, you use these values to create
your scalar quantizers:
1
From the Simulink Sinks library, click-and-drag two To Workspace blocks into your
model.
Connect the output of the Levinson-Durbin block to one of the To Workspace blocks.
Double-click this To Workspace block and set the Variable name parameter to K.
Click OK.
Connect the output of the Time-Varying Analysis Filter block to the other To
Workspace block.
Double-click this To Workspace block and set the Variable name parameter to E.
Click OK.
You model should now look similar to this figure.
9-57
Fixed-Point Design
9-58
If the model you created in Identify Your Residual Signal and Reflection
Coefficients on page 9-57 is not open on your desktop, you can open an
equivalent model by typing ex_sq_example2 at the MATLAB command prompt.
Quantizers
Run this model to define the variables E and K in the MATLAB workspace.
From the Quantizers library, click-and-drag a Scalar Quantizer Design block into
your model. Double-click this block to open the SQ Design Tool GUI.
Make sure that your desired destination model, ex_sq_example2, is the current
model. You can type gcs in the MATLAB Command Window to display the name of
your current model.
10 In the SQ Design Tool GUI, click the Design and Plot button to apply the changes
you made to the parameters.
The GUI should look similar to the following figure.
9-59
Fixed-Point Design
9-60
Quantizers
13 Repeat steps 5 to 11 for the variable E, which represents the residual signal you
want to quantize. In steps 6 and 7, name your blocks SQ Encoder - Residual and SQ
Decoder - Residual.
Once you have completed these steps, two new blocks, SQ Encoder - Residual and SQ
Decoder - Residual, appear in your model file.
14 Close the SQ Design Tool GUI. You do not need to save the SQ Design Tool session.
You have now created a scalar quantizer encoder and a scalar quantizer decoder for
each signal you want to quantize. You are ready to quantize the residual signal, E,
and the reflection coefficients, K.
15 Save the model as ex_sq_example3. Your model should look similar to the
following figure.
Fixed-Point Design
Again, there is no perceptible difference between the two. You can therefore conclude
that quantizing your residual and reflection coefficients did not affect the ability of
your system to accurately reproduce the input signal.
You have now quantized the residual and reflection coefficients. The bit rate of a
quantization system is calculated as (bits per frame)*(frame rate).
In this example, the bit rate is [(80 residual samples/frame)*(7 bits/sample) + (12
reflection coefficient samples/frame)*(7 bits/sample)]*(100 frames/second), or 64.4 kbits
per second. This is higher than most modern speech coders, which typically have a bit
rate of 8 to 24 kbits per second. If you decrease the number of bits allocated for the
quantization of the reflection coefficients or the residual signal, the overall bit rate would
decrease. However, the speech quality would also degrade.
For information about decreasing the bit rate without affecting speech quality, see
Vector Quantizers on page 9-62.
Vector Quantizers
Build Your Vector Quantizer Model on page 9-62
Configure and Run Your Model on page 9-64
Build Your Vector Quantizer Model
In the previous section, you created scalar quantizer encoders and decoders and used
them to quantize your residual signal and reflection coefficients. The bit rate of your
scalar quantization system was 64.4 kbits per second. This bit rate is higher than most
modern speech coders. To accommodate a greater number of users in each channel, you
need to lower this bit rate while maintaining the quality of your speech signal. You can
use vector quantizers, which exploit the correlations between each sample of a signal, to
accomplish this task.
In this topic, you modify your scalar quantization model so that you are using a split
vector quantizer to quantize your reflection coefficients:
1
9-62
Open a model similar to the one you created in Create a Scalar Quantizer on
page 9-58 by typing ex_vq_example1 at the MATLAB command prompt. The
example model ex_vq_example1 adds a new LSF Vector Quantization subsystem
to the ex_sq_example3 model. This subsystem is preconfigured to work as a
vector quantizer. You can use this subsystem to encode and decode your reflection
coefficients using the split vector quantization method.
Quantizers
From the Simulink Sinks library, click-and-drag a Terminator block into your model.
From the DSP System Toolbox Estimation > Linear Prediction library, click-anddrag a LSF/LSP to LPC Conversion block and two LPC to/from RC blocks into your
model.
Connect the blocks as shown in the following figure. You do not need to connect
Terminator blocks to the P ports of the LPC to/from RC blocks. These ports
disappear once you set block parameters.
You have modified your model to include a subsystem capable of vector quantization. In
the next topic, you reset your model parameters to quantize your reflection coefficients
using the split vector quantization method.
9-63
Fixed-Point Design
If the model you created in Build Your Vector Quantizer Model on page
9-62 is not open on your desktop, you can open an equivalent model by typing
ex_vq_example2 at the MATLAB command prompt.
Double-click the LSF Vector Quantization subsystem, and then double-click the LSF
Split VQ subsystem.
The subsystem opens, and you see the three Vector Quantizer Encoder blocks used to
implement the split vector quantization method.
9-64
Quantizers
This subsystem divides each vector of 10 line spectral frequencies (LSFs), which
represent your reflection coefficients, into three LSF subvectors. Each of these
subvectors is sent to a separate vector quantizer. This method is called split vector
quantization.
3
9-65
Fixed-Point Design
The variable CB_lsf1to3_10bit is the codebook for the subvector that contains
the first three elements of the LSF vector. It is a 3-by-1024 matrix, where 3 is the
number of elements in each codeword and 1024 is the number of codewords in the
codebook. Because 210 = 1024 , it takes 10 bits to quantize this first subvector.
Similarly, a 10-bit vector quantizer is applied to the second and third subvectors,
9-66
Quantizers
In your model file, double-click the Autocorrelation block and set the Maximum
non-negative lag (less than input length) parameter to 10. Click OK.
This parameter controls the number of linear polynomial coefficients (LPCs) that are
input to the split vector quantization method.
Double-click the LPC to/from RC block that is connected to the input of the LSF
Vector Quantization subsystem. Clear the Output normalized prediction error
power check box. Click OK.
Double-click the LSF/LSP to LPC Conversion block and set the Input parameter to
LSF in range (0 to pi). Click OK.
Double-click the LPC to/from RC block that is connected to the output of the LSF/
LSP to LPC Conversion block. Set the Type of conversion parameter to LPC to
RC, and clear the Output normalized prediction error power check box. Click
OK.
9-67
Fixed-Point Design
Double-click the Original Signal and Processed Signal blocks to listen to both the
original and the processed signal.
There is no perceptible difference between the two. Quantizing your reflection
coefficients using a split vector quantization method produced good quality speech
without much distortion.
You have now used the split vector quantization method to quantize your reflection
coefficients. The vector quantizers in the LSF Vector Quantization subsystem use 30 bits
to quantize a frame containing 80 reflection coefficients. The bit rate of a quantization
system is calculated as (bits per frame)*(frame rate).
In this example, the bit rate is [(80 residual samples/frame)*(7 bits/sample) + (30 bits/
frame)]*(100 frames/second), or 59 kbits per second. This is less than 64.4 kbits per
second, the bit rate of the scalar quantization system. However, the quality of the speech
signal did not degrade. If you want to further reduce the bit rate of your system, you can
use the vector quantization method to quantize the residual signal.
9-68
Fixed-Point Design
Process Overview
The conversion from floating point to fixed point consists of two main parts: quantizing
the coefficients and performing the dynamic range analysis. Quantizing the coefficients
is a process of converting the coefficients to fixed-point numbers. The dynamic range
analysis is a process of fine tuning the scaling of each node to ensure that the fraction
lengths are set for full input range coverage and maximum precision. The following steps
describe this conversion process.
Design the Filter
Start by designing a regular, floating-point, equiripple bandpass filter, as shown in the
following figure.
9-71
Fixed-Point Design
where the passband is from .45 to .55 of normalized frequency, the amount of ripple
acceptable in the passband is 1 dB, the first stopband is from 0 to .35 (normalized), the
second stopband is from .65 to 1 (normalized), and both stopbands provide 60 dB of
attenuation.
To design this filter, evaluate the following code, or type it at the MATLAB command
prompt:
f = fdesign.bandpass(.35,.45,.55,.65,60,1,60);
Hd = design(f, 'equiripple');
fvtool(Hd)
The last line of code invokes the Filter Visualization Tool, which displays the designed
filter. You use Hd, which is a double, floating-point filter, both as the baseline and a
starting point for the conversion.
Quantize the Coefficients
The first step in quantizing the coefficients is to find the valid word length for the
coefficients. Here again, the hardware usually dictates the maximum allowable setting.
However, if this constraint is large enough, there is room for some trial and error. Start
with the coefficient word length of 8 and determine if the resulting filter is sufficient for
your needs.
To set the coefficient word length of 8, evaluate or type the following code at the
MATLAB command prompt:
Hf = Hd;
Hf.Arithmetic = 'fixed';
set(Hf, 'CoeffWordLength', 8);
fvtool(Hf)
9-72
As the figure shows, the filter design constraints are not met. The attenuation is not
complete, and there is noise at the edges of the stopbands. You can experiment with
different coefficient word lengths if you like. For this example, however, the word length
of 12 is sufficient.
To set the coefficient word length of 12, evaluate or type the following code at the
MATLAB command prompt:
set(Hf, 'CoeffWordLength', 12);
fvtool(Hf)
The resulting filter satisfies the design constraints, as shown in the following figure.
9-73
Fixed-Point Design
Now that the coefficient word length is set, there are other data width constraints that
might require attention. Type the following at the MATLAB command prompt:
>> info(Hf)
Discrete-Time FIR Filter (real)
------------------------------Filter Structure : Direct-Form FIR
Filter Length
: 48
Stable
: Yes
Linear Phase
: Yes (Type 2)
Arithmetic
: fixed
Numerator
: s12,14 -> [-1.250000e-001 1.250000e-001)
Input
: s16,15 -> [-1 1)
9-74
You see the output is 31 bits, the accumulator requires 31 bits and the multiplier
requires 27 bits. A typical piece of hardware might have a 16 bit data bus, a 24 bit
multiplier, and an accumulator with 4 guard bits. Another reasonable assumption is
that the data comes from a 12 bit ADC. To reflect these constraints type or evaluate the
following code:
set
set
set
set
set
(Hf,
(Hf,
(Hf,
(Hf,
(Hf,
'InputWordLength', 12);
'FilterInternals', 'SpecifyPrecision');
'ProductWordLength', 24);
'AccumWordLength', 28);
'OutputWordLength', 16);
Although the filter is basically done, if you try to filter some data with it at this stage,
you may get erroneous results due to overflows. Such overflows occur because you have
defined the constraints, but you have not tuned the filter coefficients to handle properly
the range of input data where the filter is designed to operate. Next, the dynamic range
analysis is necessary to ensure no overflows.
Dynamic Range Analysis
The purpose of the dynamic range analysis is to fine tune the scaling of the coefficients.
The ideal set of coefficients is valid for the full range of input data, while the fraction
lengths maximize precision. Consider carefully the range of input data to use for this
step. If you provide data that covers the largest dynamic range in the filter, the resulting
scaling is more conservative, and some precision is lost. If you provide data that covers
a very narrow input range, the precision can be much greater, but an input out of
the design range may produce an overflow. In this example, you use the worst-case
input signal, covering a full dynamic range, in order to ensure that no overflow ever
occurs. This worst-case input signal is a scaled version of the sign of the flipped impulse
response.
To scale the coefficients based on the full dynamic range, type or evaluate the following
code:
x = 1.9*sign(fliplr(impz(Hf)));
Hf = autoscale(Hf, x);
9-75
Fixed-Point Design
To check that the coefficients are in range (no overflows) and have maximum possible
precision, type or evaluate the following code:
fipref('LoggingMode', 'on', 'DataTypeOverride', 'ForceOff');
y = filter(Hf, x);
fipref('LoggingMode', 'off');
R = qreport(Hf)
The report shows no overflows, and all data falls within the designed range. The
conversion has completed successfully.
Compare Magnitude Response and Magnitude Response Estimate
You can use the fvtool GUI to analysis on your quantized filter, to see the effects of the
quantization on stopband attenuation, etc. Two important last checks when analyzing a
quantized filter are the Magnitude Response Estimate and the Round-off Noise Power
Spectrum. The value of the Magnitude Response Estimate analysis can be seen in the
following example.
9-76
When fvtool displays the filter using the Magnitude response view, the quantized filter
seems to match the original filter quite well.
9-77
Fixed-Point Design
However if you look at the Magnitude Response Estimate plot from the Analysis
menu, you will see that the actual filter created may not perform nearly as well as
indicated by the Magnitude Response plot.
9-78
Fixed-Point Design
right of the binary point. Often the FracLength is thought of as the number of bits to the
right of the binary point. However, there is a problem with this interpretation when the
FracLength is larger than the WordLength, or when the FracLength is negative.
To work around these cases, you can use the following interpretation of a fixed-point
quantity:
The register has a WordLength of B, or in other words it has B bits. The bits are
numbered from left to right from 0 to B-1. The most significant bit (MSB) is the
leftmost bit, bB-1. The least significant bit is the right-most bit, b0. You can think of the
FracLength as a quantity specifying how to interpret the bits stored and resolve the
value they represent. The value represented by the bits is determined by assigning a
weight to each bit:
In this figure, L is the integer FracLength. It can assume any value, depending on the
quantization step size. L is necessary to interpret the value that the bits represent. This
value is given by the equation
value = -bB-1 2 B-1-L +
B -2
bk 2k- L
k =0
.
The value 2L is the smallest possible difference between two numbers represented in this
format, otherwise known as the quantization step. In this way, it is preferable to think
of the FracLength as the negative of the exponent used to weigh the right-most, or leastsignificant, bit of the fixed-point number.
To reduce the number of bits used to represent a given quantity, you can discard the
least-significant bits. This method minimizes the quantization error since the bits
9-80
you are removing carry the least weight. For instance, the following figure illustrates
reducing the number of bits from 4 to 2:
To illustrate the concepts of using integers with fixed-point filters, this example will use
a raised-cosine filter:
b = rcosdesign(.25, 12.5, 8, 'sqrt');
9-81
Fixed-Point Design
The coefficients of b are normalized so that the passband gain is equal to 1, and are
all smaller than 1. In order to make them integers, they will need to be scaled. If you
wanted to scale them to use 18 bits for each coefficient, the range of possible values for
the coefficients becomes:
Alternatively, you can use the fixed-point numbers autoscaling tool as follows:
bq = fi(b, true, B); % signed = true, B = 18 bits
L = bq.FractionLength;
It is a coincidence that B and L are both 18 in this case, because of the value of the
largest coefficient of b. If, for example, the maximum value of b were 0.124, L would be
20 while B (the number of bits) would remain 18.
Build the FIR Filter
First create the filter using the direct form, tapped delay line structure:
h = dfilt.dffir(bsc);
In order to set the required parameters, the arithmetic must be set to fixed-point:
h.Arithmetic = 'fixed';
h.CoeffWordLength = 18;
Now you can examine the magnitude response of the filter using fvtool:
9-82
This shows a large gain of 117 dB in the passband, which is due to the large values of the
coefficients this will cause the output of the filter to be much larger than the input. A
method of addressing this will be discussed in the following sections.
Set the Filter Parameters to Work with Integers
You will need to set the input parameters of your filter to appropriate values for working
with integers. For example, if the input to the filter is from a A/D converter with 12 bit
resolution, you should set the input as follows:
h.InputWordLength = 12;
h.InputFracLength = 0;
9-83
Fixed-Point Design
In this case, all the fractional lengths are now set to zero, meaning that the filter h is set
up to handle integers.
Create a Test Signal for the Filter
You can generate an input signal for the filter by quantizing to 12 bits using the
autoscaling feature, or you can follow the same procedure that was used for the
coefficients, discussed previously. In this example, create a signal with two sinusoids:
n = 0:999;
f1 = 0.1*pi; % Normalized frequency of first sinusoid
f2 = 0.8*pi; % Normalized frequency of second sinusoid
x = 0.9*sin(0.1*pi*n) + 0.9*sin(0.8*pi*n);
xq = fi(x, true, 12); % signed = true, B = 12
xsc = fi(xq.int, true, 12, 0);
Filter the Test Signal
Here ysc is a full precision output, meaning that no bits have been discarded in the
computation. This makes ysc the best possible output you can achieve given the 12bit
input and the 18bit coefficients. This can be verified by filtering using double-precision
floating-point and comparing the results of the two filtering operations:
hd = double(h);
9-84
xd = double(xsc);
yd = filter(hd, xd);
norm(yd-double(ysc))
ans =
0
Now you can examine the output compared to the input. This example is plotting only
the last few samples to minimize the effect of transients:
idx = 800:950;
xscext = double(xsc(idx)');
gd = grpdelay(h, [f1 f2]);
yidx = idx + gd(1);
yscext = double(ysc(yidx)');
stem(n(idx)', [xscext, yscext]);
axis([800 950 -2.5e8 2.5e8]);
legend('input', 'output');
set(gcf, 'color', 'white');
9-85
Fixed-Point Design
It is difficult to compare the two signals in this figure because of the large difference in
scales. This is due to the large gain of the filter, so you will need to compensate for the
filter gain:
stem(n(idx)', [2^18*xscext, yscext]);
axis([800 950 -5e8 5e8]);
legend('scaled input', 'output');
You can see how the signals compare much more easily once the scaling has been done,
as seen in the above figure.
Truncate the Output WordLength
9-86
31
you will notice that the number of bits in the output is considerably greater than in
the input. Because such growth in the number of bits representing the data may not
be desirable, you may need to truncate the wordlength of the output. As discussed in
Terminology of Fixed-Point Numbers on page 9-79the best way to do this is to
discard the least significant bits, in order to minimize error. However, if you know there
are unused high order bits, you should discard those bits as well.
To determine if there are unused most significant bits (MSBs), you can look at where
the growth in WordLength arises in the computation. In this case, the bit growth occurs
to accommodate the results of adding products of the input (12 bits) and the coefficients
(18 bits). Each of these products is 29 bits long (you can verify this using info(h)).
The bit growth due to the accumulation of the product depends on the filter length and
the coefficient values- however, this is a worst-case determination in the sense that no
assumption on the input signal is made besides, and as a result there may be unused
MSBs. You will have to be careful though, as MSBs that are deemed unused incorrectly
will cause overflows.
Suppose you want to keep 16 bits for the output. In this case, there is no bit-growth due
to the additions, so the output bit setting will be 16 for the wordlength and 14 for the
fraction length.
Since the filtering has already been done, you can discard some bits from ysc:
yout = fi(ysc, true, 16, -14);
Alternatively, you can set the filter output bit lengths directly (this is useful if you plan
on filtering many signals):
specifyall(h);
h.OutputWordLength = 16;
h.OutputFracLength = -14;
yout2 = filter(h, xsc);
You can verify that the results are the same either way:
norm(double(yout) - double(yout2))
ans =
0
9-87
Fixed-Point Design
However, if you compare this to the full precision output, you will notice that there is
rounding error due to the discarded bits:
norm(double(yout)-double(ysc))
ans =
1.446323386867543e+005
In this case the differences are hard to spot when plotting the data, as seen below:
stem(n(yidx), [double(yout(yidx)'), double(ysc(yidx)')]);
axis([850 950 -2.5e8 2.5e8]);
legend('Scaled Input', 'Output');
set(gcf, 'color', 'white');
Because the filter in this example has such a large gain, the output is at a different
scale than the input. This scaling is purely theoretical however, and you can scale the
9-88
data however you like. In this case, you have 16 bits for the output, but you can attach
whatever scaling you choose. It would be natural to reinterpret the output to have a
weight of 2^0 (or L = 0) for the LSB. This is equivalent to scaling the output signal down
by a factor of 2^(-14). However, there is no computation or rounding error involved. You
can do this by executing the following:
yri = fi(yout.int, true, 16, 0);
stem(n(idx)', [xscext, double(yri(yidx)')]);
axis([800 950 -1.5e4 1.5e4]);
legend('input', 'rescaled output');
This plot shows that the output is still larger than the input. If you had done the filtering
in double-precision floating-point, this would not be the case because here more bits
are being used for the output than for the input, so the MSBs are weighted differently.
You can see this another way by looking at the magnitude response of the scaled filter:
[H,w] = freqz(h);
plot(w/pi, 20*log10(2^(-14)*abs(H)));
9-89
Fixed-Point Design
This plot shows that the passband gain is still above 0 dB.
To put the input and output on the same scale, the MSBs must be weighted equally. The
input MSB has a weight of 2^11, whereas the scaled output MSB has a weight of 2^(29
14) = 2^15. You need to give the output MSB a weight of 2^11 as follows:
yf = fi(zeros(size(yri)), true, 16, 4);
yf.bin = yri.bin;
stem(n(idx)', [xscext, double(yf(yidx)')]);
legend('input', 'rescaled output');
9-90
9-91
Fixed-Point Design
Configure Filter Parameters to Work with Integers Using the set2int Method
Set the Filter Parameters to Work with Integers on page 9-93
Reinterpret the Output on page 9-94
9-92
The set2int method provides a convenient way of setting filter parameters to work with
integers. The method works by scaling the coefficients to integer numbers, and setting
the coefficients and input fraction length to zero. This makes it possible for you to use
floating-point coefficients directly.
h = dfilt.dffir(b);
h.Arithmetic = 'fixed';
The coefficients are represented with 18 bits and the input signal is represented with 12
bits:
g = set2int(h, 18, 12);
g_dB = 20*log10(g)
g_dB =
1.083707984390332e+002
The set2int method returns the gain of the filter by scaling the coefficients to integers,
so the gain is always a power of 2. You can verify that the gain we get here is consistent
with the gain of the filter previously. Now you can also check that the filter h is set up
properly to work with integers:
info(h)
Discrete-Time FIR Filter (real)
------------------------------Filter Structure : Direct-Form FIR
Filter Length
: 101
Stable
: Yes
Linear Phase
: Yes (Type 1)
Arithmetic
: fixed
Numerator
: s18,0 -> [-131072 131072)
Input
: s12,0 -> [-2048 2048)
Filter Internals : Full Precision
Output
: s31,0 -> [-1073741824 1073741824) (auto determined)
Product
: s29,0 -> [-268435456 268435456) (auto determined)
Accumulator: s31,0 -> [-1073741824 1073741824) (auto determined)
Round Mode
: No rounding
Overflow Mode
: No overflow
Here you can see that all fractional lengths are now set to zero, so this filter is set up
properly for working with integers.
9-93
Fixed-Point Design
You can compare the output to the double-precision floating-point reference output, and
verify that the computation done by the filter h is done in full precision.
yint = filter(h, xsc);
norm(yd - double(yint))
ans =
0
Once again, the plot shows that the input and output are at different scales. In order to
scale the output so that the signals can be compared more easily in a plot, you will need
9-94
to weigh the MSBs appropriately. You can compute the new fraction length using the
gain of the filter when the coefficients were integer numbers:
WL = yout.WordLength;
FL = yout.FractionLength + log2(g);
yf2 = fi(zeros(size(yout)), true, WL, FL);
yf2.bin = yout.bin;
stem(n(idx)', [xscext, double(yf2(yidx)')]);
axis([800 950 -2e3 2e3]);
legend('input', 'rescaled output');
This final plot shows the filtered data re-scaled to match the input scale.
Fixed-Point Design
9-96
10
C Code Generation
Learn how to generate code for signal processing applications.
Understanding C Code Generation on page 10-2
Functions and System Objects Supported for C Code Generation on page 10-4
C Code Generation from MATLAB on page 10-12
C Code Generation from Simulink on page 10-13
How to Run a Generated Executable Outside MATLAB on page 10-18
DSP System Toolbox Supported Hardware on page 10-19
10
C Code Generation
10-3
10
C Code Generation
Estimation
dsp.BurgAREstimator
dsp.BurgSpectrumEstimator
dsp.CepstralToLPC
dsp.CrossSpectrumEstimator
dsp.LevinsonSolver
dsp.LPCToAutocorrelation
dsp.LPCToCepstral
dsp.LPCToLSF
dsp.LPCToLSP
dsp.LPCToRC
dsp.LSFToLPC
dsp.LSPToLPC
dsp.RCToAutocorrelation
dsp.RCToLPC
dsp.SpectrumEstimator
dsp.TransferFunctionEstimator
Filters
ca2tf
10-4
Name
cl2tf
dsp.AdaptiveLatticeFilter
dsp.AffineProjectionFilter
dsp.AllpoleFilter
dsp.BiquadFilter
dsp.CICCompensationDecimator
dsp.CICCompensationInterpolator
dsp.CICDecimator
dsp.CICInterpolator
dsp.FarrowRateConverter
dsp.FastTransversalFilter
dsp.FilterCascade
dsp.FilteredXLMSFilter
dsp.FIRDecimator
dsp.FIRFilter
dsp.FIRHalfbandDecimator
10-5
10
C Code Generation
Name
dsp.FIRHalfbandInterpolator
dsp.FIRInterpolator
dsp.FIRRateConverter
dsp.FrequencyDomainAdaptiveFilter
dsp.HighpassFilter
dsp.IIRFilter
dsp.KalmanFilter
dsp.LMSFilter
dsp.LowpassFilter
dsp.RLSFilter
dsp.SampleRateConverter
firceqrip
fireqint
firgr
firhalfband
10-6
Name
firlpnorm
firminphase
firnyquist
firpr2chfb
ifir
iircomb
iirgrpdelay
iirlpnorm
10-7
10
C Code Generation
Name
iirlpnormc
iirnotch
iirparameq
iirpeak
tf2ca
tf2cl
Math Operations
dsp.ArrayVectorAdder
dsp.ArrayVectorDivider
dsp.ArrayVectorMultiplier
dsp.ArrayVectorSubtractor
dsp.CumulativeProduct
dsp.CumulativeSum
dsp.LDLFactor
dsp.LevinsonSolver
dsp.LowerTriangularSolver
dsp.LUFactor
dsp.Normalizer
dsp.UpperTriangularSolver
10-8
Name
Quantizers
dsp.ScalarQuantizerDecoder
dsp.ScalarQuantizerEncoder
dsp.VectorQuantizerDecoder
dsp.VectorQuantizerEncoder
Scopes
dsp.SpectrumAnalyzer
dsp.TimeScope
Signal Management
dsp.Counter
dsp.DelayLine
Signal Operations
dsp.Convolver
dsp.DCBlocker
dsp.Delay
dsp.DigitalDownConverter
dsp.DigitalUpConverter
dsp.Interpolator
dsp.NCO
dsp.PeakFinder
dsp.PhaseExtractor
dsp.PhaseUnwrapper
dsp.VariableFractionalDelay
dsp.VariableIntegerDelay
10-9
10
C Code Generation
Name
dsp.Window
dsp.ZeroCrossingDetector
Sinks
dsp.AudioPlayer
dsp.AudioFileWriter
dsp.UDPSender
Sources
dsp.AudioFileReader
dsp.AudioRecorder
dsp.SignalSource
dsp.SineWave
dsp.UDPReceiver
Statistics
dsp.Autocorrelator
dsp.Crosscorrelator
dsp.Histogram
dsp.Maximum
dsp.Mean
dsp.Median
dsp.Minimum
10-10
Name
dsp.PeakToPeak
dsp.PeakToRMS
dsp.RMS
dsp.StandardDeviation
dsp.StateLevels
dsp.Variance
Transforms
dsp.AnalyticSignal
dsp.DCT
dsp.FFT
dsp.IDCT
dsp.IFFT
10-11
10
C Code Generation
10-12
10-13
10
C Code Generation
Run the model and observe the output in both scopes. This model saves the filter
weights each time they adapt. You can plot the last set of coefficients using the following
command:
plot(filter_wts(:,:,1201))
10-14
) on your model
toolbar. After the model finishes generating code, the Code Generation Report appears,
allowing you to inspect the generated code. You may also notice that the build process
created a new subfolder inside of your current MATLAB working folder. The name of
this folder consists of the model name, followed by the suffix _grt_rtw. In the case
of this example, the subfolder that contains the generated C source code is named
ex_codegen_dsp_grt_rtw.
).
10-15
10
C Code Generation
Because you re-configured the model to generate and build code, the code generation
process continues until the code is compiled and linked.
Run the Generated Code
To run the generated code, enter the following command at the MATLAB prompt:
!ex_codegen_dsp
Running the generated code creates a MAT-file which contains the same variables as
those generated by simulating the model. The variables in the MAT-file are named with
a prefix of rt_. After you run the generated code, you can load the variables from the
MAT-file by typing the following command at the MATLAB prompt:
load ex_codegen_dsp.mat
You can now compare the variables from the generated code with the variables from the
model simulation. To plot the last set of coefficients from the generated code, enter the
following command at the MATLAB prompt:
plot(rt_filter_wts(:,:,1201))
The last set of coefficients from the generated code are shown in the following figure.
10-16
For further information on generating code from Simulink, see the Simulink Coder
documentation.
10-17
10
C Code Generation
Command
Mac
setenv DYLD_LIBRARY_PATH
$DYLD_LIBRARY_PATH: $MATLABROOT/
bin/maci64 (csh/tcsh)
export DYLD_LIBRARY_PATH
$DYLD_LIBRARY_PATH: $MATLABROOT/
bin/maci64 (Bash)
Linux
setenv LD_LIBRARY_PATH
$LD_LIBRARY_PATH: $MATLABROOT/
bin/glnxa64 (csh/tcsh)
export LD_LIBRARY_PATH
$LD_LIBRARY_PATH: $MATLABROOT/
bin/glnxa64 (Bash)
Windows
10-18
Vendor
Platforms
Earliest Release
Available
Last Release
Available
ARM Cortex-M
Processors
ARM
Windows, Mac,
Linux
R2013b
Current
ARM Cortex-A
Processors
ARM
Windows, Mac,
Linux
R2014b
Current
10-19
11
Define New System Objects
Summary List of Methods for Defining New System Objects on page 11-3
Define Basic System Objects on page 11-5
Change Number of Step Inputs or Outputs on page 11-7
Specify System Block Input and Output Names on page 11-11
Validate Property and Input Values on page 11-13
Initialize Properties and Setup One-Time Calculations on page 11-16
Set Property Values at Construction Time on page 11-19
Reset Algorithm State on page 11-21
Define Property Attributes on page 11-23
Hide Inactive Properties on page 11-27
Limit Property Values to Finite String Set on page 11-29
Process Tuned Properties on page 11-32
Release System Object Resources on page 11-34
Define Composite System Objects on page 11-36
Define Finite Source Objects on page 11-39
Save System Object on page 11-41
Load System Object on page 11-45
Clone System Object on page 11-49
Define System Object Information on page 11-50
Define System Block Icon on page 11-52
Add Header to System Block Dialog on page 11-54
Add Property Groups to System Object and Block Dialog on page 11-56
Control Simulation Type in System Block Dialog on page 11-61
Add Button to System Block Dialog Box on page 11-63
Specify Locked Input Size on page 11-66
11
11-2
11
resetImpl
saveObjectImpl
setProperties
setupImpl
showSimulateUsingImpl
stepImpl
supportsMultipleInstanceImpl
updateImpl
validateInputsImpl
validatePropertiesImpl
11-4
Create a MATLAB file named AddOne.m to contain the definition of your System
object.
edit AddOne.m
Subclass your object from matlab.System. Insert this line as the first line of your
file.
classdef AddOne < matlab.System
Add the stepImpl method, which contains the algorithm that runs when users call
the step method on your object. You always set the stepImpl method access to
protected because it is an internal method that users do not directly call or run.
All methods, except static methods, expect the System object handle as the first
input argument. You can use any name for your System object handle.
In this example, instead of passing in the object handle, ~ is used to indicate that
the object handle is not used in the function. Using ~ instead of an object handle
prevents warnings about unused variables from occurring.
By default, the number of inputs and outputs are both one. To change the number
of inputs or outputs, use the getNumInputsImpl or getNumOutputsImpl method,
respectively.
methods (Access = protected)
function y = stepImpl(~,x)
y = x + 1;
end
end
Note: Instead of manually creating your class definition file, you can use an option on
the New > System Object menu to open a template. The Basic template opens a simple
11-5
11
System object template. The Advanced template includes more advanced features of
System objects, such as backup and restore. The Simulink Extension template includes
additional customizations of the System object for use in the Simulink MATLAB System
block. You then can edit the template file, using it as guideline, to create your own
System object.
Complete Class Definition File for Basic System Object
classdef AddOne < matlab.System
% ADDONE Compute an output value one greater than the input value
% All methods occur inside a methods declaration.
% The stepImpl method has protected access
methods (Access = protected)
function y = stepImpl(~,x)
y = x + 1;
end
end
end
See Also
Related Examples
More About
11-6
11-7
11
end
function validatePropertiesImpl(obj)
if ~((obj.numInputsOutputs == 2) ||...
(obj.numInputsOutputs == 3))
error('Only 2 or 3 input and outputs allowed.');
end
end
function numIn = getNumInputsImpl(obj)
numIn = 3;
if (obj.numInputsOutputs == 2)
numIn = 2;
end
end
function numOut = getNumOutputsImpl(obj)
numOut = 3;
if (obj.numInputsOutputs == 2)
numOut = 2;
end
end
end
Use this syntax to run the algorithm with two inputs and two outputs.
x1 = 3;
x2 = 7;
[y1,y2] = step(AddOne,x1,x2);
To change the number of inputs or outputs, you must release the object before rerunning
it.
release(AddOne)
x1 = 3;
x2 = 7;
x3 = 10
[y1,y2,y3] = step(AddOne,x1,x2,x3);
11-8
11-9
11
end
See Also
getNumInputsImpl | getNumOutputsImpl
Related Examples
More About
11-10
11-11
11
See Also
Related Examples
More About
11-12
This example shows how to validate the value of two interdependent properties using the
validatePropertiesImpl method. In this case, the UseIncrement property value
must be true and the WrapValue property value must be less than the Increment
property value.
methods (Access = protected)
function validatePropertiesImpl(obj)
if obj.UseIncrement && obj.WrapValue > obj.Increment
error('Wrap value must be less than increment value');
end
end
end
Validate Inputs
This example shows how to validate that the first input is a numeric value.
methods (Access = protected)
function validateInputsImpl(~,x)
if ~isnumeric(x)
error('Input must be numeric');
end
end
11-13
11
end
11-14
else
out = in + 1;
end
end
end
end
Note: All inputs default to variable-size inputs. See Change Input Complexity or
Dimensions for more information.
See Also
validateInputsImpl | validatePropertiesImpl
Related Examples
More About
11-15
11
Define Setup
You use the setupImpl method to perform setup and initialization tasks. You should
include code in the setupImpl method that you want to execute one time only. The
setupImpl method is called once during the first call to the step method. In this
example, you allocate file resources by opening the file for writing binary data.
methods
function setupImpl(obj)
obj.pFileID = fopen(obj.Filename,'wb');
if obj.pFileID < 0
error('Opening the file failed');
11-16
end
end
end
Although not part of setup, you should close files when your code is done using them. You
use the releaseImpl method to release resources.
Complete Class Definition File with Initialization and Setup
classdef MyFile < matlab.System
% MyFile write numbers to a file
% These properties are nontunable. They cannot be changed
% after the setup or step method has been called.
properties (Nontunable)
Filename = 'default.bin' % the name of the file to create
end
% These properties are private. Customers can only access
% these properties through methods on this object
properties (Hidden,Access = private)
pFileID; % The identifier of the file to open
end
methods (Access = protected)
% In setup allocate any resources, which in this case
% means opening the file.
function setupImpl(obj)
obj.pFileID = fopen(obj.Filename,'wb');
if obj.pFileID < 0
error('Opening the file failed');
end
end
% This System object writes the input to the file.
function stepImpl(obj,data)
fwrite(obj.pFileID,data);
end
% Use release to close the file to prevent the
% file handle from being left open.
function releaseImpl(obj)
fclose(obj.pFileID);
end
end
11-17
11
end
See Also
Related Examples
More About
11-18
11-19
11
end
methods (Access = protected)
% In setup allocate any resources, which in this case is
% opening the file.
function setupImpl(obj)
obj.pFileID = fopen(obj.Filename,obj.Access);
if obj.pFileID < 0
error('Opening the file failed');
end
end
% This System object writes the input to the file.
function stepImpl(obj,data)
fwrite(obj.pFileID,data);
end
% Use release to close the file to prevent the
% file handle from being left open.
function releaseImpl(obj)
fclose(obj.pFileID);
end
end
end
See Also
nargin | setProperties
Related Examples
11-20
11-21
11
end
See Also
resetImpl
More About
11-22
11-23
11
11-24
11-25
11
end
More About
11-26
Class Attributes
Property Attributes
11-27
11
c = obj.pCount;
end
% Reset the counter to either a random value or the initial
% value.
function resetImpl(obj)
if obj.UseRandomInitialValue
obj.pCount = rand();
else
obj.pCount = obj.InitialValue;
end
end
% This method controls visibility of the object's properties
function flag = isInactivePropertyImpl(obj,propertyName)
if strcmp(propertyName,'InitialValue')
flag = obj.UseRandomInitialValue;
else
flag = false;
end
end
end
end
See Also
isInactivePropertyImpl
11-28
11-29
11
end
function releaseImpl(obj)
cla(Whiteboard.getWhiteboard());
hold on
end
end
methods (Static)
function a = getWhiteboard()
h = findobj('tag','whiteboard');
if isempty(h)
h = figure('tag','whiteboard');
hold on
end
a = gca;
end
end
end
11-30
type('Whiteboard.m');
See Also
matlab.system.StringSet
11-31
11
11-32
(1+log(1:obj.NumNotes)/log(12));
end
function hz = stepImpl(obj,noteShift)
% A noteShift value of 1 corresponds to obj.MiddleC
hz = obj.pLookupTable(noteShift);
end
function processTunedPropertiesImpl(obj)
propChange = isChangedProperty(obj,obj.NumNotes)||...
isChangedProperty(obj,obj.MiddleC)
if propChange
obj.pLookupTable = obj.MiddleC *...
(1+log(1:obj.NumNotes)/log(12));
end
end
end
See Also
processTunedPropertiesImpl
11-33
11
11-34
end
end
methods (Static)
function a = getWhiteboard()
h = findobj('tag','whiteboard');
if isempty(h)
h = figure('tag','whiteboard');
hold on
end
a = gca;
end
end
end
See Also
releaseImpl
Related Examples
11-35
11
11-36
end
methods
function obj = Filter(varargin)
setProperties(obj,nargin,varargin{:});
% Create instances of FIR and IIR as
% private properties
obj.pZero = Zero(obj.zero);
obj.pPole = Pole(obj.pole);
end
end
methods (Access = protected)
function setupImpl(obj,x)
setup(obj.pZero,x);
setup(obj.pPole,x);
end
function resetImpl(obj)
reset(obj.pZero);
reset(obj.pPole);
end
function y = stepImpl(obj,x)
y = step(obj.pZero,x) + step(obj.pPole,x);
end
function releaseImpl(obj)
release(obj.pZero);
release(obj.pPole);
end
end
end
11-37
11
methods
function obj = Pole(varargin)
setProperties(obj,nargin,varargin{:},'Den');
end
end
methods (Access = protected)
function y = stepImpl(obj,x)
y = x + obj.tap * obj.Den;
obj.tap = y;
end
end
end
See Also
nargin
11-38
Specify the end of the source with the isDoneImpl method. In this example, the
source has two iterations.
methods (Access = protected)
function bDone = isDoneImpl(obj)
bDone = obj.NumSteps==2
end
11-39
11
bDone = obj.NumSteps==2;
end
end
end
See Also
matlab.system.mixin.FiniteSource
More About
11-40
11-41
11
end
end
classdef MySaveLoader < matlab.System
properties (Access = private)
child
pdependentprop = 1
end
properties (Access = protected)
protectedprop = rand;
end
properties (DiscreteState = true)
state
end
properties (Dependent)
dependentprop
end
methods
function obj = MySaveLoader(varargin)
[email protected]();
setProperties(obj,nargin,varargin{:});
end
function set.dependentprop(obj, value)
obj.pdependentprop = min(value, 5);
end
function value = get.dependentprop(obj)
value = obj.pdependentprop;
end
end
methods (Access = protected)
function setupImpl(obj)
obj.state = 42;
obj.child = Counter;
end
function out = stepImpl(obj,in)
obj.state = in + obj.state + obj.protectedprop + obj.pdependentprop;
out = step(obj.child, obj.state);
11-42
end
end
% Serialization
methods (Access = protected)
function s = saveObjectImpl(obj)
% Call the base class method
s = [email protected](obj);
% Save the child System objects
s.child = matlab.System.saveObject(obj.child);
% Save the protected & private properties
s.protectedprop = obj.protectedprop;
s.pdependentprop = obj.pdependentprop;
% Save the state only if object locked
if isLocked(obj)
s.state = obj.state;
end
end
function loadObjectImpl(obj,s,wasLocked)
% Load child System objects
obj.child = matlab.System.loadObject(s.child);
% Load protected and private properties
obj.protectedprop = s.protectedprop;
obj.pdependentprop = s.pdependentprop;
% Load the state only if object locked
if wasLocked
obj.state = s.state;
end
% Call base class method to load public properties
[email protected](obj,s,wasLocked);
end
end
end
See Also
loadObjectImpl | saveObjectImpl
11-43
11
Related Examples
11-44
11-45
11
end
end
end
classdef MySaveLoader < matlab.System
properties (Access = private)
child
pdependentprop = 1
end
properties (Access = protected)
protectedprop = rand;
end
properties (DiscreteState = true)
state
end
properties (Dependent)
dependentprop
end
methods
function obj = MySaveLoader(varargin)
[email protected]();
setProperties(obj,nargin,varargin{:});
end
function set.dependentprop(obj, value)
obj.pdependentprop = min(value, 5);
end
function value = get.dependentprop(obj)
value = obj.pdependentprop;
end
end
methods (Access = protected)
function setupImpl(obj)
obj.state = 42;
obj.child = Counter;
end
function out = stepImpl(obj,in)
obj.state = in + obj.state + obj.protectedprop + obj.pdependentprop;
11-46
11-47
11
end
See Also
loadObjectImpl | saveObjectImpl
Related Examples
11-48
See Also
11-49
11
11-50
function y = stepImpl(obj,u)
if (u > obj.Threshold)
obj.Count = obj.Count + 1;
end
y = obj.Count;
end
function s = infoImpl(obj,varargin)
if nargin>1 && strcmp('details',varargin(1))
s = struct('Name','Counter',...
'Properties', struct('CurrentCount', ...
obj.pCount,'Threshold',obj.Threshold));
else
s = struct('Count',obj.pCount);
end
end
end
See Also
infoImpl
11-51
11
Use getIconImpl to specify the block icon as New Counter with a line break (\n)
between the two words.
methods (Access = protected)
function icon = getIconImpl(~)
icon = sprintf('New\nCounter');
end
end
11-52
function resetImpl(obj)
obj.Count = 0;
end
function y = stepImpl(obj,u)
if (u > obj.Threshold)
obj.Count = obj.Count + 1;
end
y = obj.Count;
end
function icon = getIconImpl(~)
icon = sprintf('New\nCounter');
end
end
end
See Also
matlab.system.mixin.CustomIcon | getIconImpl
More About
11-53
11
11-54
See Also
matlab.system.display.Header | getHeaderImpl
11-55
11
11-56
Complete Class Definition File with Property Group and Separate Tab
classdef EnhancedCounter < matlab.System
% EnhancedCounter Count values considering thresholds
properties
UpperThreshold = 1;
LowerThreshold = 0;
end
properties (Nontunable)
StartValue = 0;
end
properties(Logical,Nontunable)
% Count values less than lower threshold
UseLowerThreshold = true;
end
properties (DiscreteState)
Count;
end
methods (Static, Access = protected)
function groups = getPropertyGroupsImpl
upperGroup = matlab.system.display.Section(...
'Title', 'Upper threshold', ...
'PropertyList',{'UpperThreshold'});
lowerGroup = matlab.system.display.Section(...
'Title','Lower threshold', ...
'PropertyList',{'UseLowerThreshold','LowerThreshold'});
thresholdGroup = matlab.system.display.SectionGroup(...
'Title', 'Parameters', ...
11-57
11
'Sections',
[upperGroup,lowerGroup]);
valuesGroup = matlab.system.display.SectionGroup(...
'Title', 'Initial conditions', ...
'PropertyList', {'StartValue'});
groups = [thresholdGroup, valuesGroup];
end
end
methods (Access = protected)
function setupImpl(obj)
obj.Count = obj.StartValue;
end
function y = stepImpl(obj,u)
if obj.UseLowerThreshold
if (u > obj.UpperThreshold) || ...
(u < obj.LowerThreshold)
obj.Count = obj.Count + 1;
end
else
if (u > obj.UpperThreshold)
obj.Count = obj.Count + 1;
end
end
y = obj.Count;
end
function resetImpl(obj)
obj.Count = obj.StartValue;
end
11-58
end
11-59
11
See Also
matlab.system.display.Section | matlab.system.display.SectionGroup |
getPropertyGroupsImpl
More About
11-60
11-61
11
methods
function obj = ActionDemo(varargin)
setProperties(obj,nargin,varargin{:});
end
function visualize(obj)
figure;
d = 1:obj.RampLimit;
plot(d);
end
methods(Static,Access = protected)
end
end
end
See Also
getSimulateUsingImpl | showSimulateUsingImpl
More About
11-62
11-63
11
See Also
getPropertyGroupsImpl
11-64
More About
11-65
11
11-66
end
y = obj.Count;
end
function flag = isInputSizeLockedImpl(~,~)
flag = true;
end
end
end
See Also
isInputSizeLockedImpl
11-67
11
11-68
end
y = obj.Count;
end
function resetImpl(obj)
obj.Count = 0;
end
function [sz,dt,cp] = getDiscreteStateSpecificationImpl(~,name)
if strcmp(name,'Count')
sz = [1 1];
dt = 'double';
cp = false;
else
error(['Error: Incorrect State Name: 'name'.']);
end
end
function dataout = getOutputDataTypeImpl(~)
dataout = 'double';
end
function sizeout = getOutputSizeImpl(~)
sizeout = [1 1];
end
function cplxout = isOutputComplexImpl(~)
cplxout = false;
end
function fixedout = isOutputFixedSizeImpl(~)
fixedout = true;
end
end
end
See Also
matlab.system.mixin.Propagates | getOutputSizeImpl
More About
11-69
11
Use the getOutputDataTypeImpl method to specify the output data type as a double.
methods (Access = protected)
function dataout = getOutputDataTypeImpl(~)
dataout = 'double';
end
end
11-70
if (u2)
obj.Count = 0;
elseif (u1 > obj.Threshold)
obj.Count = obj.Count + 1;
end
y = obj.Count;
end
function [sz,dt,cp] = getDiscreteStateSpecificationImpl(~,name)
if strcmp(name,'Count')
sz = [1 1];
dt = 'double';
cp = false;
else
error(['Error: Incorrect State Name: 'name'.']);
end
end
function dataout = getOutputDataTypeImpl(~)
dataout = 'double';
end
function sizeout = getOutputSizeImpl(~)
sizeout = [1 1];
end
function cplxout = isOutputComplexImpl(~)
cplxout = false;
end
function fixedout = isOutputFixedSizeImpl(~)
fixedout = true;
end
end
end
See Also
matlab.system.mixin.Propagates | getOutputDataTypeImpl
More About
11-71
11
11-72
if (u2)
obj.Count = 0;
elseif (u1 > obj.Threshold)
obj.Count = obj.Count + 1;
end
y = obj.Count;
end
function [sz,dt,cp] = getDiscreteStateSpecificationImpl(~,name)
if strcmp(name,'Count')
sz = [1 1];
dt = 'double';
cp = false;
else
error(['Error: Incorrect State Name: 'name'.']);
end
end
function dataout = getOutputDataTypeImpl(~)
dataout = 'double';
end
function sizeout = getOutputSizeImpl(~)
sizeout = [1 1];
end
function cplxout = isOutputComplexImpl(~)
cplxout = false;
end
function fixedout = isOutputFixedSizeImpl(~)
fixedout = true;
end
end
end
See Also
matlab.system.mixin.Propagates | isOutputComplexImpl
More About
11-73
11
Use the isOutputFixedSizeImpl method to specify that the output is fixed size.
methods (Access = protected)
function fixedout = isOutputFixedSizeImpl(~)
fixedout = true;
end
end
11-74
if (u2)
obj.Count = 0;
elseif (u1 > obj.Threshold)
obj.Count = obj.Count + 1;
end
y = obj.Count;
end
function [sz,dt,cp] = getDiscreteStateSpecificationImpl(~,name)
if strcmp(name,'Count')
sz = [1 1];
dt = 'double';
cp = false;
else
error(['Error: Incorrect State Name: 'name'.']);
end
end
function dataout = getOutputDataTypeImpl(~)
dataout = 'double';
end
function sizeout = getOutputSizeImpl(~)
sizeout = [1 1];
end
function cplxout = isOutputComplexImpl(~)
cplxout = false;
end
function fixedout = isOutputFixedSizeImpl(~)
fixedout = true;
end
end
end
See Also
matlab.system.mixin.Propagates | isOutputFixedSizeImpl
More About
11-75
11
11-76
obj.Count = 0;
end
function y = stepImpl(obj,u1,u2)
% Add to count if u1 is above threshold
% Reset if u2 is true
if (u2)
obj.Count = 0;
elseif (u1 > obj.Threshold)
obj.Count = obj.Count + 1;
end
y = obj.Count;
end
function [sz,dt,cp] = getDiscreteStateSpecificationImpl(~,name)
sz = [1 1];
dt = 'double';
cp = false;
end
function dataout = getOutputDataTypeImpl(~)
dataout = 'double';
end
function sizeout = getOutputSizeImpl(~)
sizeout = [1 1];
end
function cplxout = isOutputComplexImpl(~)
cplxout = false;
end
function fixedout = isOutputFixedSizeImpl(~)
fixedout = true;
end
end
end
See Also
matlab.system.mixin.Propagates | getDiscreteStateSpecificationImpl
More About
11-77
11
11-78
11-79
11
end
function flag = isInputDirectFeedthroughImpl(~,~)
flag = false;
end
end
end
See Also
matlab.system.mixin.Nondirect | isInputDirectFeedthroughImpl |
outputImpl | updateImpl
More About
11-80
11-81
11
end
function setupImpl(obj)
obj.count = 0;
end
function resetImpl(obj)
obj.count = 0;
end
function flag = supportsMultipleInstanceImpl(obj)
flag = obj.useSeed;
end
end
end
See Also
matlab.System | supportsMultipleInstanceImpl
11-82
Methods Timing
Methods Timing
In this section...
Setup Method Call Sequence on page 11-83
Step Method Call Sequence on page 11-83
Reset Method Call Sequence on page 11-84
Release Method Call Sequence on page 11-85
11-83
11
11-84
Methods Timing
See Also
Related Examples
More About
Common Methods
11-85
11
11-86
11-87
11
11-88
obj.pMethodHandle = @myMethod1;
else
obj.pMethodHandle = @myMethod2;
end
end
function y = stepImpl(obj,x)
myFun = obj.pMethodHandle;
for p=1:1000
y = myFun(obj,x)
end
end
end
function y = myMethod1(x)
y = x+1;
end
function y = myMethod2(x)
y = x-1;
end
end
If the number of System object inputs does not change, do not implement the
getNumInputsImpl method. Also do not implement the getNumInputsImpl
method when you explicitly list the inputs in the stepImpl method instead of using
varargin. The same caveats apply to the getNumOutputsImpl and varargout
outputs.
For the getNumInputsImpl and getNumOutputsImpl methods, if you set the return
argument from an object property, that object property must have the Nontunable
attribute.
If the variables in a method do not need to retain their values between calls use local
scope for those variables in that method.
For properties that do not change, define them in as Nontunable properties.
Tunable properties have slower access times than Nontunable properties
Use the protected or private attribute instead of the public attribute for a
property, whenever possible. Some public properties have slower access times than
protected and private properties.
Avoid using customized step, get, or set methods, whenever possible.
Avoid using string comparisons within customized step, get, or set methods,
whenever possible. Use setupImpl for string comparisons instead.
For best practices for including System objects in code generation, see System
Objects in MATLAB Code Generation.
11-89
12
HDL Code Generation
What is HDL Code Generation? on page 12-2
HDL Code Generation Support for DSP System Toolbox on page 12-3
Find Blocks and System Objects Supporting HDL Code Generation on page
12-6
12
12-2
Blocks
You can find DSP System Toolbox blocks that support HDL code generation, in the DSP
System Toolbox HDL Support' library, in the Simulink library browser. Alternately, you
can type dsphdllib in the MATLAB command prompt to open this library. The blocks
in dsphdllib have their parameters set for HDL code generation.
Filtering
Biquad Filter
CIC Decimation
CIC Interpolation
DC Blocker
Discrete FIR Filter
FIR Decimation
FIR Interpolation
LMS Filter
Math Functions
Complex to Magnitude-Angle HDL Optimized
Signal Operations
Downsample
NCO
NCO HDL Optimized
Repeat
Upsample
12-3
12
Signal Management
Convert 1-D to 2-D
Data Type Conversion
Frame Conversion
Multiport Selector
Selector
Variable Selector
Sinks
These blocks can be used for simulation visibility in models that generate HDL code, but
are not included in the hardware implementation.
Display
Matrix Viewer
To Workspace
Spectrum Analyzer
Time Scope
Vector Scope
Waterfall
Statistics
Maximum
Minimum
Transforms
FFT HDL Optimized
IFFT HDL Optimized
System Objects
HDL Coder supports the following DSP System Toolbox System objects for HDL code
generation:
12-4
Filtering
dsp.BiquadFilter
dsp.DCBlocker
dsp.FIRFilter
Math Functions
dsp.HDLComplexToMagnitudeAngle
Signal Operations
dsp.Delay
dsp.HDLNCO
Statistics
dsp.Maximum
dsp.Minimum
Transforms
dsp.HDLFFT
dsp.HDLIFFT
12-5
12
System Objects
To find System objects supported for HDL code generation, see Predefined System
Objects in the HDL Coder documentation.
12-6
13
Links to Category Pages
Signal Management Library on page 13-2
Sinks Library on page 13-3
Math Functions Library on page 13-4
Filtering Library on page 13-5
13
13-2
Sinks Library
Sinks Library
You can find the relevant blocks in the following pages:
Signal Import and Export
Scopes and Data Logging
13-3
13
13-4
Filtering Library
Filtering Library
You can find the relevant blocks in the following pages:
Filter Design
Single-Rate Filters
Multirate and Multistage Filters
Adaptive Filters
13-5
14
Designing Lowpass FIR Filters
Lowpass FIR Filter Design on page 14-2
Controlling Design Specifications in Lowpass FIR Design on page 14-7
Designing Filters with Non-Equiripple Stopband on page 14-13
Minimizing Lowpass FIR Filter Length on page 14-18
14
We can design this lowpass filter using the window method. For example, we can use a
Hamming window or a Dolph-Chebyshev window:
Hd1 = design(Hf,'window','window',@hamming,'systemobject',true);
Hd2 = design(Hf,'window','window',{@chebwin,50}, ...
'systemobject',true);
hfvt = fvtool(Hd1,Hd2,'Color','White');
legend(hfvt,'Hamming window design', ...
'Dolph-Chebyshev window design')
14-2
The choice of filter was arbitrary. Since ideally the order should be infinite, in general,
a larger order results in a better approximation to ideal at the expense of a more costly
implementation. For instance, with a Dolph-Chebyshev window, we can decrease the
transition region by increasing the filter order:
Hf.FilterOrder = 200;
Hd3 = design(Hf,'window','window',{@chebwin,50},...
'systemobject',true);
hfvt2 = fvtool(Hd2,Hd3,'Color','White');
legend(hfvt2,'Dolph-Chebyshev window design. Order = 100',...
'Dolph-Chebyshev window design. Order = 200')
14-3
14
We can still use the window method, along with a Kaiser window, to design the low pass
filter.
Hd4 = design(Hf,'kaiserwin','systemobject',true);
14-4
measure(Hd4)
ans =
Sampling Frequency
Passband Edge
3-dB Point
6-dB Point
Stopband Edge
Passband Ripple
Stopband Atten.
Transition Width
:
:
:
:
:
:
:
:
One thing to note is that the transition width as specified is centered around the cutoff
frequency of 0.4 pi. This will become the point at which the gain of the lowpass filter is
half the passband gain (or the point at which the filter reaches 6 dB of attenuation).
Optimal Minimum Order Designs
The Kaiser window design is not an optimal design and as a result the filter order
required to meet the specifications using this method is larger than it needs to be.
Equiripple designs result in the lowpass filter with the smallest possible order to meet a
set of specifications.
Hd5 = design(Hf,'equiripple','systemobject',true);
hfvt3 = fvtool(Hd4,Hd5,'Color','White');
legend(hfvt3,'Kaiser window design','Equiripple design')
14-5
14
In this case, 146 coefficients are needed by the equiripple design while 183 are needed by
the Kaiser window design.
14-6
Set the number of coefficients to 101, which means setting the order to 100:
N = 100;
% order = 100 -> 101 coefficients
Fc = 0.4;
setspecs(Hf,'N,Fc,Ap,Ast',N,Fc,Ap,Ast);
Measure the filter variables of the second equiripple filter, and compare the graphs of the
first and second filters:
measure(Hd2)
hfvt = fvtool(Hd1,Hd2,'Color','White');
legend(hfvt,'Equiripple design, 146 coeffcients', ...
14-7
14
:
:
:
:
:
:
:
:
Notice that the transition has increased by almost 50%. This is not surprising given the
almost 50% difference between 101 coefficients and 146 coefficients.
Controlling the Transition Region Width
Another option when the number of coefficients is set is to maintain the transition width
at the expense of control over the passband ripple/stopband attenuation.
14-8
setspecs(Hf,'N,Fp,Fst',N,Fp,Fst);
Hd3 = design(Hf,'equiripple','systemobject',true);
measure(Hd3)
hfvt2 = fvtool(Hd1,Hd3,'Color','White');
legend(hfvt2,'Equiripple design, 146 coefficients',...
'Equiripple design, 101 coefficients')
Sampling Frequency
Passband Edge
3-dB Point
6-dB Point
Stopband Edge
Passband Ripple
Stopband Atten.
Transition Width
:
:
:
:
:
:
:
:
Note that in this case, the differences between using 146 coefficients and using 101
coefficients is reflected in a larger passband ripple and a smaller stopband attenuation.
14-9
14
It is possible to increase the attenuation in the stopband while keeping the same filter
order and transition width by the use of weights. Weights are a way of specifying the
relative importance of the passband ripple versus the stopband attenuation. By default,
passband and stopband are equally weighted (a weight of one is assigned to each). If we
increase the stopband weight, we can increase the stopband attenuation at the expense of
increasing the stopband ripple as well.
Hd4 = design(Hf,'equiripple','Wstop',5,'systemobject',true);
measure(Hd4)
hfvt3 = fvtool(Hd3,Hd4,'Color','White');
legend(hfvt3,'Passband weight = 1, Stopband weight = 1',...
'Passband weight = 1, Stopband weight = 5')
Sampling Frequency
Passband Edge
3-dB Point
6-dB Point
Stopband Edge
Passband Ripple
Stopband Atten.
Transition Width
14-10
:
:
:
:
:
:
:
:
Another possibility is to specify the exact stopband attenuation desired and lose control
over the passband ripple. This is a powerful and very desirable specification. One has
control over most parameters of interest.
setspecs(Hf,'N,Fp,Fst,Ast',N,Fp,Fst,Ast);
Hd5 = design(Hf,'equiripple','systemobject',true);
hfvt4 = fvtool(Hd4,Hd5,'Color','White');
legend(hfvt4,'Equiripple design using weights',...
'Equiripple design constraining the stopband')
14-11
14
14-12
Equiripple designs achieve optimality by distributing the deviation from the ideal
response uniformly. This has the advantage of minimizing the maximum deviation
(ripple). However, the overall deviation, measured in terms of its energy tends to be
large. This may not always be desirable. When low pass filtering a signal, this implies
that remnant energy of the signal in the stopband may be relatively large. When this is a
concern, least-squares methods provide optimal designs that minimize the energy in the
stopband.
Hd1 = design(Hf,'equiripple','systemobject',true);
Hd2 = design(Hf,'firls','systemobject',true);
hfvt = fvtool(Hd1,Hd2,'Color','White');
legend(hfvt,'Equiripple design','Least-squares design')
14-13
14
Notice how the attenuation in the stopband increases with frequency for the leastsquares designs while it remains constant for the equiripple design. The increased
attenuation in the least-squares case minimizes the energy in that band of the signal to
be filtered.
Equiripple Designs with Increasing Stopband Attenuation
An often undesirable effect of least-squares designs is that the ripple in the passband
region close to the passband edge tends to be large. For low pass filters in general, it
is desirable that passband frequencies of a signal to be filtered are affected as little
as possible. To this extent, an equiripple passband is generally preferable. If it is still
desirable to have an increasing attenuation in the stopband, we can use design options
for equiripple designs to achieve this.
Hd3 = design(Hf,'equiripple','StopbandShape','1/f',...
'StopbandDecay',4,'systemobject',true);
hfvt2 = fvtool(Hd2,Hd3,'Color','White');
14-14
legend(hfvt2,'Least-squares design',...
'Equiripple design with stopband decaying as (1/f)^4')
Notice that the stopbands are quite similar. However the equiripple design has a
significantly smaller passband ripple,
mls = measure(Hd2);
meq = measure(Hd3);
mls.Apass
meq.Apass
ans =
0.3504
ans =
14-15
14
0.1867
Filters with a stopband that decays as (1/f)^M will decay at 6M dB per octave. Another
way of shaping the stopband is using a linear decay. For example given an approximate
attenuation of 38 dB at 0.4*pi, if an attenuation of 70 dB is desired at pi, and a linear
decay is to be used, the slope of the line is given by (70-38)/(1-0.4) = 53.333. Such a design
can be achieved from:
Hd4 = design(Hf,'equiripple','StopbandShape','linear',...
'StopbandDecay',53.333,'systemobject',true);
hfvt3 = fvtool(Hd3,Hd4,'Color','White');
legend(hfvt3,'Equiripple design with stopband decaying as (1/f)^4',...
'Equiripple design with stopband decaying linearly and a slope of 53.333')
Yet another possibility is to use an arbitrary magnitude specification and select two
bands (one for the passband and one for the stopband). Then, by using weights for the
second band, it is possible to increase the attenuation throughout the band.
14-16
N = 100;
B = 2; % number of bands
F = [0 .38 .42:.02:1];
A = [1 1 zeros(1,length(F)-2)];
W = linspace(1,100,length(F)-2);
Harb = fdesign.arbmag('N,B,F,A',N,B,F(1:2),A(1:2),F(3:end),...
A(3:end));
Ha = design(Harb,'equiripple','B2Weights',W,...
'systemobject',true);
fvtool(Ha,'Color','White')
14-17
14
So far, we have only considered linear-phase designs. Linear phase is desirable in many
applications. Nevertheless, if linear phase is not a requirement, minimum-phase designs
can provide significant improvements over linear phase counterparts. For instance,
returning to the minimum order case, a minimum-phase/minimum-order design for the
same specifications can be computed with:
Hd1 = design(Hf,'equiripple','systemobject',true);
Hd2 = design(Hf,'equiripple','minphase',true,...
'systemobject',true);
hfvt = fvtool(Hd1,Hd2,'Color','White');
legend(hfvt,'Linear-phase equiripple design',...
'Minimum-phase equiripple design')
14-18
Notice that the number of coefficients has been reduced from 146 to 117. As a second
example, consider the design with a stopband decaying in linear fashion. Notice the
increased stopband attenuation. The passband ripple is also significantly smaller.
setspecs(Hf,'N,Fp,Fst',N,Fp,Fst);
Hd3 = design(Hf,'equiripple','StopbandShape','linear',...
'StopbandDecay',53.333,'systemobject',true);
setspecs(Hf,'Fp,Fst,Ap,Ast',Fp,Fst,Ap,Ast);
Hd4 = design(Hf,'equiripple','StopbandShape','linear',...
'StopbandDecay',53.333,'minphase',true,'systemobject',true);
hfvt2 = fvtool(Hd3,Hd4,'Color','White');
legend(hfvt2,'Linear-phase equiripple design with linearly decaying stopband',...
'Minimum-phase equiripple design with linearly decaying stopband')
14-19
14
14-20
The number of nonzero coefficients required in the IFIR case is 111. Less than both the
equiripple linear-phase and minimum-phase designs.
14-21
15
FDATool: A Filter Design and Analysis
GUI
Overview on page 15-2
Using FDATool on page 15-6
Importing a Filter Design on page 15-35
15
Overview
In this section...
FDATool on page 15-2
Filter Design Methods on page 15-2
Using the Filter Design and Analysis Tool on page 15-3
Analyzing Filter Responses on page 15-4
Filter Design and Analysis Tool Panels on page 15-4
Getting Help on page 15-5
FDATool
The Filter Design and Analysis Tool (FDATool) is a user interface for designing and
analyzing filters quickly. FDATool enables you to design digital FIR or IIR filters by
setting filter specifications, by importing filters from your MATLAB workspace, or by
adding, moving or deleting poles and zeros. FDATool also provides tools for analyzing
filters, such as magnitude and phase response and pole-zero plots.
15-2
Design Method
Function
Butterworth
butter
Chebyshev Type I
cheby1
Chebyshev Type II
cheby2
Elliptic
ellip
Maximally Flat
maxflat
Equiripple
firpm
Least-squares
firls
Constrained least-squares
fircls
Complex equiripple
cfirpm
Overview
Design Method
Function
Window
fir1
When using the window method in FDATool, all Signal Processing Toolbox window
functions are available, and you can specify a user-defined window by entering its
function name and input parameter.
Advanced Filter Design Methods
The following advanced filter design methods are available if you have DSP System
Toolbox software.
Design Method
Function
firceqrip
fircband
firgr
firhalfband
firlpnorm
firnyquist
Interpolated FIR
ifir
iircomb
iirgrpdelay
iirlpnorm
iirlpnormc
iirnotch
iirpeak
15
You can specify the filter by its type alone, along with certain frequency- or timedomain specifications such as passband frequencies and stopband frequencies. The
filter you design is then computed using the default filter design method and filter
order.
Overview
Getting Help
At any time, you can right-click or click the What's this? button,
, to get information
on the different parts of the tool. You can also use the Help menu to see complete Help
information.
15-5
15
Using FDATool
To open FDATool, type
fdatool
Note that when you open FDATool, Design Filter is not enabled. You must make a
change to the default filter design in order to enable Design Filter. This is true each
time you want to change the filter design. Changes to radio button items or drop down
menu items such as those under Response Type or Filter Order enable Design Filter
immediately. Changes to specifications in text boxes such as Fs, Fpass, and Fstop
require you to click outside the text box to enable Design Filter.
Using FDATool
Lowpass
Raised cosine
Highpass
Bandpass
Bandstop
Differentiator
Multiband
Hilbert transformer
Arbitrary magnitude
Additional response types are available if you have DSP System Toolbox software
installed.
To design a bandpass filter, select the radio button next to Bandpass in the Response
Type region of the GUI.
Note: Not all filter design methods are available for all response types. Once you choose
your response type, this may restrict the filter design methods available to you. Filter
design methods that are not available for a selected response type are removed from the
Design Method region of the GUI.
15
To select the Remez algorithm to compute FIR filter coefficients, select the FIR radio
button and choose Equiripple from the list of methods.
15-8
Using FDATool
Filter Order
You have two mutually exclusive options for determining the filter order when you
design an equiripple filter:
Specify order: You enter the filter order in a text box.
Minimum order: The filter design method determines the minimum order filter.
Select the Minimum order radio button for this example.
Note that filter order specification options depend on the filter design method you choose.
Some filter methods may not have both options available.
Options
The available options depend on the selected filter design method. Only the FIR
Equiripple and FIR Window design methods have settable options. For FIR Equiripple,
the option is a Density Factor. See firpm for more information. For FIR Window
the options are Scale Passband, Window selection, and for the following windows, a
settable parameter:
Window
Parameter
Chebyshev (chebwin)
Sidelobe attenuation
Gaussian (gausswin)
Alpha
Kaiser (kaiser)
Beta
Taylor (taylorwin)
Tukey (tukeywin)
Alpha
User Defined
You can view the window in the Window Visualization Tool (wvtool) by clicking the
View button.
15-9
15
Using FDATool
15-11
15
Using FDATool
For descriptions of the above responses and their associated toolbar buttons and other
FDATool toolbar buttons, see fvtool.
You can display two responses in the same plot by selecting Analysis > Overlay
Analysis and selecting an available response. A second y-axis is added to the right side
of the response plot. (Note that not all responses can be overlaid on each other.)
You can also display the filter coefficients and detailed filter information in this region.
For all the analysis methods, except zero-phase response, you can access them from the
Analysis menu, the Analysis Parameters dialog box from the context menu, or by using
the toolbar buttons. For zero-phase, right-click the y-axis of the plot and select Zerophase from the context menu.
For example, to look at the filter's magnitude response, select the Magnitude Response
button
on the toolbar.
You can also overlay the filter specifications on the Magnitude plot by selecting View >
Specification Mask.
Note: You can use specification masks in FVTool only if FVTool was launched from
FDATool.
15-13
15
For information on using data tips, see Display Data Values Interactively in the
MATLAB documentation.
Drawing Spectral Masks
To add spectral masks or rejection area lines to your magnitude plot, click View > Userdefined Spectral Mask.
15-14
Using FDATool
The mask is defined by a frequency vector and a magnitude vector. These vectors must be
the same length.
Enable Mask Select to turn on the mask display.
Normalized Frequency Select to normalize the frequency between 0 and 1
across the displayed frequency range.
Frequency Vector Enter a vector of x-axis frequency values.
Magnitude Units Select the desired magnitude units. These units should match
the units used in the magnitude plot.
Magnitude Vector Enter a vector of y-axis magnitude values.
The magnitude response below shows a spectral mask.
15-15
15
To change the filter name, type the new name in Filter name. (In fvtool, if you have
multiple filters, select the desired filter and then enter the new name.)
To change the sampling frequency, select the desired unit from Units and enter the
sampling frequency in Fs. (For each filter in fvtool, you can specify a different
sampling frequency or you can apply the sampling frequency to all filters.)
To save the displayed parameters as the default values to use when FDATool or FVTool
is opened, click Save as Default.
To restore the default values, click Restore Original Defaults.
Displaying the Response in FVTool
To display the filter response characteristics in a separate window, select View > Filter
Visualization Tool (available if any analysis, except the filter specifications, is in the
display region) or click the Full View Analysis button:
This launches the Filter Visualization Tool (fvtool).
Note: If Filter Specifications are shown in the display region, clicking the Full View
Analysis toolbar button launches a MATLAB figure window instead of FVTool. The
15-16
Using FDATool
associated menu item is Print to figure, which is enabled only if the filter specifications
are displayed.
You can use this tool to annotate your design, view other filter characteristics, and print
your filter response. You can link FDATool and FVTool so that changes made in FDATool
are immediately reflected in FVTool. See fvtool for more information.
15
Note: You cannot generate MATLAB code (File > Generate MATLAB code) if your
filter was designed or edited with the Pole/Zero Editor.
You cannot move quantized poles and zeros. You can only move the reference poles and
zeros.
Click the Pole/Zero Editor button in the sidebar or select Edit > Pole/Zero Editor to
display this panel.
Poles are shown using x symbols and zeros are shown using o symbols.
Changing the Pole-Zero Plot
Plot mode buttons are located to the left of the pole/zero plot. Select one of the buttons to
change the mode of the pole/zero plot. The Pole/Zero Editor has these buttons from left to
right: move pole, add pole, add zero, and delete pole or zero.
15-18
Using FDATool
The following plot parameters and controls are located to the left of the pole/zero plot and
below the plot mode buttons.
Filter gain factor to compensate for the filter's pole(s) and zero(s) gains
Coordinates units (Polar or Rectangular) of the selected pole or zero
Magnitude if polar coordinates is selected, magnitude of the selected pole or zero
Angle if polar coordinates is selected, angle of selected pole(s) or zero(s)
Real if rectangular coordinates is selected, real component of selected pole(s) or
zero(s)
Imaginary if rectangular coordinates is selected, imaginary component of selected
pole or zero
Section for multisection filters, number of the current section
Conjugate creates a corresponding conjugate pole or zero or automatically selects
the conjugate pole or zero if it already exists.
Auto update immediately updates the displayed magnitude response when poles
or zeros are added, moved, or deleted.
The Edit > Pole/Zero Editor has items for selecting multiple poles/zeros, for inverting
and mirroring poles/zeros, and for deleting, scaling and rotating poles/zeros.
15-19
15
Moving one of the zeros on the vertical axis produces the following result:
15-20
Using FDATool
When you select one of the zeros from a conjugate pair, the Conjugate check box and
the conjugate are automatically selected.
The Magnitude Response plot updates immediately because Auto update is active.
Direct-form II
Direct-form I transposed
15-21
15
Direct-form II transposed
Lattice ARMA
Note: If you have DSP System Toolbox product installed, you will see additional
structures in the Convert structure dialog box.
In addition, the following conversions are available for particular classes of filters:
Minimum phase FIR filters can be converted to Lattice minimum phase
Maximum phase FIR filters can be converted to Lattice maximum phase
Allpass filters can be converted to Lattice allpass
IIR filters can be converted to Lattice ARMA
Note: Converting from one filter structure to another may produce a result with different
characteristics than the original. This is due to the computer's finite-precision arithmetic
and the variations in the conversion's roundoff computations.
For example:
Select Edit > Convert Structure to open the Convert structure dialog box.
Select Direct-form I in the list of filter structures.
15-22
Using FDATool
15
Select Coefficients from the Export As menu to save the filter coefficients or
select Objects to save the filter in a filter object.
For coefficients, assign variable names using the Numerator (for FIR filters) or
Numerator and Denominator (for IIR filters), or SOS Matrix and Scale Values
(for IIR filters in second-order section form) text boxes in the Variable Names region.
For objects, assign the variable name in the Discrete Filter (or Quantized Filter)
text box. If you have variables with the same names in your workspace and you want
to overwrite them, select the Overwrite Variables check box.
15-24
Using FDATool
Click the Export button. The Export Filter Coefficients to .FCF File dialog box
appears.
The coefficients are saved in the text file that you specified, and the MATLAB Editor
opens to display the file. The text file also contains comments with the MATLAB version
number, the Signal Processing Toolbox version number, and filter information.
Exporting Coefficients or Objects to a MAT-File
To save filter coefficients or a filter object as variables in a MAT-file:
1
Select Coefficients from the Export As menu to save the filter coefficients or
select Objects to save the filter in a filter object.
For coefficients, assign variable names using the Numerator (for FIR filters) or
Numerator and Denominator (for IIR filters), or SOS Matrix and Scale Values
(for IIR filters in second-order section form) text boxes in the Variable Names region.
15-25
15
For objects, assign the variable name in the Discrete Filter (or Quantized Filter)
text box. If you have variables with the same names in your workspace and you want
to overwrite them, select the Overwrite Variables check box.
5
Click the Export button. The Export to a MAT-File dialog box appears.
Exporting to SPTool
You may want to use your designed filter in SPTool to do signal processing and analysis.
1
Assign the variable name in the Discrete Filter (or Quantized Filter) text box.
If you have variables with the same names in your workspace and you want to
overwrite them, select the Overwrite Variables check box.
15-26
Using FDATool
After designing your filter, click the Realize Model sidebar button or select File >
Export to Simulink Model. The Realize Model panel is displayed.
To insert the block into the current (most recently selected) Simulink model, set the
Destination to Current. To inset the block into a new model, select New. To insert
the block into a user-defined subsystem, select User defined.
If you want to overwrite a block previously created from this panel, check
Overwrite generated `Filter' block.
If you select the Build model using basic elements check box, your filter is
created as a subsystem block, which uses separate sub-elements. In this mode, the
following optimization(s) are available:
Optimize for zero gains Removes zero-valued gain paths from the filter
structure.
Optimize for unity gains Substitutes a wire (short circuit) for gains
equal to 1 in the filter structure.
Optimize for negative gains Substitutes a wire (short circuit) for gains
equal to -1 and changes corresponding additions to subtractions in the filter
structure.
Optimize delay chains Substitutes delay chains composed of n unit delays
with a single delay of n.
Optimize for unity scale values Removes multiplications for scale
values equal to 1 from the filter structure.
The following illustration shows the effects of some of the optimizations:
15-27
15
Optimization Effects
Note: The Build model using basic elements check box is enabled only when
you have a DSP System Toolbox license and your filter can be designed using digital
filter blocks from that library. For more information, see the Filter Realization
Wizard topic in the DSP System Toolbox documentation.
15-28
Using FDATool
Set the Input processing parameter to specify whether the generated filter
performs sample- or frame-based processing on the input. Depending on the type of
filter you design, one or both of the following options may be available:
Columns as channels (frame based) When you select this option, the
block treats each column of the input as a separate channel.
Elements as channels (sample based) When you select this option, the
block treats each element of the input as a separate channel.
Click the Realize Model button to create the filter block. When the Build model
using basic elements check box is selected, FDATool implements the filter as a
subsystem block using Sum, Gain, and Delay blocks.
If you double-click the Simulink Filter block, the filter structure is displayed.
Other Ways to Export a Filter
You can also send your filter to a C header file or generate MATLAB code to construct
your filter from the command line. For detailed instructions, see the following sections:
Generating a C Header File on page 15-29
Generating MATLAB Code on page 15-31
Select Targets > Generate C Header. The Generate C Header dialog box appears.
15-29
15
Enter the variable names to be used in the C header file. The particular filter
structure determines the variables that are created in the file
Filter Structure
Variable Parameter
Direct-form I
Direct-form II
Direct-form I
transposed
Direct-form II
transposed
Lattice ARMA
Lattice MA
15-30
Using FDATool
Select Export Suggested to use the suggested data type or select Export As and
select the desired data type from the pull-down.
Note: If you do not have DSP System Toolbox software installed, selecting any
data type other than double-precision floating point results in a filter that does not
exactly match the one you designed in the FDATool. This is due to rounding and
truncating differences.
Click OK to save the file and close the dialog box or click Apply to save the file, but
leave the dialog box open for additional C header file definitions.
=
=
=
=
=
9600;
12000;
0.057501127785;
0.0001;
20;
%
%
%
%
%
Passband Frequency
Stopband Frequency
Passband Ripple
Stopband Attenuation
Density Factor
15-31
15
Store Filter Displays the Store Filter dialog box in which you specify the filter name
to use when storing the filter in the Filter Manager. The default name is the type of the
filter.
Using FDATool
The current filter is listed below the listbox. To change the current filter, highlight the
desired filter. If you select Edit current filter, FDATool displays the currently selected
filter specifications. If you make any changes to the specifications, the stored filter is
updated immediately.
To cascade two or more filters, highlight the desired filters and press Cascade. A new
cascaded filter is added to the Filter Manager.
To change the name of a stored filter, press Rename. The Rename filter dialog box is
displayed.
To remove a stored filter from the Filter Manager, press Delete.
To export one or more filters to FVTool, highlight the filter(s) and press FVTool.
15
For example, save this design session as TestFilter.fda in your current working
directory by typing TestFilter in the File name field.
The .fda extension is added automatically to all filter design sessions you save.
Note: You can also use the File > Save session and File > Save session as to save a
session.
You can load existing sessions into the Filter Design and Analysis Tool by selecting the
Open session button,
or File > Open session . A Load Filter Design File browser
opens that allows you to select from your previously saved filter design sessions.
15-34
The imported filter can be in any of the representations listed in the Filter Structure
pull-down menu. You can import a filter as second-order sections by selecting the check
box.
Specify the filter coefficients in Numerator and Denominator, either by entering them
explicitly or by referring to variables in the MATLAB workspace.
Select the frequency units from the following options in the Units menu, and for any
frequency unit other than Normalized, specify the value or MATLAB workspace variable
of the sampling frequency in the Fs field.
To import the filter, click the Import Filter button. The display region is automatically
updated when the new filter has been imported.
You can edit the imported filter using the Pole/Zero Editor panel.
15-35
15
Filter Structures
The available filter structures are:
Direct Form, which includes direct-form I, direct-form II, direct-form I transposed,
direct-form II transposed, and direct-form FIR
Lattice, which includes lattice allpass, lattice MA min phase, lattice MA max phase,
and lattice ARMA
Discretetime Filter (dfilt object)
The structure that you choose determines the type of coefficients that you need to specify
in the text fields to the right.
Direct-form
For direct-form I, direct-form II, direct-form I transposed, and direct-form II transposed,
specify the filter by its transfer function representation
H ( z) =
The Numerator field specifies a variable name or value for the numerator coefficient
vector b, which contains m+1 coefficients in descending powers ofz.
The Denominator field specifies a variable name or value for the denominator
coefficient vector a, which contains n+1 coefficients in descending powers ofz. For FIR
filters, the Denominator is1.
Filters in transfer function form can be produced by all of the Signal Processing Toolbox
filter design functions (such asfir1, fir2, firpm, butter, yulewalk). See Transfer
Function for more information.
Importing as second-order sections
For all direct-form structures, except direct-form FIR, you can import the filter in its
second-order section representation:
b0k + b1k z -1 + b2k z-2
-1
-2
k=1 a0 k + a1k z + a2k z
L
H ( z) = G
15-36
The Gain field specifies a variable name or a value for the gainG, and the SOS Matrix
field specifies a variable name or a value for the L-by-6 SOS matrix
b01
b02
SOS =
b
0L
b11
b21
1 a11
b12
b1L
b22
b2L
1 a12
1 a1L
a22
a22
a2 L
whose rows contain the numerator and denominator coefficients bik and aik of the secondorder sections of H(z).
Filters in second-order section form can be produced by functions such as tf2sos,
zp2sos, ss2sos, and sosfilt. See Second-Order Sections (SOS) for more
information.
Lattice
For lattice allpass, lattice minimum and maximum phase, and lattice ARMA filters,
specify the filter by its lattice representation:
For lattice allpass, the Lattice coeff field specifies the lattice (reflection) coefficients,
k(1) to k(N), where N is the filter order.
For lattice MA (minimum or maximum phase), the Lattice coeff field specifies the
lattice (reflection) coefficients, k(1) to k(N), where N is the filter order.
For lattice ARMA, the Lattice coeff field specifies the lattice (reflection) coefficients,
k(1) to k(N), and the Ladder coeff field specifies the ladder coefficients, v(1) to
v(N+1), where N is the filter order.
Filters in lattice form can be produced by tf2latc. See Lattice Structure for more
information.
Discrete-time Filter (dfilt object)
For Discrete-time filter, specify the name of the dfilt object. See dfilt for more
information.
Multirate Filter (mfilt object)
For Multirate filter, specify the name of the mfilt object. See mfilt in the DSP System
Toolbox product for more information.
15-37
16
Designing a Filter in the Filterbuilder
GUI
Filterbuilder Design Process on page 16-2
Designing a FIR Filter Using filterbuilder on page 16-11
16
Introduction to Filterbuilder
The filterbuilder function provides a graphical interface to the fdesign object-object
oriented filter design paradigm and is intended to reduce development time during the
filter design process. filterbuilder uses a specification-centered approach to find the
best algorithm for the desired response.
Note: filterbuilder requires the Signal Processing Toolbox. The functionality of
filterbuilder is greatly expanded by the DSP System Toolbox. Many of the features
described or displayed below are only available if the DSP System Toolbox is installed.
You may verify your installation by typing ver at the command prompt.
Select a Response
When you open the filterbuilder tool by typing:
16-2
filterbuilder
at the MATLAB command prompt, the Response Selection dialog box appears, listing
all possible filter responses available in DSP System Toolbox.
Note This step cannot be skipped because it is not automatically completed for you by the
software. You must select a response to initiate the filter design process.
After you choose a response, say bandpass, you start the design of the Specifications
Object, and the Bandpass Design dialog box appears. This dialog box contains a Main
pane, a Data Types pane and a Code Generation pane. The specifications of your filter
are generally set in the Main pane of the dialog box.
The Data Types pane provides settings for precision and data types, and the Code
Generation pane contains options for various implementations of the completed filter
design.
For the initial design of your filter, you will mostly use the Main pane.
16-3
16
16-4
The Bandpass Design dialog box contains all the parameters you need to determine
the specifications of a bandpass filter. The parameters listed in the Main pane depend
upon the type of filter you are designing. However, no matter what type of filter you have
chosen in the Response Selection dialog box, the filter design dialog box contains the
Main, Data Types, and Code Generation panes.
Select a Specification
To choose the specification for the bandpass filter, you can begin by selecting an Impulse
Response, Order Mode, and Filter Type in the Filter Specifications frame of the
Main Pane. You can further specify the response of your filter by setting frequency and
magnitude specifications in the appropriate frames on the Main Pane.
Note Frequency, Magnitude, and Algorithm specifications are interdependent
and may change based upon your Filter Specifications selections. When choosing
specifications for your filter, select your Filter Specifications first and work your
way down the dialog box- this approach ensures that the best settings for dependent
specifications display as available in the dialog box.
Select an Algorithm
The algorithms available for your filter depend upon the filter response and design
parameters you have selected in the previous steps. For example, in the case of a
bandpass filter, if the impulse response selected is IIR and the Order Mode field is set
to Minimum, the design methods available are Butterworth, Chebyshev type I or II,
or Elliptic, whereas if the Order Mode field is set to Specify, the design method
available is IIR least p-norm.
16-5
16
16-6
16-7
16
16-8
16-9
16
Tip If you have Simulink, you have the option of exporting this filter to a Simulink block
using the realizemdl command. To get help on this command, type:
>> help realizemdl
16-10
Open the Filterbuilder GUI by typing the following at the MATLAB prompt:
filterbuilder
The Response Selection dialog box appears. In this dialog box, you can select from
a list of filter response types. Select Lowpass in the list box.
Hit the OK button. The Lowpass Design dialog box opens. Here you can specify the
writable parameters of the Lowpass filter object. The components of the Main frame
of this dialog box are described in the section titled Lowpass Filter Design Dialog Box
Main Pane. In the dialog box, make the following changes:
Enter a Fpass value of 0.55.
Enter a Fstop value of 0.65.
16-11
16
Click Apply, and the following message appears at the MATLAB prompt:
The variable 'Hlp' has been exported to the command window.
16-12
To check your design, click View Filter Response. The Filter Visualization tool
appears, showing a plot of the magnitude response of the filter.
You can change the design and click Apply, followed by View Filter Response, as
many times as needed until your design specifications are met.
16-13
17
Bibliography
17
Bibliography
17-2
17-3
17
Bibliography
17-4
17-5
17
Bibliography
17-6