Добрый день всем!
Я попытался решить основную проблему получения исходного сигнала путем наблюдения его свертки с некоторой известной импульсной характеристикой.
Но результаты, которые я получаю, как-то совершенно неверны, и, вероятно, здесь я сочетаю разные неправильные шаги. Я уже просматривал подобные темы здесь и на других сайтах, таких как developmentpez, но не смог понять причину. Буду признателен за любую помощь.
Допустим, мой истинный сигнал f[.] — это просто импульс в момент времени 1, а импульсная характеристика g[.] является гауссовой. Я вычисляю их свертку h[.] по conv()
, а затем, по сути, хочу найти ifft( fft[h]./fft[g] )
, ожидая, что это будет f[.].
Первая проблема заключается в том, что conv()
создает массив из элементов n+m-1, где n,m — длины массивов аргументов. Итак, чтобы выполнить fft[h]./fft[g]
, мне нужно сделать что-то с длиной g. Это первое подозрительное место, где я могу действовать неправильно (см. код). Как правильно это сделать?
Вторая проблема заключается в том, что я получаю что-то сильно отличающееся от исходного истинного сигнала.
Третья проблема заключается в том, что я не могу понять, как принимать сдвиги сигнала. В матлабе мне приходится оперировать с положительными по времени сигналами, но, например, гауссовская импульсная характеристика имеет как отрицательные по времени, так и положительные по времени элементы, поэтому, чтобы работать с ней здесь, мне нужно сдвинуть ее «вперед» ( взгляд будет двигаться вправо), и чем мне нужно «сдвинуть» результат?
Спасибо!
Вот моя хрень по этому поводу :)
close all;
TrueSignal = zeros( 101, 1 ); % impulse in t = 1.
TrueSignal( 1 ) = 1;
ImpulseResp = normpdf(-1:0.02:1)/normpdf( 0 ); % 101 elements array
figure;
subplot( 2,2,1 );
title('True signal')
plot( TrueSignal );
subplot( 2,2,2 );
title('Impulse response')
plot( ImpulseResp );
Conv = conv( TrueSignal, ImpulseResp ); % produces 201 elements array.
subplot( 2,2,3 );
title('Convolution')
plot( Conv );
% Wrong? I need a 201 elements array to represent the impulse response.
ImpulseResp_sparse = normpdf( -1:0.01:1 )/normpdf( 0 );
FIR = fft( ImpulseResp_sparse )/201;
Inverse = ifft( fft( Conv )./FIR ); % UPD Added fft() according to one of comments, bad mistake, but still not preventing.
subplot( 2,2,4 );
title('What is that???')
plot( abs( Inverse ) ); % It's weird! With no abs(), result is even more weird!