Основы цифровой обработки сигналов
04. Частотное представление сигнала
Рассмотрим представление сложных сигналов набором простых (базисных) периодических сигналов, познакомимся с концепцией ряда Фурье, мерой схожести исследуемого сигнала и базисной функции.
Создание "неизвестного" сигнала
Из четырёх синусоид разной амплитуды, частоты и начальной фазы:
t = 0:0.05:4pi;
s1 = sin.(t/3 .+ 3pi/2);
s2 = 0.55*sin.(t .- 3pi/5);
s3 = 0.25*sin.(2*t .- pi/2);
s4 = 0.10*sin.(4*t);
mysterious_signal = s1 + s2 + s3 + s4;
plot(t, mysterious_signal, lw = 4, leg=false)
plot!(t, [s1, s2, s3, s4])
Создание периодических сигналов
Рассмотрим принципы создания периодических сигналов - меандра и пилы - посредством добавления членов ряда Фурье:
x = sin.(t);
plot(t,x)
y = sin.(t) + 1/3 * sin.(3*t);
plot(t,y)
Приближение прямоугольного сигнала (меандра) при помощи первых девяти (с учётом нулевых) членов ряда Фурье:
z = sin.(t) + sin.(3*t)/3 + sin.(5*t)/5 + sin.(7*t)/7 + sin.(9*t)/9;
plot(t,z)
Приближение пилообразного сигнала при помощи пяти первых членов ряда Фурье:
st = sin.(t) + sin.(2*t)/2 + sin.(3*t)/3 + sin.(4*t)/4 + sin.(5*t)/5;
plot(t,st)
Интерактивная ячейка, позволяющая изменять количество членов ряда Фурье N для приближения сигналов меандра и пилы:
N = 20 # @param {type:"slider",min:1,max:20,step:1}
timevec = 0:0.02:4pi;
square_approx = zeros(length(timevec));
sawtooth_approx = zeros(length(timevec));
for n = 1:N
square_approx = square_approx + sin.((2n-1)*timevec)/(2n-1);
sawtooth_approx = sawtooth_approx + sin.(n*timevec)/n;
end
plot(timevec,[sawtooth_approx, square_approx], leg=false, lw=2, size=(700,300))
Схожесть сигнала с базисной функцией
Вычисление суммы (интеграла) произведения исследуемого сигнала - синусоиды с неизменной частотой повторения - с базисной синусоидой изменяемой частоты. Частота базисного сигнала в xtimes раз отличается от частоты исследуемого:
xtimes = 2.15 # @param {type:"slider",min:0,max:4,step:0.05}
tvec = 0:0.01:4pi;
likeness = round(sum(sin.(tvec) .* sin.(xtimes*tvec)) / 2pi);
println("Соответствие = " * string(likeness) * " %")
p1 = plot(tvec,[sin.(tvec), sin.(xtimes*tvec)], lw=2, labels=["Сигнал" "Базис"]);
p2 = plot(tvec, sin.(tvec) .* sin.(xtimes*tvec), lw=2, lc=:green, label="Произведение");
plot(p1, p2, size = (800,250))
График зависимости "меры схожести" исследуемого сигнала в зависимости от множителя частоты базисной функции:
xtimes_span = 0:0.01:4;
nbins = length(xtimes_span);
timespan = 0:0.01:4pi;
sumproduct = zeros(nbins);
for i = 1:nbins
sumproduct[i] = round(sum(sin.(timespan) .* sin.(xtimes_span[i]*timespan)) / 2pi);
end
plot(xtimes_span,sumproduct,l=:stem, m=:c, ms=2, leg=false)