[英]fft / ifft deconvolution in Matlab
我有一個隨時間變化的信號(時間,幅度)和一個測得的頻率靈敏度(頻率,幅度轉換因子(Mf))。
我知道,如果我使用時間信號的中心頻率為信號選擇幅度轉換因子(例如0.0312),則會得到最大值。 轉換后的幅度值為1.4383。
我編寫了一些代碼來對時變信號和已知的靈敏度(即對於所有頻率)進行反卷積。
其中Pt是輸出/轉換后的振幅,Mf是振幅轉換因子數據,而fft(a)是時變信號(a)的fft。
我是fft(a)的真正組成部分:
xdft = fft(a);
xdft = xdft(1:length(x)/2+1); % only retaining the positive frequencies
freq = Fs*(0:(L/2))/L;
其中Fs是采樣頻率,L是信號長度。
convS = real(xdft).*Mf;
假設Mf為幅度=實數(我沒有相位信息)。 我也插值
Mf=interp1(freq_Mf,Mf_in,freq,'cubic');
因此在與頻率相同的詢問點上
然后,我使用以下方法在時域中重構信號:
fftRespI=complex(real(convS),imag(xdft));
pt = ifft(fftRespI,L,'symmetric')
在這里我使用fft(a)的虛部。
重建的信號形狀看起來正確,但信號幅度卻不正確。
如果我為f = 0..N MHz設置所有Mf = 0.0312的值,則我期望最大 轉換后的振幅值為〜1.4383(類似於我使用中心頻率的情況),但得到13.0560。
如何校准振幅軸? 即我如何正確地將fft(a)乘以Mf?
我認為對abs(幅度)的y軸和真實FFT的一些更好的了解將對我有所幫助...
謝謝
您需要重新排列權重Mf
的順序,以匹配MATLAB的頻率順序。 假設您有一個信號
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 = randn(1,N)
按以下順序定義: 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);
應該是真實的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.