Decimation — decrease sample rate by integer factor
Create a sinusoidal signal sampled at 4 kHz. Decimate it by a factor of four.
t = 0:1/4e3:1; x = sin(2*pi*30*t) + sin(2*pi*60*t); y = decimate(x,4);
Plot the original and decimated signals.
subplot(2,1,1) stem(0:120,x(1:121),'filled','MarkerSize',3) grid on xlabel('Sample Number') ylabel('Original') subplot(2,1,2) stem(0:30,y(1:31),'filled','MarkerSize',3) grid on xlabel('Sample Number') ylabel('Decimated')
Decimate Signal Using Chebyshev Filter
Create a signal with two sinusoids. Decimate it by a factor of 13 using a Chebyshev IIR filter of order 5. Plot the original and decimated signals.
r = 13; n = 16:365; lx = length(n); x = sin(2*pi*n/153) + cos(2*pi*n/127); plot(0:lx-1,x,'o') hold on y = decimate(x,r,5); stem(lx-1:-r:0,fliplr(y),'ro','filled','markersize',4) legend('Original','Decimated','Location','south') xlabel('Sample number') ylabel('Signal')
The original and decimated signals have matching last elements.
Decimate Signal Using FIR Filter
Create a signal with two sinusoids. Decimate it by a factor of 13 using an FIR filter of order 82. Plot the original and decimated signals.
r = 13; n = 16:365; lx = length(n); x = sin(2*pi*n/153) + cos(2*pi*n/127); plot(0:lx-1,x,'o') hold on y = decimate(x,r,82,'fir'); stem(0:r:lx-1,y,'ro','filled','markersize',4) legend('Original','Decimated','Location','south') xlabel('Sample number') ylabel('Signal')
The original and decimated signals have matching first elements.
x — Input signal
Input signal, specified as a vector.
r — Decimation factor
Decimation factor, specified as a positive integer. For better results
r is greater than 13, divide
r into smaller factors and call
decimate several times.
n — Filter order
Filter order, specified as a positive integer. IIR filter orders above 13 are not recommended because of numerical instability. The function displays a warning in those cases.
y — Decimated signal
Decimated signal, returned as a vector.
Decimation reduces the original sample rate of a sequence to a lower rate. It is the
opposite of interpolation.
decimate lowpass filters the input to
guard against aliasing and downsamples the result. The function uses decimation
algorithms 8.2 and 8.3 from .
decimatecreates a lowpass filter. The default is a Chebyshev Type I filter designed using
cheby1. This filter has a normalized cutoff frequency of
0.8/rand a passband ripple of 0.05 dB. Sometimes, the specified filter order produces passband distortion due to round-off errors accumulated from the convolutions needed to create the transfer function.
decimateautomatically reduces the filter order when distortion causes the magnitude response at the cutoff frequency to differ from the ripple by more than 10–6.
"fir"option is chosen,
fir1to design a lowpass FIR filter with cutoff frequency
When using the FIR filter,
decimatefilters the input sequence in only one direction. This conserves memory and is useful for working with long sequences. In the IIR case,
decimateapplies the filter in the forward and reverse directions using
filtfiltto remove phase distortion. In effect, this process doubles the filter order. In both cases, the function minimizes transient effects at both ends of the signal by matching endpoint conditions.
decimateresamples the data by selecting every
rth point from the interior of the filtered signal. In the resampled sequence (
x(end)when the IIR filter is used, and
x(1)when the FIR filter is used.
 Digital Signal Processing Committee of the IEEE® Acoustics, Speech, and Signal Processing Society, eds. Programs for Digital Signal Processing. New York: IEEE Press, 1979.
C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.
Usage notes and limitations:
Code generation is supported only when the
"fir"option is specified.
Version HistoryIntroduced before R2006a
R2023b: Use single-precision data
decimate function supports single-precision
R2023a: Generate C and C++ code
Generate C and C++ code for the
decimate function. You
must have MATLAB®
Coder™ to use this functionality.