みなさん、お疲れ様でした!
いくつかの既知のインパルス応答で畳み込みを観察することから元の信号を取得するという基本的な問題に取り組んでみました。
しかし、私が得た結果はどういうわけか完全に間違っており、おそらくここではさまざまな間違ったステップが混在しています。私はすでにここやdeveloppezのような他のサイトで同様のトピックを調べましたが、原因を突き止めることができませんでした。助けていただければ幸いです。
私の真の信号f [。]が時間1のインパルスであり、インパルス応答g [。]がガウスであるとしましょう。私はそれらの畳み込みh [。]を、で計算し、基本的に、これがf [。]であることを期待して、conv()
を見つけたいと思います。ifft( fft[h]./fft[g] )
最初の問題は、 n + m-1要素conv()
の配列を作成することです。ここで、 n、mは引数配列の長さです。したがって、実行するには、gの長さでsmthを実行する必要があります。それは私が間違って行動するかもしれない最初の疑わしい場所です(コードを参照してください)。それを行う正しい方法は何ですか?fft[h]./fft[g]
2番目の問題は、最初の真の信号とは非常に異なるものが得られることです。
3つ目の問題は、信号シフトに対処する方法がわからないことです。matlabでは、正の時間信号を操作する必要がありますが、たとえば、ガウスインパルス応答には時間の負の要素と時間の正の要素の両方があるため、ここで操作するには、「前方」にシフトする必要があります(ピークは右に移動します)、結果を「シフト解除」する必要がありますか?
ありがとう!
これが私のがらくたです:)
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!