はじめに
伝達関数(周波数応答関数:Frequency Response Function(FRF))には、H1推定、H2推定、H3推定、Hv推定というようにいくつか種類があります。
前回はH1推定を紹介しました。本記事ではH2推定について説明します。

次回はH3推定とHv推定、その次にコヒーレンス関数について順次説明していこうと思います。
H2推定について
前記事で述べましたが、H1推定は伝達関数を推定する方法で最も一般的な手法です。
では、H2推定は?と聞かれると
正直、現在は使うことがないと思われます……
(じゃあ紹介すんなよ!ってツッコまれそうですね)
まず、理想的なFRFを考えてみましょう。理想的なFRF G(ω)は下記のようになります。
ただ、現実問題として、このような理想通りの測定はできません。それはノイズの影響があるからです。H1推定の場合は下図のように応答にノイズが入る場合を考えました。
H2推定の場合は下図のように入力にノイズが入る場合を考えます。
上図のような入力信号にノイズ成分が含まれる状況で、FRF=(応答V)/(入力F)を推定する方法がH2推定です。
ここでみなさん下記のような疑問を持ちますよね。

そもそも、入力にノイズが入って、応答にノイズが入らないパターンなんてあるの?
私の答えは「なくはない」です。
下図のように(シグナルジェネレーター)→(アンプ)→(加振機)というようなフローで振動を発生させて入力を与えていた場合、入力Fはどこからでも測定できます。
具体的には下記の3通りが考えられます。
①シグナルジェネレーターとアンプをつなぐ電線を分岐させて、入力Fを測定する
②アンプと加振機をつなぐ電線を分岐させて、入力Fを測定する
③加振機上に加速度センサーを置く or 加振機にロードセルを仕込む or 加振機自体にレファレンス信号用の端子がある などで入力Fを測定する
この場合①だと信号が小さく、測定するために分岐させていることにより、ノイズの影響を受ける可能性があります。なので、「なくはない」です。
昔はICPなどの電源供給型のセンサーなどはなかったので、入力Fをアンプに通す前のセンサー信号としていた場合などはH2推定を使っていたのですかね?(かなり推測が入ってます。)
スポンサーリンク
H2推定の理論
教科書に書いてあるH2推定の式自体はめちゃめちゃシンプルです。理論式は下記を参考にしています。
H2(ω)= \frac{W_{xx}(ω)}{W_{xf}(ω)}
ここでWxfはXとFのクロススペクトル密度関数(Cross Spectral Density Function)、WxxはXのパワースペクトル密度関数(Power Spectral Density Function)もしくはオートスペクトル密度関数(Auto Spectral Density Function)である。
ただ、教科書に書いてあるHz推定の式は少し間違っています。実際には下記になります。Nは平均化の回数です。
H2(ω)= \frac{\sum_{n=1}^{N} W_{xx}(ω)}{\sum_{n=1}^{N} W_{xf}(ω)}
もしくは(下記で言いたいのは、クロススペクトル密度関数の平均とパワースペクトル密度関数の平均から求められるよってことです)
H2(ω)= \frac{\sum_{n=1}^{N} W_{xx}(ω)/N}{\sum_{n=1}^{N} W_{xf}(ω)/N}
では、なぜ上式で応答に混入するノイズが低減できるのかを説明します。
なお、*は共役を指します。(*は×という意味ではないので注意)
H2(ω)= \frac{\sum_{n=1}^{N} V(ω)^*V(ω)}{\sum_{n=1}^{N} V(ω)^*(F(ω)+N(ω))}
H2(ω)= \frac{\sum_{n=1}^{N} V(ω)^*V(ω)}{\sum_{n=1}^{N} V(ω)^*F(ω)+V(ω)^*N(ω)}
ノイズ成分Nは無相関なノイズであることを前提としているため、平均化処理をすると0に近づきます。
イメージをつかみたい方は下記記事を参照ください。

