2015-10-25 53 views
1

我目前正在學習計算機科學,並且我有一個任務可以解決我的實驗項目。我必須將輸入信號&係數'從時域轉移到頻域,並將它們加在一起並轉回到時域。我的結果必須匹配過濾器功能輸出。但是,我似乎無法找到在這裏做錯了什麼。當我通過conj函數添加兩個頻率時,我認爲它錯了。不幸的是,我的老師和我的實驗室主管都沒有興趣實際教授任何東西,所以我必須自己找到答案。希望你們能幫忙。從時域到頻率的輸入和係數,將它們加在一起並回到時域

clc 
clear 
B = [0.2]; 
A = [1,-0.5]; 
xt = ones(1,20); 
xt = padarray(xt,[0,100]) 
A1 = 1; 
A2 = 1; 
f1 = 1; 
f2 = 25; 
fs = 1000; 

xd = fft(xt); 
wd = freqz(B,A,length(xt)); 
y = filter(B,A,xt); 
yd = conj((wd)').*xd; 

yt = real(ifft(yd)); 

subplot(4,2,1); 
plot(xt) 
title('Input signal') 

subplot(4,2,2); 
plot(abs(xd)) 
title('Input in frequency domain') 

subplot(4,2,4); 
plot(abs(wd)) 
title('Coefficients in frequency domain') 

subplot(4,2,7); 
plot(y) 
title('Output using FILTER function') 

subplot(4,2,6); 
plot(yd) 
title('Adding input with coefficients in frequency domain') 

subplot(4,2,8); 
plot(yt) 
title('Back to time domain using IFFT') 
+1

我會改變你的問題,如「過濾在時域與頻域倍增不匹配。 –

+0

@BrianGoodwin這是一個更好的標題。在閱讀代碼之前,我不明白這個問題的目的。 – rayryeng

回答

1

matlab函數freqz()可能有點誤導。係數的「FFT」域需要以不同的方式生成。用下面的代碼替換你的東西,它應該給你想要的東西:

xt = xt.'; 
xd = fft(xt); 
wd = freqz(B,A,length(xt),'whole'); 
y = filter(B,A,xt); 
yd = wd.*xd; 
yt = ifft(yd); 

figure 
plot(abs(xd)) 
hold on 
plot(abs(wd)) 

figure 
plot(y,'.k','markersize',20) 
hold on 
plot(yt,'k') 
hold off 

此外,在'運營商的復矢量的注意:除非您使用.'運營商(例如,x = x.'),它會轉置矢量,同時採取複共軛,即,(1+1i).' = (1+1i)(1+1i)' = (1-1i)

+0

謝謝!沒想到如此快速的回覆!它確實有效:) –

+0

太棒了 - 請將它標記爲答案吧! :) –

+0

哦。對不起,新的:)標記! –

相關問題