2013-10-17 4 views
0

FFT 방법을 사용하여 일련의 입출력 데이터의 시스템 전달 함수를 찾으려고합니다. 내가 따르는 알고리즘은 다음과 같습니다 :matlab에서 매트릭스의 보드 선도를 찾는 방법은 무엇입니까?

  1. 입력 데이터 및 출력 데이터를 matlab에로드하십시오.
  2. 입력 데이터와 출력 데이터를 FFT합니다.
  3. 출력 FFT를 입력 FFT로 나누고 크기를 취합니다. 예제의 입력은 단위 임펄스이므로 입력 FFT는 1.0입니다.
  4. 결과를 보드 '플롯으로 플롯합니다.
  5. 결과 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을 사용하고 플롯 기능을 사용하여 플로트하십시오. 당신이 semilogx를 사용하여 그릴 수있는 bode function에 표시된 것과 유사한 플롯을 생산하지만, 할 수있는 dB 과도 변환 ​​자신 :

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

관련 문제