従って、Nを増加させて平均化すると、無相関ノイズNは0に収束するので下式になります。
H2(ω)= \frac{\sum_{n=1}^{N} V(ω)^*V(ω)}{\sum_{n=1}^{N} V(ω)^*F(ω)}
上記により、ノイズが低減できます
スポンサーリンク
MATLABでの検証
解析結果
まずは解析結果を先に示します。(100回平均)
ノイズの成分のない理想的なFRFを黒線、
ノイズ成分を含み平均化処理をしていないFRFを青線、
(平均化処理をした)H2推定結果を赤点線で表しています。
図からわかるように、平均化処理をしていないFRFと比較して、理想的なFRFとH2推定結果の誤差が小さくなっています。
ちなみに、Fを基準としての±85%でノイズ成分を与えています。
次の次に説明する予定ですが、H1推定とH2推定がプログラミングできるようになるとコヒーレンス関数γ^2が簡単に求められます。
γ^2_{fx}(ω)= \frac{H1}{H2}
本検討でのコヒーレンス関数は下図のようになりました。
コード
実行ファイル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | clear all close all % % % % 初期設定 freq=0.5:0.1:20; m_vec=[1 1 1 1]; [M]=eval_Mmatrix(m_vec); k_vec=[1 1 1 1]*10^3; [K]=eval_Kmatrix(k_vec); C=zeros(length(k_vec)); F=zeros(length(m_vec),length(freq)); F(1,:)=ones(1,length(freq)); % % % % 変位X(ノイズなし) X=eval_direct_x_2ndedition(M,K,C,F,freq); % % % % 理想的なFRF FRF_ideal_x3_f1=X(3,:)./F(1,:); N=100; %平均化回数 100回 res=zeros(N,length(freq)); ref=zeros(N,length(freq)); for ii1=1:N res(ii1,:)=X(3,:); ref(ii1,:)=F(1,:)+( rand(1,length(freq)) - 0.5 )*2*0.85; % Fを基準として±85%のノイズを加える end [h1] = H1(ref,res,freq); [h2] = H2(ref,res,freq); figure(1) loglog(freq,abs(FRF_ideal_x3_f1), 'k' , 'linewidth' ,7) hold on loglog(freq,abs(res(1,:)./ref(1,:)), 'b' , 'linewidth' ,3) loglog(freq,abs(h1), 'g--' , 'linewidth' ,3) loglog(freq,abs(h2), 'r--' , 'linewidth' ,3) hold off grid on legend( '理想的なFRF' , '平均化処理をしないFRF' , 'H1推定' , 'H2推定' ) xlim([freq(1) freq( end )]) xlabel( '周波数 Hz' );ylabel( 'FRF m/N' ); figure semilogx(freq,h1./h2, 'k' , 'linewidth' ,3) xlabel( '周波数 Hz' );ylabel( 'Coherence' ); grid on ylim([0 1]) xlim([freq(1) freq( end )]) |
スポンサーリンク
functionファイル
1 2 3 4 5 6 7 8 9 10 | function [K]=eval_Kmatrix(k_vec) K=zeros(length(k_vec)); for ii1=1:length(k_vec) if ii1==1 K(ii1,ii1)=k_vec(ii1); else K(ii1-1:ii1,ii1-1:ii1)=K(ii1-1:ii1,ii1-1:ii1)+[1 -1;-1 1]*k_vec(ii1); end end end |
1 2 3 | function [M]=eval_Mmatrix(m_vec) M=diag(m_vec); end |
1 2 3 4 5 6 7 8 9 10 | function x=eval_direct_x_2ndedition(M,K,C,F,freq) % % 2021.05.28 Fを修正 x=zeros(size(F,1),length(freq)); j=sqrt(-1); for ii1=1:1:length(freq) w=2*pi*freq(ii1); x(:,ii1)=inv(K+j*w*C-w^2*M)*F(:,ii1); end end |
1 2 3 4 5 6 7 8 9 10 | function [Wff]=PowerSpectralDensity(F,freq) if size(F,1)==length(freq) F=F.'; end Wff=conj(F).*F; end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function [Wfx]=CrossSpectralDensity(F,X,freq) if size(F,1)==length(freq) F=F.'; end if size(X,1)==length(freq) X=X.'; end Wfx=conj(F).*X; end |
1 2 3 4 5 6 7 8 9 10 | function [h1] = H1(ref,res,freq) % h1=zeros(1,freq); [Wfx]=CrossSpectralDensity(ref,res,freq); [Wff]=PowerSpectralDensity(ref,freq); h1=mean(Wfx,1)./mean(Wff,1); end |
1 2 3 4 5 6 7 8 9 10 | function [h2] = H2(ref,res,freq) % h1=zeros(1,freq); [Wxf]=CrossSpectralDensity(res,ref,freq); [Wxx]=PowerSpectralDensity(res,freq); h2=mean(Wxx,1)./mean(Wxf,1); end |
コメント