2013-10-17 60 views
0

我試圖找到使用FFT方法的一組輸入輸出數據的系統傳遞函數。我遵循的算法如下:如何在matlab中找到矩陣的波特圖?

  1. 將輸入數據和輸出數據加載到MATLAB中。
  2. FFT輸入數據和輸出數據。
  3. 將輸出FFT除以輸入FFT並取大小。由於我們例子的輸入是單位脈衝,輸入FFT是1.0。
  4. 繪製結果作爲博德的情節。
  5. 將產生的Bode'圖作爲頻率響應 - 它的確是 - 並使用頻率響應方法將傳遞函數擬合到計算的Bode'圖上。

我的代碼是:

load testdata.mat; // testdata is a 2 column matrix (1001x2 matrix) 

input = fft(signal(:,1)); // FFT of input data (1001x1 complex matrix) 

output = fft(signal(:,2)); // FFT of output data (1001x1 complex matrix) 

fft_ratio = output/input; // (1001x1001 complex matrix) 

fft_ratio_mag = abs(fft_ratio); // (1001x1001 matrix) except column 1, all other columns have '0' data 

bode(fft_ratio_mag(:,1)) 

我得到以下錯誤:

Error using bode (line 84) 
Not enough input arguments. 

請指導我如何去在上面的算法步驟4和5。

+0

fft_ratio作爲1001x1001矩陣;這聽起來正確嗎? –

+1

如果這是mathworks bode函數,則它適用於系統對象,而不適用於矩陣。 http://www.mathworks.com/help/ident/ref/bode.html – engineerC

+0

除第一列外,其他所有列都是0 + 0i。所以我猜想這並不重要。我已經看到了這個頁面http://www.mathworks.in/help/ident/ref/bode.html。但是,我無法生成sys。 –

回答

1

使用element-wise divide,而不是矩陣分割,並使用繪圖函數進行繪圖。爲了產生類似於在bode function所示的曲線圖,你可以繪製使用semilogx但做分貝 和學位轉換自己:

fft_ratio = output ./ input % note the dot 
subplot(2,1,1) 
semilogx(20*log10(abs(fft_ratio))) 
subplot(2,1,2) 
semilogx(plot((180/pi)*angle(fft_ratio)) 

生成使用,只要你喜歡,我通常使用從歸一化角頻率x軸0到1,這只是linspace(0,1,length(fft_ratio))

+0

好的,但是我如何從中找到傳遞函數呢? –

+0

我不確定什麼是「頻率響應方法」,但曲線擬合是曲線擬合,無論曲線的性質如何,並且有很多方法可以做到這一點。 – engineerC