2013-07-01 3 views
0

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

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 вместо этого).

+0

Для меня коэффициент масштабирования ближе к '100'. – Schorsch

+0

Итак, система подобна: 'y (t) = h (t) * u (t)' и вам заданы 'h (t)' и 'y (t)'? – macduff

+0

Мне дано y и u – yankeefan11

ответ

3

Я думаю, вы неправильно понимаете, что такое 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 

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

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

sum(rt)^2 
ans = 
     10816 

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

+1

+1 для подробного подробного объяснения! – Schorsch

+0

ИМХО, это тот ответ, который действительно помогает каждому * понять * и решить проблемы, спасибо древесным щекам !!!! – macduff

+0

Это очень хорошее объяснение. Тем не менее, мне любопытно, почему я не «отмеряю» назад, когда я снова собираюсь. Это просто из-за краевых эффектов использования «того же самого»? – yankeefan11

Смежные вопросы