2016-04-25 12 views
0

私は時変信号(時間、振幅)と測定周波数感度(周波数、振幅変換係数(Mf))を持っています。Matlabのfft/ifftデコンボリューション

信号の中心周波数を使用して信号の振幅変換係数(たとえば0.0312)を選択すると、最大値を得ることができます。変換された振幅値は1.4383である。

私は、時変信号と既知の感度(すなわち、すべての周波数)をデコンボリューションするコードを書いています。 fft(a)は時間変化信号(a)のfftである。ここで、Ptは出力/変換振幅であり、Mfは振幅変換係数データであり、fft(a)は時間変化信号(a)のfftである。 Fsはサンプリング周波数であり、Lは、信号の長さである

xdft = fft(a); 
xdft = xdft(1:length(x)/2+1); % only retaining the positive frequencies 
freq = Fs*(0:(L/2))/L; 

Iは、(a)は、FFTの実部をとります。

convS = real(xdft).*Mf; 

Mfは大きさ=実数(位相情報はありません)と仮定します。私はまた、周波数と同じ質問ポイントで

Mf=interp1(freq_Mf,Mf_in,freq,'cubic'); 

を補間します。

Iは、次に使用して、時間領域の信号を再構築:私は、FFTの虚部を使用

fftRespI=complex(real(convS),imag(xdft)); 

pt = ifft(fftRespI,L,'symmetric') 

(A)。

再構成された信号の形状は正しいように見えますが、信号の振幅は正しくありません。

f = 0..MHzの場合、Mf = 0.0312のすべての値を設定すると、変換された振幅値は〜1.4383(中心周波数を使用する場合と同様)ですが、13.0560になります。

どのように振幅軸を較正しますか?つまり、fft(a)をMfで正しく掛けるにはどうすればよいですか?

のy ABS(大きさ)の軸と実際のFFTのいくつかの理解向上は、私が思う私を助けるだろう...

おかげ

+0

fft信号の実数部に大きさを掛けても、振幅と位相情報が混在しているため意味がありません。 'xdft'の係数にあなたの重み' Mf'を直接乗算しようとしましたか?これは、fft信号に周波数可変フィルタを適用することと同じプロセスであるため、より意味をなさないでしょう。 – BillBokeey

+0

ありがとう私はあなたのポイントを理解していますが、 '係数'の意味をよく分かりませんか? – 2one

答えて

1

あなたの重みの再手配順Mfにする必要が周波数に対するMATLABの順序と一致します。あなたの重みが

Mf = randn(1,N) 

がこの順に定義されている場合、あなたは信号

N=10; 
x=randn(1,N); 
y=fft(x); 

出力の周波数の順序を持​​っているとしましょうy

[0:1:floor(N/2)-1,floor(-N/2):1:-1] = [0 1 2 3 4 -5 -4 -3 -2 -1] 

そうです:Mf == [0 1 2 3 4 5 6 7 8 9]、あなたは再調整する必要があります

Mfshift = [Mf(1:N/2), fliplr(Mf(2:(N/2+1)))]; 

、その後、あなたが本当の出てくる必要がありますあなたのフィルタリングされた出力

z = ifft(fft(x).*Mshift); 

を得ることができます。

+0

投稿が更新されました。私はすでに持っていた:xdft = fft(a); xdft = xdft(1:長さ(a)/ 2 + 1)。 freq = Fs *(0:(L/2))/ L; ここで、Fsはサンプリング周波数であり、Lは信号の長さである。私も補間します。 Mf = interp1(freq_Mf、Mf_in、freq、 'cubic'); – 2one