# dsp.ChannelSynthesizer

Polyphase FFT synthesis filter bank

## Description

The `dsp.ChannelSynthesizer`

System object™ merges multiple narrowband signals into a broadband signal by using an FFT based
synthesis filter bank. The filter bank uses a prototype lowpass filter and is implemented
using a polyphase structure. You can specify the filter coefficients directly or through
design parameters.

To merge multiple narrowband signals into a broadband signal:

Create the

`dsp.ChannelSynthesizer`

object and set its properties.Call the object with arguments, as if it were a function.

To learn more about how System objects work, see What Are System Objects?

## Creation

### Description

creates
a synthesizer object, using the default properties.`synthesizer`

= dsp.ChannelSynthesizer

`synthesizer = dsp.ChannelSynthesizer(Name,Value)`

specifies
additional properties using `Name,Value`

pairs. Unspecified properties
have default values.

**Example:**

```
synthesizer =
dsp.ChannelSynthesizer('NumTapsPerBand',20,'StopbandAttenuation',140)
```

## Properties

Unless otherwise indicated, properties are *nontunable*, which means you cannot change their
values after calling the object. Objects lock when you call them, and the
`release`

function unlocks them.

If a property is *tunable*, you can change its value at
any time.

For more information on changing property values, see System Design in MATLAB Using System Objects.

`Specification`

— Filter design parameters or coefficients

```
'Number of taps per band and stopband
attenuation'
```

(default) | `'Coefficients'`

Filter design parameters or filter coefficients, specified as one of these options:

`'Number of taps per band and stopband attenuation'`

— Specify the filter design parameters through the`NumTapsPerBand`

and`StopbandAttenuation`

properties.`'Coefficients'`

— Specify the filter coefficients directly using`LowpassCoefficients`

.

`NumTapsPerBand`

— Number of filter coefficients per frequency band

`12`

(default) | positive integer

Number of filter coefficients each polyphase branch uses, specified as a positive
integer. The number of polyphase branches matches the number of frequency bands. The
total number of filter coefficients for the prototype lowpass filter is given by product
of the number of frequency bands and `NumTapsPerBand`

. For a given
stopband attenuation, increasing the number of taps per band narrows the transition
width of the filter. As a result, there is more usable bandwidth for each frequency band
at the expense of increased computation.

#### Dependencies

This property applies when you set `Specification`

to
`'Number of taps per band and stopband attenuation'`

.

**Data Types: **`single`

| `double`

| `int8`

| `int16`

| `int32`

| `int64`

| `uint8`

| `uint16`

| `uint32`

| `uint64`

`StopbandAttenuation`

— Stopband attenuation

`80`

(default) | positive real scalar

Stopband attenuation of the lowpass filter, specified as a positive real scalar in dB. This value controls the maximum amount of aliasing from one frequency band to the next. Larger is the stopband attenuation, smaller is the passband ripple.

#### Dependencies

This property applies when you set `Specification`

to
`'Number of taps per band and stopband attenuation'`

.

**Data Types: **`single`

| `double`

`LowpassCoefficients`

— Coefficients of the prototype lowpass filter

`[1×49 double]`

(default) | row vector

Coefficients of the prototype lowpass filter, specified as a row vector. The default
vector of coefficients is obtained using
`rcosdesign(0.25,6,8,'sqrt')`

. There must be at least one
coefficient per frequency band. If the length of the lowpass filter is less than the
number of frequency bands, the object zero-pads the coefficients.

If you specify complex coefficients, the object designs a prototype filter that is
centered at a nonzero frequency, also known as a bandpass filter. The modulated versions
of the prototype bandpass filter appear with respect to the prototype filter and are
wrapped around the frequency range [−*F*_{s}
*F*_{s}].

**Tunable: **Yes

#### Dependencies

This property applies when you set `Specification`

to
`'Coefficients'`

.

**Data Types: **`single`

| `double`

**Complex Number Support: **Yes

## Usage

### Description

### Input Arguments

`input`

— Narrowband signals

matrix | 3-D array

