Main Content

Signal Generation and Visualization

This example shows how to generate widely used periodic and aperiodic waveforms, swept-frequency sinusoids, and pulse trains using functions available in Signal Processing Toolbox™.

Periodic Waveforms

In addition to the `sin` and `cos` functions in MATLAB®, Signal Processing Toolbox™ offers other functions, such as `sawtooth` and `square`, that produce periodic signals.

The `sawtooth` function generates a sawtooth wave with peaks at $±1$ and a period of $2\pi$. An optional width parameter specifies a fractional multiple of $2\pi$ at which the signal's maximum occurs.

The `square` function generates a square wave with a period of $2\pi$. An optional parameter specifies duty cycle, the percent of the period for which the signal is positive.

Generate 1.5 seconds of a 50 Hz sawtooth wave with a sample rate of 10 kHz. Repeat the computation for a square wave.

```fs = 10000; t = 0:1/fs:1.5; x1 = sawtooth(2*pi*50*t); x2 = square(2*pi*50*t); nexttile plot(t,x1) axis([0 0.2 -1.2 1.2]) xlabel("Time (sec)") ylabel("Amplitude") title("Sawtooth Periodic Wave") nexttile plot(t,x2) axis([0 0.2 -1.2 1.2]) xlabel("Time (sec)") ylabel("Amplitude") title("Square Periodic Wave")```

Aperiodic Waveforms

To generate triangular, rectangular and Gaussian pulses, the toolbox offers the `tripuls`, `rectpuls`, and `gauspuls` functions.

The `tripuls` function generates a sampled aperiodic, unit-height triangular pulse centered about t = 0 and with a default width of 1.

The `rectpuls` function generates a sampled aperiodic, unit-height rectangular pulse centered about t = 0 and with a default width of 1. The interval of nonzero amplitude is defined to be open on the right: `rectpuls(-0.5) = 1` while `rectpuls(0.5) = 0`.

Generate 2 seconds of a triangular pulse with a sample rate of 10 kHz and a width of 20 ms. Repeat the computation for a rectangular pulse.

```fs = 10000; t = -1:1/fs:1; x1 = tripuls(t,20e-3); x2 = rectpuls(t,20e-3); figure nexttile plot(t,x1) axis([-0.1 0.1 -0.2 1.2]) xlabel("Time (sec)") ylabel("Amplitude") title("Triangular Aperiodic Pulse") nexttile plot(t,x2) axis([-0.1 0.1 -0.2 1.2]) xlabel("Time (sec)") ylabel("Amplitude") title("Rectangular Aperiodic Pulse")```

The `gauspuls` function generates a Gaussian-modulated sinusoidal pulse with a specified time, center frequency, and fractional bandwidth.

The `sinc` function computes the mathematical sinc function for an input vector or matrix. The sinc function is the continuous inverse Fourier transform of a rectangular pulse of width $2\pi$ and unit height.

Generate a 50 kHz Gaussian RF pulse with 60% bandwidth, sampled at a rate of 1 MHz. Truncate the pulse where the envelope falls 40 dB below the peak.

```tc = gauspuls("cutoff",50e3,0.6,[],-40); t1 = -tc : 1e-6 : tc; y1 = gauspuls(t1,50e3,0.6);```

Generate the sinc function for a linearly spaced vector:

```t2 = linspace(-5,5); y2 = sinc(t2); figure nexttile plot(t1*1e3,y1) xlabel("Time (ms)") ylabel("Amplitude") title("Gaussian Pulse") nexttile plot(t2,y2) xlabel("Time (sec)") ylabel("Amplitude") title("Sinc Function")```

Swept-Frequency Waveforms

The toolbox also provides functions to generate swept-frequency waveforms such as the `chirp` function. Two optional parameters specify alternative sweep methods and initial phase in degrees. Below are several examples of using the `chirp` function to generate linear or quadratic, convex, and concave quadratic chirps.

Generate a linear chirp sampled at 1 kHz for 2 seconds. The instantaneous frequency is 100 Hz at t = 0 and crosses 250 Hz at t = 1 second.

