fft и спектр одиночного импульса
Интересует вопрос, связанный с возможностью построить амплитудный спектр одиночного импульса (прямоугольного, треугольного и т. д.) посредством fft.
Как понял, алгоритм fft используется для определения спектра дискретного периодического сигнала. При этом, на вход fft подаются отсчеты одного периода такого сигнала. Так, например, на вход fft можно подать прямоугольный импульс, взять результат по модулю, нормировать и на выходе получится один ненулевой отсчет с уровнем 1.
Ведь на самом деле, сигнал на входе является постоянным сигналом бесконечной длительности с уровнем 1. Хотя этот входной сигнал дискретный, а значит его спектр периодический.
Скрипт 1:
clear
close all
Ts = 1/64;
t = 0 : Ts : 2 - Ts;
x = ones(1, length(t));
Fs = 1/Ts;
f = 0 : Fs/length(x) : Fs - Fs/length(x);
y = fft(x);
figure(1)
set(gcf, 'Color', 'w')
subplot(211)
plot(t, x)
subplot(212)
stem(f, abs(y)/length(y))
Однако, возможно ли построить спектр одиночного импульса, который предполагается существующим только в промежутке от 0 до T?
Рассмотрим для примера тот же прямоугольный импульс, ограниченный временным интервалом [0:2]. Амплитудный спектр прямоугольного импульса определяется как ATsin(2*pi*T/2*f)/(2*pi*T/2*f). Насколько я понимаю, если составить следующий скрипт, то на рисунке всё-таки получится спектр не одиночного прямоугольного импульса, а повторяющихся дискретных прямоугольных импульсов длительностью 2 и периодом 10.
Скрипт 2:
clear
close all
Tc = 10;
Ts = 1/64;
t = 0 : Ts : Tc - Ts;
x = ones(1, length(t));
x(t >= 2) = 0;
Fs = 1/Ts;
f = 0 : Fs/length(x) : Fs - Fs/length(x);
y = fft(x);
figure(1)
set(gcf, 'Color', 'w')
subplot(211)
plot(t, x)
subplot(212)
stem(f, abs(y)/length(y));
Это логично, учитывая, с какими сигналами работает алгоритм ДПФ, а также его ускоренная версия fft. Об этом говорит и значение спектра на втором рисунке на нулевой частоте 0.2, поскольку огибающая спектра последовательности прямоугольных импульсов содержит множитель А*Т/Tс, где А - амплитуда импульса, Т - длительность импульса, а Tс - период следования импульсов.
(https://ru.dsplib.org/content/fourier_series_pimp/fourier_series_pimp.html)
При этом, единственное отличие результата от ожидаемого спектра одиночного импульса ATsin(2*pi*T/2*f)/(2*pi*T/2*f) состоит в присутствии ненужного множителя Tс. Если домножить спектр во втором скрипте на Tс=10 (скрипт 3), то на рисунке будет изображен спектр одиночного импульса с правильной нормализацией.
Скрипт 3:
clear
close all
Tc = 10;
Ts = 1/64;
t = 0 : Ts : Tc - Ts;
x = ones(1, length(t));
x(t >= 2) = 0;
Fs = 1/Ts;
f = 0 : Fs/length(x) : Fs - Fs/length(x);
y = fft(x);
figure(1)
set(gcf, 'Color', 'w')
subplot(211)
plot(t, x)
subplot(212)
plot(f, abs(y)/length(y)*Tc);
Однако, Tc/length(y) это и есть Ts. Тогда последнюю строчку можно переписать так:
plot(f, abs(y)*Ts);
Значит ли это, что для того, чтобы с помощью fft можно было строить спектры одиночных импульсов (неважно какой формы), достаточно производить нормирование не на длину входного вектора данных length(y), а умножать полученный результат на Ts, или в моих рассуждениях допущены ошибки?
Ответы
Да.
Вы не можете физически задать периодический сигнал. Он существует только абстрактно, в воображении. Какой бы длины вы ни задали сигнал (в реальной жизни), он у вас всегда ограничен. (на осциллографе, например, это ширина экрана). И спектр периодического сигнала вы можете построить только грубо говоря в уме, изначально предположив, что ф-ция периодическая и бесконечная. Это к примеру так же как дельта ф-ция. Она существует только в воображении, как теоретическая абстракция, которая позволяет удобными способами разрешать математические проблемы.