Здесь - это пример приведенной свертки:
У меня есть два вопроса:
Почему вектор ? дополнен двумя нулями с каждой стороны? As, длина ядра ℎ равна 3. Если ? дополняется одним 0 с каждой стороны, средний элемент вывода свертки будет в пределах диапазона длины ?, почему бы не по одному 0 с каждой стороны?
Объясните мне следующий вывод:
>> x = [1, 2, 1, 3];
>> h = [2, 0, 1];
>> y = conv(x, h, 'valid')
y =
3 8
>>
Что здесь делает valid
в контексте ранее показанной математики для векторов ? и ℎ?
Я не могу сказать, какое количество нулевых отступов является правильным ... При этом любое нулевое заполнение составляет данные, которых нет. Это не обязательно неправильно, но вы должны знать, что значения, вычисляющие эту информацию, могут быть предвзятыми. Иногда это вас волнует, иногда нет. Введение 1 нуля (в данном случае) оставило бы среднее значение ядра всегда в данных, но почему это должно быть критерием остановки? Важно отметить, что добавление двух нулей по-прежнему оставляет одно умножение значений, которые фактически присутствуют в данных и ядре (x [0] * h [0] и x [3] * h [2] - с использованием индексации на основе 0). Добавление третьего нуля (или более) просто даст нули на выходе, поскольку 3 - это длина ядра. Другими словами, заполнение нулями всегда будет давать результат, который частично основан на фактических данных (но не полностью) для любого заполнения нулями от n = 1 до n = length (h) -1 (в данном случае либо 1, либо 2).
Несмотря на то, что нулевое заполнение длиной 2 или 1 все еще имеет умножение на основе реальных данных, некоторые значения суммируются с «фальшивыми» данными (те, которые умножаются на заполненный ноль). В этом случае Matlab предоставляет вам 3 варианта возврата данных. Во-первых, вы можете получить свертку full
, которая включает значения, которые смещены, потому что они включают добавление 0 значений, которых на самом деле нет в данных. В качестве альтернативы вы можете получить same
, что означает, что длина вывода равна длине данных y = [4 3 8 1]
. Это соответствует 1 нулю, но обратите внимание, что для более длинных ядер вы можете технически получить другую длину между full
и same
, Matlab просто не возвращает их для вас.
Наконец, что, вероятно, наиболее важно понять из всего этого, у вас есть опция valid
. В вашем примере только 2 выборки выходных данных вычисляются из суммирования, которое происходит только из умножения над реальными данными (то есть из умножения выборок ядра на выборки из x
, а не из нулей). Более конкретно:
y[2] = h[2]*x[0] + h[1]*x[1] + h[2]*x[2] = 3 //0 based indexing like example
y[3] = h[2]*x[1] + h[1]*x[2] + h[2]*x[3] = 8
Обратите внимание, что ни одно из других значений y
не вычисляется только с h
и x
, все они включают дополненный ноль, который не обязательно указывает на реальные данные. Например:
y[4] = h[2]*x[2] + h[1]*x[3] + h[2]*0 <= padded zero