# comm.FSKModulator

Modulate using M-ary FSK method

## Description

The `comm.FSKModulator` System object™ modulates a signal using the M-ary frequency shift keying (M-FSK) method. The output is a baseband representation of the modulated signal. For more information, see Algorithms.

To modulate a signal using frequency shift keying:

1. Create the `comm.FSKModulator` object and set its properties.

2. Call the object with arguments, as if it were a function.

## Creation

### Syntax

``fskmodulator = comm.FSKModulator``
``fskmodulator = comm.FSKModulator(Name=Value)``
``fskmodulator = comm.FSKModulator(M,freqSep,RS,Name=Value)``

### Description

example

````fskmodulator = comm.FSKModulator` creates a modulator System object that modulates the input signal using the M-ary frequency shift keying method.```
````fskmodulator = comm.FSKModulator(Name=Value)` creates an FSK modulator object and sets properties using one or more name-value arguments. For example, `comm.FSKModulator(BitInput=true)` that specifies input values must be binary.```
````fskmodulator = comm.FSKModulator(M,freqSep,RS,Name=Value)` creates an M-FSK modulator object with the `ModulationOrder` property set to `M`, the `FrequencySeparation` property set to `freqSep`, the `SymbolRate` property set to `RS`, and optional name-value arguments.```

## Properties

expand all

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.

Number of frequencies in the modulated signal, specified as a positive integer ≥ 2.

Note

The modulation order, M, must be a power of two, such that M = 2K, where K is a positive integer when you set `SymbolMapping` to `'Gray'` or you set `BitInput` to `true`.

Data Types: `double`

Option to provide input in bits, specified as a numeric or logical `0` (`false`) or `1` (`true`).

• When you set this property to `false`,the input values must be integers in the range [`0`, (M – 1)]. If M equals `2`, the input vector can be logical values. M represents the value of the `ModulationOrder` property.

• When you set this property to `true`, the input values must be a column vector of bit values. The data type of the input values must be double-precision or logical. The input vector length must be an integer multiple of the number of bits per symbol, log2(M). This vector contains bit representations of integers in the range [`0`, (M – 1)] and M must be a power of two. Groups of log2(`M`) bits are mapped onto a symbol, with the first bit representing the MSB and the last bit representing the LSB.

Data Types: `logical`

Symbol encoding mapping, specified as `'Gray'` or `'Binary'`. Each integer or group of log2(M) bits corresponds to one symbol. M represents the value of the `ModulationOrder` property.

• When you set this property to `'Gray'`, the object maps symbols to a Gray-encoded ordering.

• When you set this property to `'Binary'`, the object maps symbols to a natural binary-encoded ordering.

For either type of mapping, the object maps the lowest frequency to the integer 0 and maps the highest frequency to the integer M – 1. In baseband simulation, the lowest frequency is the negative frequency with the largest absolute value.

Frequency separation between successive tones in the modulated signal in hertz, specified as a positive scalar value. For more information, see Avoid Output Signal Aliasing.

Data Types: `double`

Phase continuity, specified as a numeric or logical `0` (`false`) or `1` (`true`).

• When you set this property to `true`, the modulated signal maintains continuous phase, even when its frequency changes.

• When you set this property to `false`, the modulated signal comprises portions of M sinusoids of different frequencies. In this case, a change in the input value can cause a discontinuous change in the phase of the modulated signal. M represents the value of the `ModulationOrder` property.

Data Types: `logical`

Number of samples per output symbol for each integer or binary word in the input, specified as a positive integer. For more information, see Avoid Output Signal Aliasing.

Data Types: `double`

Symbol rate in symbols per second, specified as a positive scalar. The symbol duration remains the same, regardless of whether the input signal is bits or integers. For more information, see Avoid Output Signal Aliasing.

Data Types: `double`

Data type of output, specified as either `"double"` or `"single"`.

## Usage

### Syntax

``y = fskmodulator(x)``

### Description

example

````y = fskmodulator(x)` modulates the input signal by using the FSK method. The output is the modulated FSK baseband signal.```

### Input Arguments

expand all

Input signal, specified as an integer or bit-valued column vector with numeric or logical data types. The `BitInput` property specifies the expected input type and vector length constraints.

### Output Arguments

expand all

Modulated output signal, returned as a column vector.

## 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)`

expand all

 `step` Run System object algorithm `release` Release resources and allow changes to System object property values and input characteristics `reset` Reset internal states of System object

## Examples

collapse all

Modulate and demodulate a signal using 8-FSK modulation with a frequency separation of 100 Hz.

Create FSK modulator and demodulator System objects with modulation order 8 and 100 Hz frequency separation.

```M = 8; freqSep = 100; fskmodulator = comm.FSKModulator(M,freqSep); fskdemodulator = comm.FSKDemodulator(M,freqSep);```

Create an additive white Gaussian noise channel with a signal-to-noise ratio of -2 dB.

```awgnchan = comm.AWGNChannel( ... NoiseMethod="Signal to noise ratio (SNR)", ... SNR=-2);```

Create an error rate calculator object.

`errRate = comm.ErrorRate;`

Transmit one hundred 50-symbol frames using 8-FSK modulation in an AWGN channel.

```for counter = 1:100 data = randi([0 M-1],50,1); modSignal = fskmodulator(data); noisySignal = awgnchan(modSignal); receivedData = fskdemodulator(noisySignal); errorStats = errRate(data,receivedData); end```

Display the error statistics.

```es1 = 'Error rate = %4.2e\n'; es2 = 'Number of errors = %d\n'; es3 = 'Number of symbols = %d\n'; fprintf([es1 es2 es3],errorStats)```
```Error rate = 1.40e-02 Number of errors = 70 Number of symbols = 5000 ```

Visualize symbol mapping of an FSK modulated signal with a spectrogram.

Specify 20 samples for each symbol. The symbol 0 maps to -50 kHz (negative phase slope) and the symbol 1 maps to +50 kHz (positive phase slope).

```mod = comm.FSKModulator(ModulationOrder=2, ... FrequencySeparation=1e5, ... SamplesPerSymbol=20, ... SymbolRate=1e4); x = mod([0 1 0 1 0 1]'); figure subplot(1,2,1) plot(unwrap(angle(x)),0:length(x)-1) grid on xlabel("Phase") ylabel("Samples") subplot(1,2,2) spectrogram(x,20,0,[], ... mod.SymbolRate*mod.SamplesPerSymbol,"centered")```

The FSK modulator System object can be configured to modulate data input as integer values or as binary values. The FSK demodulator System object can be configured to demodulate symbols and output as integer values or as binary values. Each integer or group of log2(M) bits corresponds to one symbol. M represents the value of the `ModulationOrder` property. Compute the expected signal lengths for input and output of FSK modulation and demodulation of the integer and binary signals. Display the resulting signal lengths for input and output of the FSK modulated and demodulated integer and binary signals.

Define variable to use when configuring FSK modulator and demodulator objects.

```M = 8; % Modulation order freqSep = 100; % Frequency separation nspf = 21; % Number of samples per frame sps = 10; % Samples per symbol fskmod_bit = comm.FSKModulator(M,freqSep, ... BitInput=true, ... SamplesPerSymbol=sps); fskmod_bif = comm.FSKModulator(M,freqSep, ... BitInput=false, ... SamplesPerSymbol=sps); fskdemod_bot = comm.FSKDemodulator(M,freqSep, ... BitOutput=true, ... SamplesPerSymbol=sps); fskdemod_bof = comm.FSKDemodulator(M,freqSep, ... BitOutput=false, ... SamplesPerSymbol=sps); ```

Generate integer data and modulate data by using an FSK modulator object configured to accept bit data (`BitInput=true`).

```bindata = randi([0 1],nspf*M,1); modSignal = fskmod_bit(bindata);```

Demodulate the data, and then output binary data from the first demodulator object and integer data from the second demodulator. Compute the expected and resulting input and output signal lengths.

```rxData_bot = fskdemod_bot(modSignal); rxData_bof = fskdemod_bof(modSignal);```

Compute expected input and output lengths for a binary input signal.

```Nbit = length(bindata); Nsym = sps*length(bindata)/log2(M); Nbot = (length(modSignal)/sps)*log2(M); Nbof = length(modSignal)/sps; expLen = sprintf(' Nbit Nsym Nbot Nbof\n %d %d %d %d', ... length(bindata),length(modSignal), ... length(rxData_bot),length(rxData_bof))```
```expLen = ' Nbit Nsym Nbot Nbof 168 560 168 56' ```

Display input and output lengths for a binary input signal.

```sigLen = sprintf(' bit sym bot bof\n %d %d %d %d', ... length(bindata),length(modSignal), ... length(rxData_bot),length(rxData_bof))```
```sigLen = ' bit sym bot bof 168 560 168 56' ```

Generate integer data and modulate data by using an FSK modulator object configured to accept integer data (`BitInput=false`).

```data = randi([0 M-1],nspf,1); modSignal = fskmod_bif(data);```

Because the input length changes, you must release the demodulator objects before reusing them. Demodulate the data, and then output binary data from the first demodulator object and integer data from the second demodulator. Compute the expected and resulting input and output signal lengths.

```release(fskdemod_bot) release(fskdemod_bof) rxData_bot = fskdemod_bot(modSignal); rxData_bof = fskdemod_bof(modSignal);```

Compute expected input and output lengths for an integer input signal.

```Nbif = length(data); Nsym = sps*length(data); Nbot = (length(modSignal)/sps)*log2(M); Nbof = length(modSignal)/sps; expLen = sprintf('Nbif Nsym Nbot Nbof\n %d %d %d %d', ... length(data),length(modSignal), ... length(rxData_bot),length(rxData_bof))```
```expLen = 'Nbif Nsym Nbot Nbof 21 210 63 21' ```

Display input and output lengths for an integer input signal.

```sigLen = sprintf(' bif sym bot bof\n %d %d %d %d', ... length(data),length(modSignal), ... length(rxData_bot),length(rxData_bof))```
```sigLen = ' bif sym bot bof 21 210 63 21' ```

expand all

## Algorithms

As described in Sklar [1], the general analytical expression for M-FSK modulation is

`${s}_{i}\left(t\right)=\sqrt{\frac{2E}{T}\mathrm{cos}\left({\omega }_{i}t+\varphi \right)}\begin{array}{cc}& \begin{array}{c}\text{0}\le t\le T\\ i\text{=1,}...\text{,}M\end{array}\end{array}$`

• E is the symbol energy.

• T is the symbol time duration.

• ωi is the frequency term that has M discreet values.

• M is the modulation order and specifies the number of waveforms.

• ϕ is the phase offset.

## References

[1] Sklar, Bernard. Digital Communications: Fundamentals and Applications. 2nd ed. Upper Saddle River, N.J: Prentice-Hall PTR, 2001.

## Version History

Introduced in R2012a