```tlin = 0:0.001:2; ylin = chirp(tlin,100,1,250);```

Generate a quadratic chirp sampled at 1 kHz for 4 seconds. The instantaneous frequency is 100 Hz at t = 0 and crosses 200 Hz at t = 1 second.

```tq = -2:0.001:2; yq = chirp(tq,100,1,200,"quadratic");```

Compute and display the spectrograms of the chirps.

```figure nexttile pspectrum(ylin,tlin,"spectrogram", ... Leakage=0.85,TimeResolution=0.1,OverlapPercent=99) title("Linear Chirp") nexttile pspectrum(yq,tq,"spectrogram", ... Leakage=0.85,TimeResolution=0.1,OverlapPercent=99) title("Quadratic Chirp")```

Generate a convex quadratic chirp sampled at 1 kHz for 2 seconds. The instantaneous frequency is 100 Hz at t = 0 and increases to 400 Hz at t = 1 second.

```tcx = -1:0.001:1; fo = 100; f1 = 400; ycx = chirp(tcx,fo,1,f1,"quadratic",[],"convex");```

Generate a concave quadratic chirp sampled at 1 kHz for 2 seconds. The instantaneous frequency is 400 Hz at t = 0 and decreases to 100 Hz at t = 1 second.

```tcv = -1:0.001:1; fo = 400; f1 = 100; ycv = chirp(tcv,fo,1,f1,"quadratic",[],"concave");```

Compute and display the spectrograms of the chirps.

```figure nexttile pspectrum(ycx,tcx,"spectrogram", ... Leakage=0.85,TimeResolution=0.1,OverlapPercent=99) title("Convex Chirp") nexttile pspectrum(ycv,tcv,"spectrogram", ... Leakage=0.85,TimeResolution=0.1,OverlapPercent=99) title("Concave Chirp")```

Another function generator is the `vco` (voltage-controlled oscillator), which generates a signal oscillating at a frequency determined by the input vector. The input vector can be a triangle, a rectangle, or a sinusoid, among other possibilities.

Generate 2 seconds of a signal sampled at 10 kHz whose instantaneous frequency is a triangle. Repeat the computation for a rectangle.

```fs = 10000; t = 0:1/fs:2; x1 = vco(sawtooth(2*pi*t,0.75),[0.1 0.4]*fs,fs); x2 = vco(square(2*pi*t),[0.1 0.4]*fs,fs);```

Plot the spectrograms of the generated signals.

```figure nexttile pspectrum(x1,t,"spectrogram", ... Leakage=0.9,FrequencyResolution=55) title("VCO Triangle") nexttile pspectrum(x2,t,"spectrogram", ... Leakage=0.9,FrequencyResolution=55) title("VCO Rectangle")```

Pulse Trains

To generate pulse trains, you can use the `pulstran` function.

Construct a train of 1 ns rectangular pulses sampled at a rate of 100 GHz with a spacing of 7.5 ns.

```fs = 100e9; D = [2.5 10 17.5]' * 1e-9; t = 0 : 1/fs : 2500/fs; w = 1e-9; yp = pulstran(t,D,@rectpuls,w);```

Generate a periodic Gaussian pulse signal at 10 kHz with 50% bandwidth. The pulse repetition frequency is 1 kHz, the sample rate is 50 kHz, and the pulse train length is 10 milliseconds. The repetition amplitude should attenuate by 0.8 each time. Uses a function handle to specify the generator function.

```T = 0 : 1/50e3 : 10e-3; D = [0 : 1/1e3 : 10e-3 ; 0.8.^(0:10)]'; Y = pulstran(T,D,@gauspuls,10e3,.5); figure nexttile plot(t*1e9,yp) axis([0 25 -0.2 1.2]) xlabel("Time (ns)") ylabel("Amplitude") title("Rectangular Train") nexttile plot(T*1e3,Y) xlabel("Time (ms)") ylabel("Amplitude") title("Gaussian Pulse Train")```