信号の周期がわかりません


7

一定速度のモーターの音であるノイズの多い信号があるので、音は周期的でなければなりません。周期を取得するために自己相関関数を使用する方法があることはわかっていますが、それを行いましたが、期間がわかりません。信号と自己相関の結果の下でそれを行う方法のアイデア:信号 信号

自己相関の結果: 自己相関


新しい質問がある場合は、[ 質問する ]ボタンをクリックして質問してください。コンテキストの提供に役立つ場合は、この質問へのリンクを含めます。- レビューから
MBaz

回答:


6

ここにあなたが必要なことをする試みがあります scilab.

ここに画像の説明を入力してください

上のプロットは、私が合成したいくつかのデータを示しています。2番目のプロットは、生データの自己相関を示しています(自己相関の中央ピーク付近を拡大表示しています)。赤い円は、このfind_peaks関数を使用して検出されたピークを示しています

最後のプロットは、すべてのピーク位置の違いを示しています。これは期間の見積もりになります。基礎となる期間が整数のサンプルになることが保証されていないため、おそらくこれらの値の平均を見つける必要があります。

この場合、「真の」期間は1/f0 = 11.191996であり、を取得diffs = diff(peaks);してからがmean(diffs(10:173))得られ11.195122ます。


以下のコード。

N = 1000;
f0 = 0.0893495634;
phi = rand(1,1,'uniform')*2*%pi;
sigma = 0.5;

x = sin(2*%pi*[0:N-1]*f0 + phi) + sigma*rand(1,N,'normal');
XC = xcorr(x);

clf
subplot(311)
plot(x);

subplot(312)
plot(XC);

peaks=peak_detect(XC,0);

plot(peaks,XC(peaks),'ro')

a = get('current_axes');
a.data_bounds=[950 1050 -500 800];

subplot(313)
plot(diff(peaks));

4

信号にウィンドウ関数を適用しているようです(自己相関プロットはウィンドウのようです)!

その作業を行うには、信号をフレーム化された一定のデータに分割するか、重複しないかを決め、自己相関関数を適用します。

y(k)=n=0N1x(k)x(n+k)

最後にピーク位置を見つけて、期間を見つけたことを祝福します!

ここでMATLAB それをどのように行うか


いいえ、私はそうではありません。
エンジン

ピークは、自己相関ベクトルの最大値です!
ederwander 14年

私の期間は10000にすることはできません。私のベクトルには10000の要素がありますか?
エンジン

2
窓関数を適用する必要はありません。標準の(バイアスされた)自己相関推定器は、自己相関に対する三角形の包絡線を生成します。また、自動相関のピークは常に中央にあるため、「ピーク位置を見つける」とはどういう意味かをもう少し説明する必要があります。メインピークを見つけて、それに最も近い次の最大のピークを見つけるのではないかと思います。2つの間の距離は、期間の推定値になります。
ピーターK

そうです、@ Engineからのプロットは標準的な自動修正のようです:-) ここで
ederwander

0

信号の「周期」を把握するための私の好ましい方法は、スペクトルを調べることです。信号に強い正弦波があり、ノイズが含まれているようです。FFTを取得してマグニチュードをプロットすると、どの周波数が最も強いかを確認できます(おそらくモーターが動作しているRPMに対応します)。信号の「周期」は、信号周波数で割った1になります。10Hzの正弦波を使用している場合、その周期は0.1秒になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.