2017-01-15 12 views
0

мне нужно вычислить свертку функций:
Р (х) = 1 при -1 < < х 2, 0 в противном случае
г (х) = SGN (х) * (дираковской абс (х) -1)Calcuating свертки двух функций в MATLAB

у меня этот код:

Fs=1; 
t=-10:1/Fs:10; 
d=dirac(abs(t)-1); 
s=sign(t); 
x=d.*s; 
x2=1*(t>-1 & t<2); 
spl=conv(x,x2,'same'); 
disp(spl); 

Но что я получаю много значений NaN.
Где моя ошибка? Что я должен изменить?

+1

Вопрос, кажется, спрашивали о дираковской дельта, в непрерывном времени - бесконечно высокая и бесконечно тонкая функция - это аналитическая концепция, которая не переводится хорошо участвовали в дискретном времени для решения с помощью Matlab. Если это специально не проблема с дискретным временем, я предлагаю решить это аналитически или символически с помощью системы компьютерной алгебры? –

+0

Я уже решил эту проблему аналитически. Теперь мне нужно решить это с помощью Matlab. – annamataris

+0

Кажется, вы пытаетесь выполнить свертку, используя символическую библиотеку. Однако в символической библиотеке нет функции 'conv',' conv' для дискретной числовой свертки. Если вы хотите проверить свою интеграцию, перепишите свертку как интеграл и используйте функцию 'int' для символической интеграции. – Florian

ответ

1

Ниже приводится способ оценки решения в области дискретного времени. Это требует некоторых изменений в код:

  1. увеличить частоту дискретизации Fs, чтобы сохранить большую пропускную способность. Я использовал 100x ниже.

  2. Замените дельта-функцию Дирака на дельту Кронекера, чтобы включить моделирование дискретного времени.

Измененный код и результаты заключаются в следующем:

Fs=100; % use higher sampling rate 
t=-10:1/Fs:10; 
d=(abs(t)-1)==0; % use kronecker delta function for discrete-time simulation 
s=sign(t); 
x=d.*s; 
x2=1*(t>-1 & t<2); 
spl=conv(x,x2,'same'); 

% plots to visualize the results 
figure; 
subplot(3,1,1); 
plot(t, x2); 
ylabel('f(x)'); 
subplot(3,1,2); 
plot(t, x); 
ylabel('g(x)'); 
subplot(3,1,3); 
plot(t, spl); 
xlabel('Time'); 
ylabel('convolution'); 

results

1

Попробуйте этот код:

Fs=1; 
t=-10:1/Fs:10; 
g=t; 
g(g~=1)=0; %g function 
s=sign(t); 
x=g.*s; 
f=t; 
f(f>-1 & f<2)=1; 
f(f~=1)=0; %f function 
x2=f; 
spl=conv(x,x2,'same'); 
disp(spl)