Skip to Main Content Skip to Search
Product Documentation

upfirdn - Upsample, apply FIR filter, and downsample

Syntax

yout = upfirdn(xin,h)
yout = upfirdn(xin,h,p)
yout = upfirdn(xin,h,p,q)

Description

upfirdn performs a cascade of three operations:

  1. Upsampling the input data in the matrix xin by a factor of the integer p (inserting zeros)

  2. FIR filtering the upsampled signal data with the impulse response sequence given in the vector or matrix h

  3. Downsampling the result by a factor of the integer q (throwing away samples)

upfirdn has been implemented as a MEX-file for maximum speed, so only the outputs actually needed are computed. The FIR filter is usually a lowpass filter, which you must design using another function such as firpm or fir1.

yout = upfirdn(xin,h) filters the input signal xin with the FIR filter having impulse response h. If xin is a row or column vector, then it represents a single signal. If xin is a matrix, then each column is filtered independently. If h is a row or column vector, then it represents one FIR filter. If h is a matrix, then each column is a separate FIR impulse response sequence. If yout is a row or column vector, then it represents one signal. If yout is a matrix, then each column is a separate output. No upsampling or downsampling is implemented with this syntax.

yout = upfirdn(xin,h,p) specifies the integer upsampling factor p, where p has a default value of 1.

yout = upfirdn(xin,h,p,q) specifies the integer downsampling factor q, where q has a default value of 1. The length of the output, yout, is ceil(((length(xin)-1)*p+length(h))/q)

Tips

Usually the inputs xin and the filter h are vectors, in which case only one output signal is produced. However, when these arguments are arrays, each column is treated as a separate signal or filter. Valid combinations are:

  1. xin is a vector and h is a vector.

    There is one filter and one signal, so the function convolves xin with h. The output signal yout is a row vector if xin is a row; otherwise, yout is a column vector.

  2. xin is a matrix and h is a vector.

    There is one filter and many signals, so the function convolves h with each column of xin. The resulting yout will be an matrix with the same number of columns as xin.

  3. xin is a vector and h is a matrix.

    There are many filters and one signal, so the function convolves each column of h with xin. The resulting yout will be an matrix with the same number of columns as h.

  4. xin is a matrix and h is a matrix, both with the same number of columns.

    There are many filters and many signals, so the function convolves corresponding columns of xin and h. The resulting yout is an matrix with the same number of columns as xin and h.

Examples

Change the sampling rate by a factor of 147/160. This factor is used to convert from 48kHz (DAT rate) to 44.1kHz (CD sampling rate).

L = 147; M = 160;     % Interpolation/decimation factors.
N = 24*L;
h = fir1(N-1,1/M,kaiser(N,7.8562));
h = L*h; % Passband gain = L
Fs = 48e3;            % Original sampling frequency-48kHz
n = 0:10239;          % 10240 samples, 0.213 seconds long
x  = sin(2*pi*1e3/Fs*n); % Original signal, sinusoid @ 1kHz
y = upfirdn(x,h,L,M);    % 9430 samples, still .213 seconds

% Overlay original (48kHz) with resampled 
% signal (44.1kHz) in red.

stem(n(1:49)/Fs,x(1:49)); hold on 
stem(n(1:45)/(Fs*L/M),y(13:57),'r','filled'); 
xlabel('Time (sec)');ylabel('Signal value');

Algorithms

upfirdn uses a polyphase interpolation structure. The number of multiply-add operations in the polyphase structure is approximately (LhLx-pLx)/q where Lh and Lx are the lengths of h[n] and x[n], respectively.

A more accurate flops count is computed in the program, but the actual count is still approximate. For long signals x[n], the formula is often exact.

Diagnostics

If p and q are large and do not have many common factors, you may see this message:

Filter length is too large - reduce problem complexity.

Instead, you should use an interpolation function, such as interp1, to perform the resampling and then filter the input.

References

[1] Crochiere, R.E., and L.R. Rabiner, Multi-Rate Signal Processing, Prentice-Hall, Englewood Cliffs, NJ, 1983, pp.88-91.

[2] Crochiere, R.E., "A General Program to Perform Sampling Rate Conversion of Data by Rational Ratios," Programs for Digital Signal Processing, IEEE Press, New York, 1979, pp.8.2-1 to 8.2-7.

See Also

conv | decimate | downsample | filter | interp | intfilt | resample | upsample

  


Recommended Products

Includes the most popular MATLAB recorded presentations with Q&A sessions led by MATLAB experts.

 © 1984-2012- The MathWorks, Inc.    -   Site Help   -   Patents   -   Trademarks   -   Privacy Policy   -   Preventing Piracy   -   RSS