Narrowband signals, specified as a matrix or a 3-D array. Each narrowband signal
is stored as a column in the input signal. The number of columns in
`input`

corresponds to the number of frequency bands of the
filter bank. If `input`

is three-dimensional, each matrix
corresponds to a separate channel. If *M* is the number of frequency
bands, and `input`

is an
*L*-by-*M* matrix, then the output signal,
`synthOut`

, has dimensions *L×M*-by-1. If
`input`

has more than one channel, that is, it has dimensions
*L*-by-*M*-by-*N*, then
`synthOut`

has dimensions
*L×M*-by-*N*.

This object also accepts variable-size inputs. That is, once the object is locked, you can change the size of each input channel. The number of channels cannot change.

**Data Types: **`single`

| `double`

**Complex Number Support: **Yes

### Output Arguments

`synthOut`

— Merged broadband signal

matrix | 3-D array

Merged broadband signal, returned as a matrix or a 3-D array. If
*M* is the number of frequency bands, and
`input`

is an *L*-by-*M*
matrix, then the output signal, `synthOut`

, has dimensions
*L×M*-by-1. If `input`

has more than one
channel, that is, it has dimensions
*L*-by-*M*-by-*N*, then
`synthOut`

has dimensions
*L×M*-by-*N*.

**Data Types: **`single`

| `double`

**Complex Number Support: **Yes

## Object Functions

To use an object function, specify the
System object as the first input argument. For
example, to release system resources of a System object named `obj`

, use
this syntax:

release(obj)

### Specific to dsp.ChannelSynthesizer

## Examples

### Channelize and Synthesize Sine Wave in MATLAB

Channelize and synthesize a sine wave signal with multiple frequencies using an *M* -channel filter bank.

The *M* -channel filter bank contains an analysis filter bank section and a synthesis filter bank section. The `dsp.Channelizer`

object implements the analysis filter bank section. The `dsp.ChannelSynthesizer`

object implements the synthesis filter bank section. These objects use an efficient polyphase structure to implement the filter bank. For more details, see **Polyphase Implementation** under **Algorithms** on the object reference pages.

**Initialization**

Initialize the `dsp.Channelizer`

and `dsp.ChannelSynthesizer`

System objects. Each object is set up with 8 frequency bands, 8 polyphase branches in each filter, 12 coefficients per polyphase branch, and a stopband attenuation of 140 dB. Use a sine wave with multiple frequencies as the input signal. View the input spectrum and the output spectrum using a spectrum analyzer.

offsets = [-40,-30,-20,10,15,25,35,-15]; sinewave = dsp.SineWave('ComplexOutput',true,'Frequency',... offsets+(-375:125:500),'SamplesPerFrame',800); channelizer = dsp.Channelizer('StopbandAttenuation',140); synthesizer = dsp.ChannelSynthesizer('StopbandAttenuation',140); spectrumAnalyzer = dsp.SpectrumAnalyzer('ShowLegend',true,... 'SampleRate',sinewave.SampleRate,... 'NumInputPorts',2,'ChannelNames',{'Input','Output'},... 'Title','Input and Output Spectra');

**Streaming**

Use the channelizer to split the broadband input signal into multiple narrow bands. Then pass the multiple narrowband signals into the synthesizer, which merges these signals to form the broadband signal. Compare the spectra of the input and output signals. The input and output spectra match very closely.

for i = 1:5000 x = sum(sinewave(),2); y = channelizer(x); v = synthesizer(y); spectrumAnalyzer(x,v) end

## More About

### Synthesis Filter Bank

The synthesis filter bank consists of a set of parallel bandpass filters that merge multiple
input narrowband signals,
*y _{0}*[

*m*],

*y*[

_{1}*m*], … ,

*y*[

_{M-1}*m*] into a single broadband signal,

*v*[

*n*]. The input narrowband signals are in the baseband. Each narrowband signal is interpolated to a higher sampling rate by using the upsampler, and then filtered by the lowpass filter. A complex exponential that follows the lowpass filter centers the baseband signal around

*w*.

_{k}### Prototype Lowpass Filter

