libdspl-2.0
fourier_series_pimp_spectrum.c

Расчет амплитудного и фазового спектра периодической последовательности прямоугольных импульсов

Программа формирует один период последовательности прямоугольных импульсов и производит расчет амплитудного и фазового спектра.

Результаты расчета сохраняются в файлы и выводятся на график программой GNUPlot

Скрипт GNUPLOT fourier_series_pimp.plt для построения графиков из текстовых файлов:

set terminal wxt 0 size 560,480 enhanced font 'Verdana,8' position 0,0
unset key
set grid
set lmargin 8
set multiplot layout 2,1 rowsfirst
set xlabel 'Частота, рад/с'
#
set ylabel 'Амплитудный спектр'
plot[-10*pi:10*pi] 'dat/fourier_series_pimp_mag.txt' with impulses lt 1 ,\
'dat/fourier_series_pimp_mag.txt' with points pt 7 ps 0.5 lt 1
#
set ylabel 'Фазовый спектр'
plot[-10*pi:10*pi] 'dat/fourier_series_pimp_phi.txt' with impulses lt 1 ,\
'dat/fourier_series_pimp_phi.txt' with points pt 7 ps 0.5 lt 1
unset multiplot
set terminal pngcairo size 560,480 enhanced font 'Verdana,8'
set output 'img/fourier_series_pimp.png'
set multiplot layout 2,1 rowsfirst
#
plot[-10*pi:10*pi] 'dat/fourier_series_pimp_mag.txt' with impulses lt 1 ,\
'dat/fourier_series_pimp_mag.txt' with points pt 7 ps 0.5 lt 1
#
plot[-10*pi:10*pi] 'dat/fourier_series_pimp_phi.txt' with impulses lt 1 ,\
'dat/fourier_series_pimp_phi.txt' with points pt 7 ps 0.5 lt 1
unset multiplot

График будет отображен на экране и сохранен в файл img/fourier_series_pimp.png

fourier_series_pimp.png
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "dspl.h"
#define N 1000
#define T 4
#define TAU 2
#define K 41
int main(int argc, char* argv[])
{
double t[N]; // время
double s[N]; // исходный сигнал
double w[K]; // массив частоты
complex_t S[K]; // спектр
double mag[K]; // амплитудный спектр
double phi[K]; // фазовый спектр
void* handle;
int k, n;
handle = dspl_load();
if(!handle)
{
printf("cannot to load libdspl!\n");
return 0;
}
// заполняем массив времени для одного периода сигнала
linspace(-T*0.5, T*0.5, N, DSPL_SYMMETRIC, t);
// сигнал
signal_pimp(t, N, 2.0, TAU, 0.0, T, s);
// расчет комплексного спектра
fourier_series_dec(t, s, N, T, K, w, S);
// Амплитудный и фазовый спектры
for(n = 0; n < K; n++)
{
mag[n] = ABS(S[n]);
phi[n] = atan2(IM(S[n]), RE(S[n]));
}
// Сохранение амплитудного спектра в файл
writetxt(w, mag, K, "dat/fourier_series_pimp_mag.txt");
// Сохранение фазового спектра в файл
writetxt(w, phi, K, "dat/fourier_series_pimp_phi.txt");
// remember to free the resource
dspl_free(handle);
return system("gnuplot -p gnuplot/fourier_series_pimp.plt");
}