MATLAB で学ぶ信号処理 FFTの平均化手法の種類について

はじめに

前回の記事で、夏休みは毎日更新することが目標というようなことを書いてしまいましたが、なかなか思うようにいかないですね…..

今日はFFTの平均化手法について説明します。

おそらく、MATLABでのみデータ処理している方は「リニア平均」しか知らないと思います。

FFTアナライザなどの測定器でデータ分析をしている方は、「リニア平均」と「エクスポネンシャル平均」の2種類から選択していると思いますので、平均化手法が2種類あることを知っていると思います。

少し脱線しますが、NVH(Noise Vibration and Harshness)では、2社の測定器メーカーが主流です。1社目はSiemens Digital Industries Softwareで、2社目はBrüel & Kjærです。

1社目のSiemens Digital Industries Softwareはもともとは測定器は製造していませんでしたが、もともと有名だったLMSという測定機メーカーを買収した経緯があります。
ちなみに、LMSはLeuven Measurement Systemの略で、ベルギーのルーベン大学発のスタートアップ企業でしたが、一流の測定器メーカーとして大きくなりました。ルーベン大学はISMAという振動関連の国際学会を主催している大学で、NVHで最も権威のある大学の一つです。

Siemens Digital Industries Softwareの測定器であるScadasではデフォルトのFFT平均化手法が「リニア平均」になっていて、Brüel & Kjærの測定器であるPulseではデフォルトのFFT平均化手法が「エクスポネンシャル平均」になっています。(記憶が正しければ)
もし、何も意識せずにデフォルトのまま使用している場合は、一度どのような設定になっているか確認してみてください。

リニア平均

ここからは平均化手法の計算方法について説明します。リニア平均の場合、以下のように計算を行います。

Yn=( X1 + X2 + X3 + …… Xn)/N

ここで、
N : 平均回数
Yn : N回の平均結果
Xn : 毎回の解析結果

例えば、データが下記のような場合

X=[1 2 3 4 5 6 7 8 9];
Yn=sum(X)/length(X) % Yn=mean(X);と同じ

Ynは5となります。

一般的に「平均化」と言えば「リニア平均」を指すので、みなさんご存知かと思います。

エクスポネンシャル平均

エクスポネンシャル平均の計算は少し複雑です。

下記のリニア平均式は
Yn=( X1 + X2 + X3 + …… Xn)/N

このように変形できます。
Yn_1=(X1 + X2 + X3 + …… Xn_1)/(N-1)
Yn =Xn/N + Yn_1 × (N-1)/N

X=[1 2 3 4 5 6 7 8 9];
Yn=0;
for ii1=1:length(X)
    if ii1<=2
       Yn=Yn + X(ii1);
    else
       Yn= X(ii1)/ii1 + Yn*(ii1-1)/ii1
    end
end

Ynは5.3333となります。

エクスポネンシャル平均では、1回目のデータの重みづけが低く、最後の方のデータになるにつれて重みづけが高くなります。

パイセンの意見と考察

通常は「リニア平均」を用いて、下記のような特殊な場合は「エクスポネンシャル平均」を用いるのが良いと考えられます。

○エクスポネンシャル平均が良い場合
①測定前に、測定回数(FFT回数)を決定できない
⑵使用メモリを圧縮する必要がある

もう少し具体的に述べたいと思います。

【①に関して】
現場測定で、機械の動作音が何秒間なのか不明で、何回も測定をやり直せない場合は、測定前にFFT回数が決定できません。

「時刻歴データを測定すれば良いじゃん」と感じますが、現場作業ではそんなことしている時間はないです。私の経験上、その場で結果見て、騒音源特定して、騒音対策考えて、対策効果検証してって感じで、MATLABで時刻歴データを編集して、FFTするような時間はないです。そもそもMATLABで読み込むために測定器用ソフトからデータをエクスポートしている時間・労力を割けないというのが実体かと思います。

【②に関して】
Raspberry PiやArduinoでマイクや加速度センサーを繋いでFFTをモニタリングするようなシステムを構築する場合、可能な限り実装コードのメモリ使用量を低減する必要があります。最新のFFTデータと、その前までに算出したFFTの平均結果さえ保有していれば、FFTの平均結果を更新することができるので、使用メモリを圧縮できます。

 

ちなみに、最近のMATLABではRaspberry PiやArduinoと連携することができます。MATLABをインストールしたPCとRaspberry PiやArduinoとLANやwifi接続することで、Raspberry PiやArduinoに繋いであるセンサー信号をMATLAB上に取り込むことができます。

ちょっと前までは、「これから勉強するならMATLABよりもPythonの方が良い」と思っていましたが、今はMATLABで良いんじゃないかなって感じています。フリーランスとして仕事するなら、無料なのでPythonの方が良いですが、企業で働くならMATLABで良いような気がしてます。

(Pythonを1から覚えさせる代わりに、その学習時間を勤務時間内で確保してくれるなら別ですけど、)「PythonではなくMATLABを使いたい」と主張している従業員に対して、MATLABの費用を工面できないような企業に勤めるのなら、転職活動した方が……なんて考えちゃったり…..

コメント