/*******************************************************************************
* This program calculates data for function
*
* s(t) = sin(1/sin(t))
*
*
* Saved files:
*
* dat/fourier_series_signal0.txt
* dat/fourier_series_signal1.txt
*
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "dspl.h"
/* size of arrays */
#define N 10000
int main(int argc, char* argv[])
{
double t[N]; /* argument array */
double s[N]; /* fucntion s(t) = sin(1/sin(t)) array */
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handle */
int k;
/* load libdspl.dll */
hdspl = dspl_load();
if(!hdspl)
{
printf("Cannot to load libdspl!\n");
return 0;
}
/* fill t array from -2*pi to 2*pi */
linspace(-M_2PI, M_2PI, N, DSPL_PERIODIC, t);
/* calculte s(t) = sin(1/sin(t)) for every t[k] */
for(k = 0; k < N; k++)
s[k] = sin(1.0/sin(t[k]));
/* save s(t) to the file dat/fourier_series_signal0.txt */
writetxt(t, s, N, "dat/fourier_series_signal0.txt");
/* fill t array from -0.2 to 0.2 */
linspace(-0.2, 0.2, N, DSPL_PERIODIC, t);
/* calculate s(t) = sin(1/sin(t)) for every t[k] */
for(k = 0; k < N; k++)
s[k] = sin(1.0/sin(t[k]));
/* save data to the file dat/fourier_series_signal1.txt */
writetxt(t, s, N, "dat/fourier_series_signal1.txt");
/* plotting by GNUPLOT */
gnuplot_create(argc, argv, 560, 380, "img/dirichlet_ex.png", &hplot);
gnuplot_cmd(hplot, "set grid");
gnuplot_cmd(hplot, "unset key");
gnuplot_cmd(hplot, "set xlabel 'x'");
gnuplot_cmd(hplot, "set ylabel 'sin(1/sin(x))'");
gnuplot_cmd(hplot, "plot 'dat/fourier_series_signal1.txt' with lines");
gnuplot_close(hplot);
/* free libdspl.dll */
dspl_free(hdspl);
return 0;
}
Representation of periodic signals by the Fourier series
We consider the expressions of the Fourier series in trigonometric and complex form, and also pay attention to the Dirichlet conditions for the convergence of the Fourier series. In addition, we will dwell in detail on the explanation of such a concept as the negative frequency of the signal spectrum, which often causes difficulty in getting acquainted with the theory of spectral analysis.
Let there be a periodic signal of continuous time , which repeats with a period s, that is, , where — is an arbitrary integer.
As an example, the figure 1 shows a sequence of rectangular pulses of duration s, repeating with a period of s.
From the course of mathematical analysis we know that the system of trigonometric functions
- Signal should not have infinite meanings.
- Signal must be piecewise continuous, i.e. have a finite number of break points of the first kind (jumps and removable breaks).
- Signal must be piecewise monotonic and have a finite number of extrema.
For example, the periodic function does not satisfy the Dirichlet conditions, because the function has discontinuities of the second kind and takes infinite values at , where — an arbitrary integer. Thus, the function cannot be represented by a Fourier series. We can also give an example of the function , which is limited, but also does not satisfy the Dirichlet conditions, since it has an infinite number of extremum points as it approaches zero. The function graph shown in the figure 2.
The figure 2а shows two repetition periods of the function , and the figure 2b — is an area in the neighborhood . You can see that when approaches zero, the oscillation frequency increases infinitely, and such a function cannot be represented by the Fourier series, because it is not piecewise monotonous.
It should be noted that in practice there are no signals with infinite values of current or voltage. Functions with an infinite number of extrema of type are neither found in applied tasks. All real periodic signals satisfy the Dirichlet conditions and can be represented by an infinite trigonometric Fourier series of the form:
In the expression (2), the coefficient sets the constant component of the periodic signal .
At all points where the signal is continuous, the Fourier series (2) converges to the values of the given signal, and at the break points of the first kind — to average , where and — are limits to the left and right of the break point, respectively.
It is also known from the course of mathematical analysis that the use of a truncated Fourier series containing only of the first terms instead of an infinite sum leads to an approximate representation of the signal :
In the previous section, we considered the trigonometric Fourier series for the expansion of an arbitrary periodic signal that satisfies the Dirichlet conditions. Applying the Euler formula, we can show:
Thus, the periodic signal can be represented by the sum of the constant component and complex exponentials rotating with frequencies with coefficients for positive frequencies , and for complex exponentials rotating with negative frequencies .
Consider the coefficients for complex exponentials rotating with positive frequencies :
Similarly, the coefficients for complex exponentials rotating with negative frequencies :
The expressions (6) and (7) coincide; in addition, the constant component can also be written through the complex exponent at zero frequency:
Thus, (5) considering (6)–(8) can be represented as a single sum for indexing from minus infinity to infinity:
From the expression (2) it follows that for the real signal , the coefficients and of the series (2) also are real. However, (9) associates a real signal , with a set of complex conjugate coefficients , related to both positive and negative frequencies .
In the previous section, we made the transition from the trigonometric Fourier series (2) to the Fourier series in complex form (9). As a result, instead of decomposing periodic signals in the basis of real trigonometric functions, we obtained decomposition in the basis of complex exponentials with complex coefficients and negative frequencies in the decomposition! Since this issue is often confused, some clarification is needed.
First, working with complex exponents is in most cases easier than with trigonometric functions. For example, when multiplying and dividing complex exponentials, it’s enough to just add (subtract) the indicators, while the formulas for multiplying and dividing trigonometric functions are more cumbersome.
Differentiating and integrating exponentials, even complex ones, is also easier than trigonometric functions that constantly change during differentiation and integration (the sine turns into cosine and vice versa).
If the signal is periodic and real, then the trigonometric Fourier series (2) seems more obvious, because all the expansion coefficients , , and remain real. However, one often has to deal with complex periodic signals (for example, when modulating and demodulating, a quadrature representation of the complex envelope is used). In this case, when using the trigonometric Fourier series, all coefficients , , and of the expansion (2) will become complex, while when using the Fourier series in the complex form (9), the same decomposition coefficients will be used, for both real and complex input signals.
And finally, it is necessary to dwell on the explanation of the negative frequencies that appeared in (9). This question often causes misunderstanding. In everyday life, we do not encounter negative frequencies. For example, we never tune our radio to a negative frequency. Let's consider the following analogy from mechanics. Let there be a mechanical spring pendulum that makes free oscillations with a certain frequency . Can a pendulum oscillate with a negative frequency of ? Of course, it cannot. Just as there are no radio stations broadcasting at negative frequencies, the pendulum oscillation frequency cannot be negative. But the spring pendulum — is a one-dimensional object (the pendulum oscillates along one straight line).
We can also give another analogy from mechanics: a wheel rotating with a frequency . The wheel, unlike the pendulum, rotates, i.e. a point on the surface of the wheel moves in the plane, and not just vibrates along one straight line. Therefore, to uniquely specify the rotation of the wheel, setting the speed is not enough, because you must also set the direction of rotation. For this we can use the sign of frequency.
So if the wheel rotates at an angular frequency rad/s counterclockwise, then we believe that the wheel rotates with a positive frequency, and if in the clockwise direction, then the speed will be negative. Thus, to specify rotation, the negative frequency ceases to be nonsense and indicates the direction of rotation.
And now the most important thing that we must understand. The oscillation of a one-dimensional object (for example, a spring pendulum) can be represented as the sum of the rotations of two vectors shown in the figure 4.
The pendulum oscillates along the material axis of the complex plane with a frequency according to harmonic law . The movement of the pendulum is shown by a horizontal vector. The upper vector rotates on the complex plane with a positive frequency (counterclock-wise), and the bottom vector rotates with a negative frequency (clockwise). The figure 4 clearly illustrates the well-known from the course of trigonometry ratio:
Thus, the Fourier series in complex form (9) represents periodic one-dimensional signals as the sum of vectors on the complex plane rotating with positive and negative frequencies. We note that in the case of a real signal, according to (9), the decomposition coefficients for negative frequencies are complex conjugate to the corresponding coefficients for positive frequencies . In the case of a complex signal, this property of the coefficients is not satisfied because and are also complex.
The Fourier series in complex form is the decomposition of a periodic signal to the sum of complex exponentials rotating with positive and negative frequencies multiple rad/s with corresponding complex coefficients , which determine the spectrum of the signal . The complex coefficients can be represented by the Euler formula as , where — amplitude spectrum, and — phase spectrum.
Since periodic signals are laid out in a row only on a fixed frequency grid , then the spectrum periodic signals is a linear spectrum(discrete).
The figure 5 shows an example of amplitude and phase spectrum of a periodic sequence of rectangular pulses (see Fig. 1) at s, pulse duration s and pulse amplitude V.
The amplitude spectrum of the original material signal is symmetric with respect to the zero frequency, and the phase spectrum — is antisymmetric. We note that the values of the phase spectrum and correspond to the same point in the complex plane .
We can conclude that all the decomposition coefficients of the reduced signal are purely real, and the phase spectrum corresponds to negative coefficients .
Note that the dimension of the amplitude spectrum coincides with the dimension of the signal . If describes the change in voltage over time, measured in volts, then the harmonic amplitudes of the spectrum will also have a dimension of volts.
This section discusses the representation of periodic signals using the Fourier series. The expressions for the Fourier series in trigonometric and complex forms are given. We paid special attention to the Dirichlet conditions for the convergence of the Fourier series and gave examples of functions for which the Fourier series diverges.
We elaborated on the expression of the Fourier series in complex form and showed that periodic signals, both real and complex, are represented with a series of complex exponentials with positive and negative frequencies. Moreover, the expansion coefficients are also complex and characterize amplitude and phase spectrum of a periodic signal.
In the next section, we will examine in more detail the properties of the spectra of periodic signals.
The data for constructing the drawings in this section were calculated using of the DSPL-2.0 library
Below is the source code of the data calculation program for drawing 2:
The source code of the program for calculating data for building
graphs of approximation of the rectangular pulses periodic sequence and
a sawtooth signal of the truncated Fourier series(Fig. 3):
/*******************************************************************************
* This function calculates approximation of periodic rectangular impulses
* and sawtooth signal by truncated Fourier series
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "dspl.h"
/* Size of arrays */
#define N 1000
/* time period (s) */
#define T 2
/* pulse duration (s) */
#define TAU 1
/* Max number of Fourier serie coefficients */
#define MAX_M 61
/* Number of periods */
#define P 3.0
int main(int argc, char* argv[])
{
double t[N]; /* time */
double s[N]; /* input signal */
double x[N]; /* approximation */
double w[MAX_M]; /* frequency */
complex_t S[MAX_M]; /* complex spectrum */
complex_t xc[N]; /* complex signal */
/*
* Numbers of truncated Fourier serie coefficients
* Note: 5 spectrum samples contains two pairs of conjugate spectrum
* samples and one mean value on the zero frequency.
* So 5 truncated Fourier serie coefficients in complex form corresponds
* to two values a_n and b_n in trigonometric form.
*/
int M[4] = {5, 9, 21, MAX_M};
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handle */
int k, n;
char fname[64]; /* saved data filename */
/* load libdspl.dll */
hdspl = dspl_load();
if(!hdspl)
{
printf("Cannot to load libdspl!\n");
return 0;
}
/* fill time array for P periods */
linspace(-T*0.5*P, T*0.5*P, N, DSPL_PERIODIC, t);
/*--------------------------------------------------------------------------*/
/* rectangular impulses */
signal_pimp(t, N, 1.0, TAU, 0.0, T, s);
/* save to dat/fourier_series_pimp0.txt */
writetxt(t, s, N, "dat/fourier_series_pimp0.txt");
/* for different numbers of truncated Fourier series coefficients */
for(k = 0; k < 4; k++)
{
/* Current complex spectrum */
fourier_series_dec(t, s, N, T, M[k], w, S);
/* Normalizing because P periods */
for(n = 0; n < M[k]; n++)
{
RE(S[n]) /= P;
IM(S[n]) /= P;
}
/* signal reconstruction from truncated Fourier serie */
fourier_series_rec(w, S, M[k], t, N, xc);
/* reconstructed signal image part is arround 1E-16. Ignore it */
cmplx2re(xc, N, x, NULL);
/* save to file */
sprintf(fname, "dat/fourier_series_pimp_rec_%d.txt", M[k]);
writetxt(t, x, N, fname);
}
/*--------------------------------------------------------------------------*/
/* sawtooth signal*/
signal_saw(t, N, 0.5, 0.0, T, s);
for(n = 0; n < N; n++)
s[n] += 0.5;
/* save to dat/fourier_series_saw0.txt */
writetxt(t, s, N, "dat/fourier_series_saw0.txt");
/* for different numbers of truncated Fourier series coefficients */
for(k = 0; k < 4; k++)
{
/* Current complex spectrum */
fourier_series_dec(t, s, N, T, M[k], w, S);
/* Normalizing because P periods */
for(n = 0; n < M[k]; n++)
{
RE(S[n]) /= P;
IM(S[n]) /= P;
}
/* signal reconstruction from truncated Fourier serie */
fourier_series_rec(w, S, M[k], t, N, xc);
/* reconstructed signal image part is arround 1E-16. Ignore it */
cmplx2re(xc, N, x, NULL);
/* save to file */
sprintf(fname, "dat/fourier_series_saw_rec_%d.txt", M[k]);
writetxt(t, x, N, fname);
}
/* GNUPLOT */
gnuplot_create(argc, argv, 800, 640, "img/fourier_series_rec.png", &hplot);
gnuplot_cmd(hplot, "unset key");
gnuplot_cmd(hplot, "set multiplot layout 4,2 rowsfirst");
gnuplot_cmd(hplot, "plot 'dat/fourier_series_pimp0.txt' with lines,\\");
gnuplot_cmd(hplot, " 'dat/fourier_series_pimp_rec_5.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fourier_series_saw0.txt' with lines,\\");
gnuplot_cmd(hplot, " 'dat/fourier_series_saw_rec_5.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fourier_series_pimp0.txt' with lines,\\");
gnuplot_cmd(hplot, " 'dat/fourier_series_pimp_rec_9.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fourier_series_saw0.txt' with lines,\\");
gnuplot_cmd(hplot, " 'dat/fourier_series_saw_rec_9.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fourier_series_pimp0.txt' with lines,\\");
gnuplot_cmd(hplot, " 'dat/fourier_series_pimp_rec_21.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fourier_series_saw0.txt' with lines,\\");
gnuplot_cmd(hplot, " 'dat/fourier_series_saw_rec_21.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fourier_series_pimp0.txt' with lines,\\");
gnuplot_cmd(hplot, " 'dat/fourier_series_pimp_rec_61.txt' with lines");
gnuplot_cmd(hplot, "plot 'dat/fourier_series_saw0.txt' with lines,\\");
gnuplot_cmd(hplot, " 'dat/fourier_series_saw_rec_61.txt' with lines");
gnuplot_cmd(hplot, "unset multiplot");
gnuplot_close(hplot);
/* free libdspl.dll */
dspl_free(hdspl);
return 0;
}
The source code of the program for calculating the amplitude and phase spectrum (Fig. 5):
/*******************************************************************************
* This program calculates amplitude amplitude and phase spectrum of
* periodic sequence of rectangular pulses
*
* Saved files:
*
* dat/fourier_series_pimp_mag.txt - amplitude spectrum
* dat/fourier_series_pimp_phi.txt - phase spectrum
*
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "dspl.h"
/* Number of samples in one time period */
#define N 1000
/* time period length (s) */
#define T 4
/* rectangular pulses duration (s) */
#define TAU 2
/* Number of spectrum samples */
#define K 41
int main(int argc, char* argv[])
{
double t[N]; /* time (s) */
double s[N]; /* input signal */
double w[K]; /* frequency (rad/s) */
complex_t S[K]; /* complex spectrum */
double mag[K]; /* amplitude spectrum */
double phi[K]; /* phase spectrum */
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handle */
int n;
/* Load libdspl.dll */
hdspl = dspl_load();
if(!hdspl)
{
printf("cannot to load libdspl!\n");
return 0;
}
/* fill one pertiod time array */
linspace(-T*0.5, T*0.5, N, DSPL_SYMMETRIC, t);
/* signal */
signal_pimp(t, N, 2.0, TAU, 0.0, T, s);
/* complex specctrum calculation */
fourier_series_dec(t, s, N, T, K, w, S);
/* amplitude and phase spectrum */
for(n = 0; n < K; n++)
{
mag[n] = ABS(S[n]);
phi[n] = atan2(IM(S[n]), RE(S[n]));
}
/* save amplitude spectrum */
writetxt(w, mag, K, "dat/fourier_series_pimp_mag.txt");
/* save phase spectrum */
writetxt(w, phi, K, "dat/fourier_series_pimp_phi.txt");
/* Plotting */
gnuplot_create(argc, argv, 560, 380, "img/spectrum.png", &hplot);
gnuplot_cmd(hplot, "unset key");
gnuplot_cmd(hplot, "set grid");
gnuplot_cmd(hplot, "set lmargin 8");
gnuplot_cmd(hplot, "set multiplot layout 2,1 rowsfirst");
gnuplot_cmd(hplot, "set xlabel 'Frequency, rad/s'");
gnuplot_cmd(hplot, "set ylabel 'Amplitude spectrum'");
gnuplot_cmd(hplot, "plot[-10*pi:10*pi] 'dat/fourier_series_pimp_mag.txt' with impulses lt 1 ,\\");
gnuplot_cmd(hplot, "'dat/fourier_series_pimp_mag.txt' with points pt 7 ps 0.5 lt 1");
gnuplot_cmd(hplot, "set ylabel 'Phase spectrum'");
gnuplot_cmd(hplot, "plot[-10*pi:10*pi] 'dat/fourier_series_pimp_phi.txt' with impulses lt 1 ,\\");
gnuplot_cmd(hplot, "'dat/fourier_series_pimp_phi.txt' with points pt 7 ps 0.5 lt 1");
gnuplot_cmd(hplot, "unset multiplot");
gnuplot_close(hplot);
/* free libdspl.dll */
dspl_free(hdspl);
return 0;
}
Some properties of the expansion of periodic signals in a Fourier series
The spectrum of the periodic sequence of rectangular pulses
Fourier transform of non-periodic signals