To implement the synthesis filter bank efficiently, the synthesizer uses a prototype lowpass
filter. This filter has an impulse response of
*h*[*n*], a normalized two-sided
bandwidth of 2π/*M*, and a cutoff frequency of
π/*M*. *M* is the number of
frequency bands, that is, the branches of the synthesis filter bank. This
value corresponds to the FFT length that the filter bank uses.
*M* can be high, in the order of 2048 or more. The
stopband attenuation determines the minimum level of interference (aliasing)
from one frequency band to another. The passband ripple must be small so
that the input signal is not distorted in the passband.

The prototype lowpass filter models the first branch of the filter bank. The other
*M* – 1 branches are modeled by filters that are
modulated versions of the prototype filter. The modulation factor is given
by $${e}^{j{w}_{k}n},\text{\hspace{1em}}{w}_{k}=2\pi k/M,\text{\hspace{1em}}k=0,1,\mathrm{...},M-1$$.

The output of each bandpass filter forms a specific portion of the broadband signal. The
output of all the branches are added to form the broadband signal,
*v*[*n*].

## Algorithms

### Polyphase Implementation

The synthesis filter bank can be implemented efficiently using the polyphase structure.

To derive the polyphase structure, start with the transfer function of the prototype lowpass filter.

$${H}_{0}(z)={b}_{0}+{b}_{1}{z}^{-1}+\mathrm{...}+{b}_{N}{z}^{-N}$$

*N* + 1 is the length of the prototype filter.

You can rearrange this equation as follows:

$${H}_{0}(z)=\begin{array}{c}\left({b}_{0}+{b}_{M}{z}^{-M}+{b}_{2M}{z}^{-2M}+\mathrm{..}+{b}_{N-M+1}{z}^{-(N-M+1)}\right)+\\ {z}^{-1}\left({b}_{1}+{b}_{M+1}{z}^{-M}+{b}_{2M+1}{z}^{-2M}+\mathrm{..}+{b}_{N-M+2}{z}^{-(N-M+1)}\right)+\\ \begin{array}{c}\vdots \\ {z}^{-(M-1)}\left({b}_{M-1}+{b}_{2M-1}{z}^{-M}+{b}_{3M-1}{z}^{-2M}+\mathrm{..}+{b}_{N}{z}^{-(N-M+1)}\right)\end{array}\end{array}$$

*M* is
the number of polyphase components.

You can write this equation as:

$${H}_{0}(z)={E}_{0}({z}^{M})+{z}^{-1}{E}_{1}({z}^{M})+\mathrm{...}+{z}^{-(M-1)}{E}_{M-1}({z}^{M})$$

*E _{0}*(

*z*

^{M}),

*E*(

_{1}*z*

^{M}), … ,

*E*(

_{M-1}*z*

^{M}) are polyphase components of the prototype lowpass filter,

*H*(

_{0}*z*).

The other filters in the filter bank,
*H _{k}*(

*z*), where

*k*= 1, … ,

*M*− 1, are modulated versions of this prototype filter.

You can write the transfer function of the *k*th modulated bandpass filter as $${H}_{k}(z)={H}_{0}(z{e}^{j{w}_{k}})$$. Replacing *z* with
*ze ^{jwk}*,

$${H}_{k}(z)={h}_{0}+{h}_{1}{e}^{jwk}{z}^{-1}+{h}_{2}{e}^{j2wk}{z}^{-2}\mathrm{...}+{h}_{N}{e}^{jNwk}{z}^{-N}$$

*N* + 1 is the length of the *k*th filter.

In polyphase form, the equation is as follows:

$${H}_{k}(z)=\left[1\text{\hspace{1em}}{e}^{j{w}_{k}}\text{\hspace{1em}}{e}^{j2{w}_{k}}\text{\hspace{1em}}\mathrm{...}\text{\hspace{1em}}{e}^{j(M-1){w}_{k}}\right]\left[\begin{array}{c}{E}_{0}({z}^{M})\\ {z}^{-1}{E}_{1}({z}^{M})\\ \vdots \\ {z}^{-(M-1)}{E}_{M-1}({z}^{M})\end{array}\right]$$

For all *M* channels in the filter bank, the MIMO transfer function,
*H*(*z*), is given by:

$$H(z)=\left[\begin{array}{c}\begin{array}{lllll}1\hfill & 1\hfill & 1\hfill & \mathrm{...}\hfill & 1\hfill \end{array}\\ \begin{array}{lllll}1\hfill & {e}^{j{w}_{1}}\hfill & {e}^{j2{w}_{1}}\hfill & \mathrm{...}\hfill & {e}^{j(M-1){w}_{1}}\hfill \end{array}\\ \vdots \\ \begin{array}{lllll}1\hfill & {e}^{j{w}_{M-1}}\hfill & {e}^{j2{w}_{M-1}}\hfill & \mathrm{...}\hfill & {e}^{j(M-1){w}_{M-1}}\hfill \end{array}\end{array}\right]\left[\begin{array}{c}{E}_{0}({z}^{M})\\ {z}^{-1}{E}_{1}({z}^{M})\\ \vdots \\ {z}^{-(M-1)}{E}_{M-1}({z}^{M})\end{array}\right]$$

Here is the multirate noble identity for interpolation, assuming that *D* =
*M*:

For illustration, consider the first branch of the filter bank that contains the lowpass filter.

Replace *H _{0}*(

*z*) with its polyphase representation.

After applying the noble identity for interpolation, you can replace the delays, interpolation factor, and the adder with a commutator switch.

For all the *M* channels in the filter bank, the MIMO transfer function,
*H*(*z*), is given by:

$$H(z)=\left[\begin{array}{c}\begin{array}{lllll}1\hfill & 1\hfill & 1\hfill & \mathrm{...}\hfill & 1\hfill \end{array}\\ \begin{array}{lllll}1\hfill & {e}^{j{w}_{1}}\hfill & {e}^{j2{w}_{1}}\hfill & \mathrm{...}\hfill & {e}^{j(M-1){w}_{1}}\hfill \end{array}\\ \vdots \\ \begin{array}{lllll}1\hfill & {e}^{j{w}_{M-1}}\hfill & {e}^{j2{w}_{M-1}}\hfill & \mathrm{...}\hfill & {e}^{j(M-1){w}_{M-1}}\hfill \end{array}\end{array}\right]\left[\begin{array}{c}{E}_{0}(z)\\ {E}_{1}(z)\\ \vdots \\ {E}_{M-1}(z)\end{array}\right]$$

The matrix on the left is an IDFT matrix. With the IDFT matrix, the efficient implementation of the lowpass prototype based filter bank looks like the following.

## References

[1] Harris, Fredric J, *Multirate Signal Processing for
Communication Systems*, Prentice Hall PTR, 2004.

[2] Harris, F.J., Chris Dick, Michael Rice. "Digital Receivers and Transmitters Using Polyphase Filter Banks for Wireless Communications." IEEE Transactions on microwave theory and techniques. Vol. 51, Number 4, April 2003.

## Extended Capabilities

### C/C++ Code Generation

Generate C and C++ code using MATLAB® Coder™.

Usage notes and limitations:

See System Objects in MATLAB Code Generation (MATLAB Coder).

## See Also

### Functions

### Objects

`dsp.Channelizer`

|`dsp.FIRHalfbandDecimator`

|`dsp.FIRHalfbandInterpolator`

|`dsp.IIRHalfbandInterpolator`

|`dsp.DyadicSynthesisFilterBank`

### Blocks

- Channel Synthesizer | Channelizer | Dyadic Analysis Filter Bank | Two-Channel Analysis Subband Filter

### Functions

**Introduced in R2016b**

## Open Example

You have a modified version of this example. Do you want to open this example with your edits?

## MATLAB Command

You clicked a link that corresponds to this MATLAB command:

Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.

# Select a Web Site

Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .

You can also select a web site from the following list:

## How to Get Best Site Performance

Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.

### Americas

- América Latina (Español)
- Canada (English)
- United States (English)

### Europe

- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)

- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)