Масштабный коэффициент в 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).

1 ответ

Решение

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

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

Обратите внимание, что сумма (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

Может быть совпадение. Или нет. Думаю об этом.

Другие вопросы по тегам