−3 −2 −1 0 1 2 3 In−Phase Components Time Index Signal Value Desired Output Error 0 200 400 600 800 1000 −3 −2 −1 0 1 2 3 Quadrature Components Time Index Signal Value Desired Output Error −2 0 2 −3 −2 −1 0 1 2 3
Received Signal Scatter Plot
Real[x] Imag[x] −2 0 2 −3 −2 −1 0 1 2 3
Equalized Signal Scatter Plot
Real[y]
Imag[y]
See Also
adaptfilt.tdafdct,adaptfilt.fdaf,adaptfilt.blmsPurpose
FIR adaptive filter that uses unconstrained frequency-domain with quantized step size normalizationSyntax
ha = adaptfilt.ufdaf(l,step,leakage,delta,lambda,blocklen, offset,coeffs,states)Description
ha = adaptfilt.ufdaf(l,step,leakage,delta,lambda,blocklen, offset,coeffs,states)constructs an unconstrained frequency-domain FIR adaptive filterha
with quantized step size normalization.
Input Arguments
Entries in the following table describe the input arguments for
adaptfilt.ufdaf.
Input
Argument Description
l Adaptive filter length (the number of coefficients or
taps) and it must be a positive integer. ldefaults
to 10.
step Adaptive filter step size. It must be a nonnegative
scalar. stepdefaults to 0.
leakage Leakage parameter of the adaptive filter. When
you set this argument to a value between zero and one, you are implementing a leaky version of the UFDAF algorithm. leakagedefaults to 1 — no
leakage.
delta Initial common value of all of the FFT input signal
powers. the initial value of delta should be positive, and it defaults to 1.
adaptfilt.ufdaf
Input
Argument Description
lambda Specifies the averaging factor used to compute the
exponentially-windowed FFT input signal powers for the coefficient updates. lambdashould lie in
the range (0,1]. For default UFDAF filter objects,
lambdadefaults to 0.9.
blocklen Block length for the coefficient updates. This
must be a positive integer. For faster execution, (blocklen l) should be a power of two. blocklen
defaults tol.
offset Offset for the normalization terms in the coefficient
updates. This can help you avoid divide by zero conditions, or divide by very small numbers conditions, when any of the FFT input signal powers become very small. Default value is zero.
coeffs Initial time-domain coefficients of the adaptive
filter. It should be a lengthlvector. The filter
object uses these coefficients to compute the initial frequency-domain filter coefficients via an FFT computed after zero-padding the time-domain vector byblocklen.
states Adaptive filter states. statesdefaults to a zero
vector with length equal tol.
Properties
Since youradaptfilt.ufdaffilter is an object, it has properties thatdefine its behavior in operation. Note that many of the properties are also input arguments for creatingadaptfilt.ufdafobjects. To
show you the properties that apply, this table lists and describes each property for the filter object.
Name Range Description
Algorithm None Defines the adaptive filter
algorithm the object uses during adaptation
AvgFactor Specifies the averaging
factor used to compute the exponentially-windowed FFT input signal powers for the coefficient updates.
AvgFactorshould lie in the
range (0,1]. For default UFDAF filter objects,
AvgFactordefaults to 0.9.
Note that AvgFactor and lambda are the same thing — lambda is an input argument and AvgFactor a property of the object.
BlockLength Block length for the
coefficient updates. This must be a positive integer. For faster execution, (blocklen +l) should be
a power of two. blocklen
defaults tol.
FFTCoefficients Stores the discrete Fourier
transform of the filter coefficients incoeffs. FFTStates States for the FFT operation. FilterLength Any positive
integer Reports the length of the filter,the number of coefficients or taps
adaptfilt.ufdaf
Name Range Description
Leakage 0 to 1 Leakage parameter of the
adaptive filter. When you set this argument to a value between zero and one, you are implementing a leaky version of the UFDAF algorithm.
leakagedefaults to 1 — no
leakage.
Offset Offset for the normalization
terms in the coefficient updates. This can help you avoid divide by zero conditions, or divide by very small numbers conditions, when any of the FFT input signal powers become very small. Default value is zero.
PersistentMemory falseortrue Determine whether the filter
states get restored to their starting values for each filtering operation. The starting values are the values in place when you create the filter. PersistentMemory
returns to zero any state that the filter changes during processing. States that the filter does not change are not affected. Defaults tofalse.
Name Range Description
Power 2*l element
vector A vector of 2*each initialized with thelelements, valuedeltafrom the input
arguments. As you filter data,
Powergets updated by the
filter process.
StepSize 0 to 1 Adaptive filter step size.
It must be a nonnegative scalar. You can usemaxstep
to determine a reasonable range of step size values for the signals being processed.
stepdefaults to 0.
Examples
Show an example of Quadrature Phase Shift Keying (QPSK) adaptive equalization using a 32-coefficient adaptive filter. For fidelity, use 1024 iterations. The figure that follows the code provides the information you need to assess the performance of the equalization process.D = 16; % Number of samples of delay
b = exp(j*pi/4)*[-0.7 1]; % Numerator coefficients of channel
a = [1 -0.7]; % Denominator coefficients of channel
ntr= 1024; % Number of iterations
s = sign(randn(1,ntr+D))+j*sign(randn(1,ntr+D));% Baseband QPSK signal
n = 0.1*(randn(1,ntr+D) + j*randn(1,ntr+D));
% Noise signal r = filter(b,a,s)+n;% Received signal
x = r(1+D:ntr+D); % Input signal (received signal)
d = s(1:ntr); % Desired signal (delayed QPSK signal)
del = 1; %Initial FFT input powers
mu = 0.1; % Step size
lam = 0.9; % Averaging factor
ha = adaptfilt.ufdaf(32,mu,1,del,lam); [y,e] = filter(ha,x,d);
adaptfilt.ufdaf
title('In-Phase Components'); legend('Desired','Output','Error'); xlabel('Time Index'); ylabel('Signal Value');
subplot(2,2,2); plot(1:ntr,imag([d;y;e]));
title('Quadrature Components'); legend('Desired','Output','Error'); xlabel('Time Index'); ylabel('Signal Value');
subplot(2,2,3); plot(x(ntr-100:ntr),'.'); axis([-3 3 -3 3]); title('Received Signal Scatter Plot'); axis('square'); xlabel('Real[x]'); ylabel('Imag[x]'); grid on;
subplot(2,2,4); plot(y(ntr-100:ntr),'.'); axis([-3 3 -3 3]); title('Equalized Signal Scatter Plot'); axis('square'); xlabel('Real[y]'); ylabel('Imag[y]'); grid on;
0 200 400 600 800 1000 −3 −2 −1 0 1 2 3 In−Phase Components Time Index Signal Value 0 500 1000 1500 −3 −2 −1 0 1 2 Quadrature Components Time Index Signal Value −2 0 2 −3 −2 −1 0 1 2 3
Received Signal Scatter Plot
Real[x] Imag[x] −2 0 2 −3 −2 −1 0 1 2 3
Equalized Signal Scatter Plot
Real[y] Imag[y] Desired Output Error Desired Output Error