Масштабный коэффициент в Matlabs `conv()`

У меня есть следующий код, который используется для деконволюции сигнала. Это работает очень хорошо, в пределах моего предела погрешности... пока я делю свой окончательный результат на очень большой коэффициент (11000).

width = 83.66;
x = linspace(-400,400,1000);

       a2 =  1.205e+004  ;
       al =  1.778e+005  ;
       b1 =       94.88  ;
       c1 =       224.3  ;
       d =       4.077  ;

measured =  al*exp(-((abs((x-b1)./c1).^d)))+a2;

rect = @(x) 0.5*(sign(x+0.5) - sign(x-0.5));
rt = rect(x/83.66);

signal = conv(rt,measured,'same');


check = (1/11000)*conv(signal,rt,'same');

Вот что у меня есть. measured представляет сигнал, который мне дали. Сигнал - это то, что я пытаюсь найти. И проверка заключается в том, чтобы убедиться, что если я сверну свою щель с найденным сигналом, я получу тот же результат. Если вы воспользуетесь тем, что есть у меня, вы увидите, что проверка и измерения отличаются в 11000 раз, что я там и подкинул.

У кого-нибудь есть предложения. Я думаю, что высота щели не совсем равна 1, или что свертка на самом деле не будет эффективно деконволютировать, как я прошу. (Использование deconv дает мне только 1 балл, поэтому вместо этого я использовал convolve).


person yankeefan11    schedule 01.07.2013    source источник
comment
Для меня коэффициент масштабирования ближе к 100.   -  person Schorsch    schedule 01.07.2013
comment
То есть система такая: y(t) = h(t)*u(t) а тебе дано h(t) и y(t)?   -  person macduff    schedule 01.07.2013
comment
Это очень интересная проблема, я предложу эти ссылки, поскольку они могут быть добавлены вместе с советами по щепе, Деконволюция.   -  person macduff    schedule 02.07.2013


Ответы (1)


Я думаю, вы неправильно понимаете, что делает conv (и, вероятно, также, следовательно, deconv).

Дискретная свертка — это просто сумма. Фактически, вы можете разложить его как сумму, используя пару явных циклов, суммы произведений измеренного и rt векторов.

Обратите внимание, что sum(rt) не равно 1. Если бы rt масштабировалось до суммы 1, тогда conv сохранил бы масштабирование вашего исходного вектора. Итак, обратите внимание, как масштабирование проходит здесь.

sum(rt)
ans =
   104

sum(measured)
ans =
   1.0231e+08

signal = conv(rt,measured);
sum(signal)
ans =
   1.0640e+10

sum(signal)/sum(rt)
ans =
   1.0231e+08

Посмотрите, что эта следующая версия сохраняет масштабирование вашего вектора:

signal = conv(rt/sum(rt),measured);
sum(signal)
ans =
   1.0231e+08

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

signal = conv(rt/sum(rt),measured,'same');
sum(signal)
ans =
   1.0187e+08

Идея состоит в том, что conv сохранит масштабирование вашего сигнала до тех пор, пока ядро ​​масштабируется до суммы 1, И нет потерь из-за усечения краев. Конечно, свертка как интеграл также обладает аналогичным свойством.

Кстати, откуда взялся этот коэффициент примерно 11000?

sum(rt)^2
ans =
       10816

Может совпадение. Или нет. Подумай об этом.

person Community    schedule 01.07.2013
comment
ИМХО, такой ответ действительно помогает всем понимать и решать проблемы, спасибо woodchips!!!! - person macduff; 02.07.2013
comment
Это очень хорошее объяснение. Однако мне любопытно, почему я не получаю measured обратно, когда сворачиваю. Это только из-за побочных эффектов использования 'same'? - person yankeefan11; 02.07.2013
comment
@woodchips, обычно предлагается масштабировать с частотой дискретизации, в описанном выше случае это x(2)-x(1) = 0.8008, это также согласуется с продолжающимся определением свертки. Я что-то пропустил? Кстати, я пытаюсь понять масштабирование функции conv в Matlab здесь stackoverflow.com/questions/17503835/ - person zeliboba7; 11.07.2013