ni.com is currently undergoing scheduled maintenance.
Some services may be unavailable at this time. Please contact us for help or try again later.
08-24-2010 08:32 AM
xyzz様
いつも参考にさせていただいております。
周波数測定(周期の抽出)は、その道の専門家なら、いろいろなウマいやり口を知っているのかな~と思いつつ、
「自己相関」については聞きかじりですが、以前にそういう方法について聞いたことがあって、今回も少し
検索してから見よう見まねでやってみた部分があります。 「自己相関 周期 抽出(または検出)」で検索してみると、
わりとこの手法についてはさまざまな説明がヒットしてくるようでして。
私の文章も茫漠としてつかみにくいかも知れませんが、理想的に周期Tを持つならば f(t)=f(t-T) が成立し、
時間遅れτの自己相関 Σf(t)・f(t-τ) は、τ=T のとき、Σf(t)・f(t-τ)=Σf(t)・f(t-T)=Σf(t)・f(t) となって、
自分自身との相関と等しくなる、というところがポイントのようで、τ=nT (n∈Z) で同じことが起こります。
(自分自身との相関は必ず正。周期Tと無関係なτでは、掛け算が正負混在し、合計は0近傍に収れん)
現実のデータは、長さが有限だったり(τ を大きくすると、重なりが得られるデータ長がどんどん短くなる)、
誤差やノイズがあったり、完全な反復ではなかったり、という面があるので、理想ほどうまくはいかないのですが・・・
それでも、「ノイズに埋没した周期信号」でさえ、自己相関を取ると、痕跡から「ここが周期か?」と推定できることも
あるらしいです(ノイズ成分は、τ=0 以外は無相関なので)。使い物になるかどうかは、推定した「周波数」の
精度・誤差をどこまで許容するかにもよりますが。
私もまだこれを理解しきっているわけではないと思いますが・・・・
08-26-2010 09:47 PM
M.Shiraishi様 xyzz様
返信が遅くなり誠に申し訳ありません。
いろいろな手法を教えてくださり、感謝しております。
当方の事情もあり波形データファイルは、いまだに取得できていません。申し訳ありません。
お二方の手法を理解するため、じっくり調べました。
波形整形・微分検出・移動平均について、よくわかりました。
しかし、自己相関はよくわかりません。
自身を徐々にずらして・・・計算するという原理的なことはわかるのですが、
VIにある「X軸の変換係数」は、元データの周期がわかっていないと算出できないのでしょうか?
それとも期待する測定値の周期でも良いのでしょうか?
どちらにしても「X軸の変換係数」の用法が理解できていません。
教えていただけないでしょうか?
また、添付していただいた自己相関VIについて多少手を加えてみました。
webで検索してみると難しい数式がいっぱいでしたが、フィルターを掛けることもあるとか・・・
そして、関数パレットに「自己相関」があったので試してみました。
結果は、自己相関部分を関数パレットの「自己相関」に置き換えただけでは、安定した結果は得られず、
元データにローパスフィルタを追加すると安定した値が出力されました。
自己相関のグラフは、三角波のようなものになりました。
VIを添付します。ver8.6です。
08-26-2010 11:27 PM
takizawa様
>自身を徐々にずらして・・・計算するという原理的なことはわかるのですが、
>VIにある「X軸の変換係数」は、元データの周期がわかっていないと算出できないのでしょうか?
X軸の変換係数は、「計測のサンプリング周期(=dt)」だと思ってください。
最初のtakizawa様の投稿の波形グラフの絵の横軸が、サンプル点数ではなく「時間」のような
小数値で表現されていたので、同じように表示されるよう、適当な係数を設定しています。
そのままだと横軸はサンプル点数になってしまうので。
当然、元データ自身の「波形としての周期」とは無関係です。
(だいたい横軸が0.012で終わるようにして、takizawa様のデータを「見た目」再現しただけ。
見た目の波形グラフを再現するための処理が、かえって混乱を招いているかも知れません)
最初に、2.4E-3 という数値の逆数を「元データの周波数」に与えてしまっているので、
若干混乱を招いているかも知れませんが、この数値を「波形としての周期のサンプル点数(500)」で
割った値が「計測のサンプリング周期(=dt)」になっています。
本当の生データが無いので、そもそも横軸0~0.012の間に何点データがあるのか不明ですので、
500というのは適当に設定したサンプル点数です。
言い換えると、このプログラムは、元データ波形「何サンプル点数で周期をなしているか」
(今回の場合、答えは500)を、自己相関法により割り出している、と思っても良いと思います。
takizawa様のお手元には、最初の投稿で波形グラフを表示している以上、その
元データがあるはず、と思っていました。なので、私のviのダイアグラムの最初の方にある
シーケンスストラクチャ「擬似データ(波形)の生成部」から出てくる配列のかわりに生データ配列を、
「X軸の変換係数」には計測のサンプリング周期(dt)を、それぞれ以降の配線につなげば、
良いわけです。(生データ自身とdtは、あるはずですので)
「X軸の変換係数」がつながっている先の部分を、かわりに「1」にしてみてください。
これは、時間への変換を行わず、「サンプル点数」のまま扱ったことになります。
この場合は、viが算出した周波数は「周期のサンプル数の逆数」になり、「0.0020」という値が
はじき出されるはずです。これは、0.0020=1/500、つまり、「元データの周期は500点ですね?」
と推定してくれた、というわけです。
>そして、関数パレットに「自己相関」があったので試してみました。
>結果は、自己相関部分を関数パレットの「自己相関」に置き換えただけでは、安定した結果は得られず、
>元データにローパスフィルタを追加すると安定した値が出力されました。
>自己相関のグラフは、三角波のようなものになりました。
関数パレットの「自己相関」は、ヘルプにあるように、最も初歩的な形で「ただ左右にずらして
掛け算して和を取る」だけを行っているようです。ずらす量が増えると、足し算する個数が
減ってしまいますので値が小さくなります。例えば、500点のデータを、ずらす量が0で計算すれば、
500個の掛け算ができてその和を取りますが、400点ずらして計算するときは、掛け算は100個だけに
なってしまいます。その結果、関数パレットの「自己相関」が吐き出すデータは、データの真ん中
(=ずらし量ゼロ)のときが最大になる大きな三角形になってしまうのです。
そこで、私の投稿したviでは、ずらして重ねるデータ部分を、それぞれ平均値を差し引き
(=相関が無いときに掛け算の結果が正負にばらつき、和がゼロに近くなるようにする)、
その上で個々を掛け算して和を取ったものを、「掛け算した個数で割る」(=規格化)という
操作を行っています。これにより、周期がTのとき、ずらし量が0でもTでも2Tでも、同じような
値が得られるわけです。
関数パレットの「自己相関」をそのまま使うと、この規格化処理が行われないため、全体が
大きな三角形になってしまうと思いますが、ところどころに、小さな突起みたいなものが、
出ていませんか? その「位置」が、元データが持っている周期です。私の投稿したviでは、
それをよりハッキリと検出できるよう規格化処理をほどこしたわけです。
08-27-2010 12:16 AM
M.Shiraishi様
丁寧に教えていただき本当に助かります。
これで実際にVIへ組み込むことができそうです。
実機で検証し、結果を報告させていただこうと思っています。
ありがとうございました。