Изучение понятия и свойств непрерывной и дискретной свертки. Вариант 1, страница 2

y(n) = y(n)*T;  

end

%графиксверткисигналов

subplot(413), stem(k1*T,y),title(' Convolution: x1*x2')

%вычисление свертки с помощью функции conv()

subplot(414), stem(k1*T,T*conv(x1,x2)),     title('Convolution (conv):x1*x2')

Рис.4. Графики единичного импульса, прямоугольной волны, их свёртки и свёртки, вычисленной с помощью функции conv()

Комментарий:          Очевидно, что свертка сигналов в точности повторяет сигнал sqgen(50, 10). При каждом n значение свертки определяется как соответствующее значение сигнала sqgen(50, 10), умноженное на единицу, все остальные слагаемые свертки зануляются.

7.         Генерирование delta2=[1    zeros(1,9)]. Свёртка delta2 и sqgen(50, 10).

Matlab script(labrab55.m)

T = 1;                    %шаг дискретизации

i = 0:1:49;

x1 = [1 zeros(1,9)];      %сигнал delta2=[1 zeros(1,9)]

x2 = sqgen(50,10);        %генерированиепрямоугольнойволны

n1 = length(x1);

n2 = length(x2);

subplot(411),  stem(0:9,x1),  title('delta2=[1 zeros(1,9)]')

subplot(412),  stem(i*T,x2),  title(' sqgen(50,10)')

k1 = 1:n1+n2-1;

%вычисление  свертки

for  n = 1:n1+n2-1,

   y(n) = 0;

   for k = max(1,n+1-n1):min(n,n2),

      y(n) = y(n)+sum(x1(n+1-k)*x2(k));

   end

y(n) = y(n)*T;  

end

%графиксверткисигналов

subplot(413),  stem(k1*T,y),  title(' Convolution: x1*x2')

%вычисление свертки с помощью функции conv()

subplot(414), stem(k1*T,T*conv(x1,x2)),     title('Convolution (conv):x1*x2')

Рис.5. Графики delta2=[1    zeros(1,9)] сигнала, прямоугольной волны, их свёртки и свёртки, вычисленной с помощью функции conv()

Комментарий:          Сравнивая рис.4 и рис.5 можно сказать, что при увеличении длительности сигнала длина свёртки также увеличивается вследствие того, что равна n1+n2-1, где n1 и n2- длины сигналов. В первом случае: длина первого сигнала – 1, длина второго – 50, следовательно длина свёртки – 50 (что можно наблюдать на рис.4), во втором случае (при дополнении нулями первого сигнала): длина первого сигнала – 10, длина второго сигнала – 50, длина свёртки – 59. Следовательно, всегда можно дополнить недостающие отсчеты одной из функций нулевыми отсчетами и уже от этих функций с другими длинами вычислить свертку. Последние 9 отсчётов свёртки принимают нулевые значения, т.к. со 2 по 10 отсчёты в первом сигнале - нули.

8.         Генерирование плоского импульса с помощью команды  h1=[ones(1,2)]. Свёртка h1 и  sqgen(50, 10). Увеличение  длины импульса до 8, свёртка полученного импульса и sqgen(50, 10).

Matlab script(labrab56.m)

T = 1;               %шагдискретизации

i = 0:49;

x1 = [ones(1,2)];

x2 = sqgen(50,10);

n1 = length(x1);

n2 = length(x2);

subplot(311), stem(0:1,x1), title('h1=[ones(1,2)]')

subplot(312), stem(i*T,x2),    title('sqgen(50, 10)')

k1 = 1:n1+n2-1;

%вычисление свертки с помощью функции conv()

subplot(313), stem(k1*T,T*conv(x1,x2)),     title('Convolution (conv):x1*x2')

Рис.6. Графики h1=[ones(1,2)] сигнала, прямоугольной волны и их свёртки, вычисленной с помощью функции conv()

Matlab script(labrab57.m)

T = 1;               %шаг дискретизации

i = 0:49;

x1 = [ones(1,8)];

x2 = sqgen(50,10);

n1 = length(x1);

n2 = length(x2);

subplot(311), stem(0:7,x1), title('h2=[ones(1,8)]')

subplot(312), stem(i*T,x2),    title('sqgen(50, 10)')

k1 = 1:n1+n2-1;

%вычисление свертки с помощью функции conv()

subplot(313), stem(k1*T,T*conv(x1,x2)),     title('Convolution (conv):x1*x2')

Рис.7. Графики h2=[ones(1,8)] сигнала, прямоугольной волны и их свёртки, вычисленной с помощью функции conv()

Комментарий:          Сравнивая рис.6 и рис.7 можно сказать, что с увеличением длины первого сигнала свёртка меняет свой вид. В первом случае: длина первого сигнала – 2, длина второго – 50, следовательно длина свёртки – 51, во втором случае: длина первого сигнала – 8, длина второго сигнала – 50, длина свёртки – 57. Из рисунков видно, что также как и в предыдущих пунктах (п.2, п.3), если один из сигналов короче другого, то в результирующей свёртке меняют вид только передний и задний фронты (в начале отсчётов  и в конце отсчётов (где количество отсчётов равно длительности первого сигнала, т.е. в первом случае – 2, во втором - 8)). На рис.7 видно, что значения первых и последних 8 отсчетов свертки равномерно увеличиваются и уменьшаются на 1 в зависимости от того положительные или отрицательные значения имеет сигнал sqgen(50, 10) в соответствующих отсчетах. На остальных отсчетах свертка представляет собой прямоугольную последовательность амплитуды 2 с нулевыми значениями в 9, 14, 19, 24, 29 и т.д. отсчетах. При увеличении длительности сигнала h1 вид свертки будет все больше приближаться к треугольной последовательности амплитуды 5, т.е. значение каждого последующего отсчета будет на 1 отличаться от предыдущего в зависимости от знака сигнала sqgen(50, 10) в соответствующем отсчете.

9.         Вычисление свёртки сигналов

                                   

где      - дискретная единичная ступенчатая функция.

Восстановление сигнала  из свертки с помощью функции deconv().

[q, r] = deconv(z,  x) – выполняет операцию, обратную свертке, результат сохраняется в векторе q, а остаток в векторе r , что Z=conv(x,q)+r.

Matlab function(fun.m)

%функция для определения единичной ступенчатой функции

function u=fun(t)

for i=1:length(t)

    if t(i)>=0

        u(i)=1;

    end

    if t(i)<0

        u(i)=0;

    end

end

Matlab script(labrab58.m)

T = 5;

t = -T:T; %определение временного интервала

tt = 0:25;

t1 = tt-5;

t2 = tt+5;

u = fun(tt);   %определение функции u(t)

u1 = fun(t1); %определение функции u(t-5)

u2 = fun(t2); %определение функции u(t+5)

x1 = sinc(t/pi);     %определение сигналов

x2 = u-u1;

x = conv(x1,x2);      %вычисление свертки сигналов

subplot(4,1,1), stem(t,x1),    title('x1');

subplot(4,1,2),      stem(tt,x2),   title('x2');

subplot(4,1,3),      stem(x),  title('Convolution (conv):x1*x2');

z = deconv(y,x2);

subplot(4,1,4), stem(t,z), title('deconvolution x2');

Рис.8. Графики сигнала , сигнала , их свёртки, вычисленной с помощью функции conv() и сигнала , восстановленного из свёртки с помощью функции deconv()

Комментарий:          Из полученных графиков видно, что функция deconv() действительно восстанавливает из свертки исходный сигнал . Значения сигнала  полностью восстановлены.