Я хочу вычислить свертку следующего уравнения. $$ x [n] = \sin {\frac {n * \pi} {6}}(u [n] - u [n-12])$$ Я получил следующую строку кода:

>> stem(5, y);
>> plot(n, y);
>> syms n
>> u = int(exp(-x)*heaviside(x), x, -Inf, Inf);
>> a = sin((n*pi)/6);
>> x = a*(u -u[n-12]);

Тем не менее, последняя строка дает мне ошибку. Более того, у меня возникли проблемы с выяснением того, как я использовал бы это уравнение, чтобы вычислить свертки для построения графика $ y [n] $ в MATLAB. Я знаю, как использовать команду conv но не могу понять, как это сделать. Я определяю \$ h [n] = \delta [n-3] \$ и использую \$ y [n] = x [n] * h [n] \$ в качестве моего уравнения.

1 ответ1

1

Предположим, у нас есть векторы:

u = [1 2 1];
v = [1 1 0 0 0  2 ];

так для \$ x [n] = u [n] \ast v [n] \$, если векторные операции разбиты

х [0] = 1 * 1
х [1] = 1 * 2 + 1 * 1
х [2] = 1 * 1 + 1 * 2 + 0 * 1
х [3] = 1 * 1 + 0 * 2 + 0 * 1
х [4] = 0 * 1 + 0 * 2 + 0 * 1
х [5] = 0 * 1 + 0 * 2 + 2 * 1
х [6] = 0 * 1 + 2 * 2
х [7] = 2 * 1

или с нулевым заполнением:
x [0] = 0 * 1 + 0 * 2 + 1 * 1
x [1] = 0 * 1 + 1 * 2 + 1 * 1
х [2] = 1 * 1 + 1 * 2 + 0 * 1
х [3] = 1 * 1 + 0 * 2 + 0 * 1
х [4] = 0 * 1 + 0 * 2 + 0 * 1
х [5] = 0 * 1 + 0 * 2 + 2 * 1
х [6] = 0 * 1 + 2 * 2 + 0 * 1
х [7] = 2 * 1 + 0 * 2 + 0 * 1

Обратите внимание, что 1) Вектор x больше, чем u и v, и для начальных операций 2) В начальном и конечном случаях вам нужно дополнить нулями
если

u = [1 2 1];
v = [0 0 1 1 0 0 0 2 0 0 ]; 
x = conv(u,v)
x = [0 0 1 3 3 1 0 2 4 2 0 0]; % result for x

или же

v =[0 0 0 1 1 0 0 0 2 0 0 0];
x = conv(u,v) 
x = [0 0 0 1 3 3 1 0 2 4 2 0 0 0]; % result for x

это имеет значение для размера вектора, если есть нули, но не значения, которые свернуты. Это называется заполнением нулями, при свертке нужно обрабатывать крайние случаи.

(Также помните, что нулевой элемент Matlab начинается с единицы, я использовал математическую запись с первым элементом векторов, начинающимся с нуля)

Так почему я тебе это говорю?

потому что, когда вы делаете свертку на компьютере, крайние случаи могут сбивать с толку. когда вы делаете эту операцию x = a *(u -u [n-12]); и вы запрашиваете u [n-12], который для matlab равен u [-11] для первого значения массива, и в памяти, которая не существует для этого массива. Таким образом, вам нужно обнулить и \ или усечь и понять, что граничные случаи различны для свертки.

Я приведу пример для x [n] = u [n] + u [n-3]:

 u = [ 1 2 3 4 5 6 ];
 x = u + [u(3:6) 0 0 ];

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .