0

FFT 法を使用して一連の入出力データのシステム伝達関数を見つけようとしています。私がフォローしているアルゴリズムは次のとおりです。

  1. 入力データと出力データを matlab に読み込みます。
  2. 入力データと出力データを FFT します。
  3. 出力 FFT を入力 FFT で除算し、振幅を取得します。この例の入力は単位インパルスであるため、入力 FFT は 1.0 です。
  4. 結果をボード線図としてプロットします。
  5. 結果のボード線図を周波数応答として扱い (実際にはそうです)、周波数応答法を使用して伝達関数を計算されたボード線図に当てはめます。

私のコードは次のとおりです。

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 の進め方を教えてください。

4

1 に答える 1

1

行列除算ではなく要素ごとの除算を使用し、関数 plot を使用してプロットします。bode 関数で示されているものと同様のプロットを生成するには、semilogxを使用してプロットできますが、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))

于 2013-10-17T19:37:33.887 に答える