Программа производит расчет данных для представления периодической последовательности прямоугольных импульсов и пилообразного сигнала усеченным рядом Фурье.
Программа формирует P=3
периодов последовательности прямоугольных импульсов и пилообразного сигнала и производит их аппроксимацию усеченным рядом Фурье в комплексной форме при различном количестве членов усеченного ряда: от 2 до 30.
Для каждого усеченного ряда производится расчет представления периодической последовательности прямоугольных импульсов и пилообразного сигнала и сохранение полученных данных в текстовые файлы для построения графиков.
Программа GNUPLOT произведет построение графика по сохраненным в файлах данным.
Скрипт GNUPLOT fourier_series_rec.plt
для построения графиков из текстовых файлов:
### Start multiplot (2x2 layout)
set terminal pngcairo size 800,640 enhanced font 'Verdana,8'
set output 'img/fourier_series_rec.png'
unset key
set multiplot layout 4,2 rowsfirst
#
plot 'dat/fourier_series_pimp0.txt' with lines,\
'dat/fourier_series_pimp_rec_5.txt' with lines
#
plot 'dat/fourier_series_saw0.txt' with lines,\
'dat/fourier_series_saw_rec_5.txt' with lines
#
plot 'dat/fourier_series_pimp0.txt' with lines,\
'dat/fourier_series_pimp_rec_9.txt' with lines
#
plot 'dat/fourier_series_saw0.txt' with lines,\
'dat/fourier_series_saw_rec_9.txt' with lines
#
plot 'dat/fourier_series_pimp0.txt' with lines,\
'dat/fourier_series_pimp_rec_21.txt' with lines
#
plot 'dat/fourier_series_saw0.txt' with lines,\
'dat/fourier_series_saw_rec_21.txt' with lines
#
plot 'dat/fourier_series_pimp0.txt' with lines,\
'dat/fourier_series_pimp_rec_61.txt' with lines
#
plot 'dat/fourier_series_saw0.txt' with lines,\
'dat/fourier_series_saw_rec_61.txt' with lines
unset multiplot
График будет отображен на экране и сохранен в файл img/fourier_series_rec.png
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "dspl.h"
#define N 1000
#define T 2
#define TAU 1
#define MAX_M 61
#define P 3.0
int main(int argc, char* argv[])
{
double t[N];
double s[N];
double x[N];
double w[MAX_M];
int M[4] = {5, 9, 21, MAX_M};
void* handle;
int k, n;
char fname[64];
handle = dspl_load();
if(!handle)
{
printf("cannot to load libdspl!\n");
return 0;
}
linspace(-T*0.5*P, T*0.5*P, N, DSPL_PERIODIC, t);
signal_pimp(t, N, 1.0, TAU, 0.0, T, s);
writetxt(t, s, N, "dat/fourier_series_pimp0.txt");
for(k = 0; k < 4; k++)
{
for(n = 0; n < M[k]; n++)
{
}
fourier_series_rec(w, S, M[k], t, N, xc);
sprintf(fname, "dat/fourier_series_pimp_rec_%d.txt", M[k]);
writetxt(t, x, N, fname);
}
signal_saw(t, N, 0.5, 0.0, T, s);
for(n = 0; n < N; n++)
s[n] += 0.5;
writetxt(t, s, N, "dat/fourier_series_saw0.txt");
for(k = 0; k < 4; k++)
{
for(n = 0; n < M[k]; n++)
{
}
fourier_series_rec(w, S, M[k], t, N, xc);
sprintf(fname, "dat/fourier_series_saw_rec_%d.txt", M[k]);
writetxt(t, x, N, fname);
}
dspl_free(handle);
return system("gnuplot -p gnuplot/fourier_series_rec.plt");
}