Свертка с использованием «действительного» в функции Matlab conv()

Здесь приведен пример свертки:

введите здесь описание изображения

У меня тут два вопроса:

  1. Почему вектор ???? дополнен двумя нулями с каждой стороны? Поскольку длина ядра равна 3. Если ???? дополнить одним 0 с каждой стороны, средний элемент вывода свертки будет в диапазоне длины ????, почему бы не по одному 0 с каждой стороны?

  2. Объясните мне следующий вывод:

     >> x = [1, 2, 1, 3];  
     >> h = [2, 0, 1];  
     >> y = conv(x, h, 'valid')      
      y =    
          3     8  
     >>   
    

    Что valid делает здесь, в контекст ранее показанной математики на векторах ???? и ?


person user366312    schedule 27.10.2018    source источник


Ответы (1)


  1. Я не могу говорить о том, какое правильное заполнение нулями... При этом любое заполнение нулями составляет данные, которых нет. Это не обязательно неправильно, но вы должны знать, что значения, вычисляющие эту информацию, могут быть необъективными. Иногда тебя это волнует, иногда нет. Введение 1 нуля (в данном случае) оставит среднее значение ядра всегда в данных, но почему это должно быть критерием остановки? Важно отметить, что добавление двух нулей по-прежнему оставляет одно умножение значений, которые фактически присутствуют в данных и ядре (x[0]*h[0] и x[3]*h[2] — с использованием индексации на основе 0). Добавление третьего нуля (или более) просто даст нули на выходе, поскольку 3 - это длина ядра. Другими словами, заполнение нулями всегда будет давать вывод, частично основанный на фактических данных (но не полностью) для любого заполнения нулями от n=1 до n=length(h)-1 (в данном случае либо 1, либо 2).

  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   
person Jimbo    schedule 27.10.2018