2013-03-07 26 views
13

センサのデータがあり、その周波数を見つける必要があります。 fft()のように見えますが、MATLABのドキュメントでは周波数のグラフを取得する方法しか示されていないので、そこから何をすべきかわかりません。MATLABの信号データから周波数を決定

は、ここに私のデータは次のようになります。どこへ行く

enter image description here

答えて

18

一つの方法は、FFTを使用することが確かです。 fftは信号の周波数表現を提供するので、最大値を探したいので、fftは複素信号であるため、絶対値を最初に取ることをお勧めします。指数は、最大エネルギーを有する正規化周波数に対応する。最後に、信号にオフセットがある場合、表示するものと同じように、fftを取る前にそのオフセットを取り除き、DCコンポーネントを表す原点で最大値を取得しないようにします。 1行に入れて、私は説明

すべては次のようになります。

indexMaxは最大FFT値を見つけることができる指標である
[maxValue,indexMax] = max(abs(fft(signal-mean(signal)))); 

注:indexMaxから実際の関心周波数に到達するには、fftの長さL(信号の長さと同じ)とサンプリング周波数Fsを知る必要があります。信号周波数は、次のようになります。

frequency = indexMax * Fs/L; 

はまた、より速く、あなたが持っている信号に応じて、あまりにもかなりよく働いて、あなたの信号の自己相関取る:

autocorrelation = xcorr(signal); 

をし、第1の最大の後に発生見つけます自己相関の中心点。自己相関は最大値を中心に対称になります。最大値を見つけることで、シフトされた信号が多かれ少なかれ自分のように見える最初の場所を見つけることができます。私。あなたはあなたの信号の期間を見つける。その周期の倍数だけシフトした信号は、常にそれ自体のように見えるので、実際に見つかった最大値が信号の周期に対応し、その倍数の1つには対応していないことを確認する必要があります。

信号のノイズのため、絶対最大値は、期間自体ではなく、期間の倍数で発生する可能性があります。そのノイズを考慮するには、自己相関(自己相関(長さ(自己相関)/ 2 + 1)の絶対最大値をとり、自己相関が最初のものの最大値の95%信号の後半の時間95%、99%、またはその他の数字は、ノイズが信号をどの程度損なうかによって異なります。

更新:私はあなたの信号の "周波数"ピッチやベースの高調波や周波数を最も多く消費しますが、あなたはそれを見たいと思っています。もしあなたが信号の周波数表現を意味していたら、最初の近似にするには、FFTのabsをプロットして、どこのエネルギーのアイデア:

plot(abs(fft)); 

なぜ、absがあるのか​​、fftのフェーズを表現しないことで失う関連情報があるのか​​を知りたい場合は、DFT変換についてもう少し詳しく知りたい場合があります。

+0

信号は、ひずみゲージを用いて測定したいくつかの振動からです。私はそれらの振動の頻度を見つけたいと思っています。あなたが投稿した 'fft'メソッドを使用して、私は周波数に対して0.0357を得るが、プロットを見ると、1秒あたり約10サイクルなので、周波数に対して約10を得るべきではないだろうか? – edc1591

+0

1秒間に10回の振動がある場合、それは確かに0.1秒の周期または10Hzの周期です。 indexMax、L、およびFsの値は何ですか?また、大きなスパイクを持っていることを確認するためにplot(abs(fft))を実行し、indexMaxがそのスパイクが発生する場所の正しいインデックスであることを確認します。グラフには、信号に負のオフセットがあることが示されています。つまり、DC成分を表すfftに対してゼロに近いスパイクが存在することになります。あなたが測定しているものかもしれません。その場合、代わりにそのDC成分を除去するために(信号平均(信号))のfftを取る。 – Lolo

+0

私が得ていたスパイクはゼロであった(indexMax = 1)。私はあなたが平均(信号)を差し引いて言ったことをしました、そして、今私は周波数に関して約9.8Hzを得ています、それは正しいようです!助けをありがとう! – edc1591

0

私はそれが

(indexMax-1) * Fs/L 

ABSの最初の要素(FFT(x))を直流(DC)であるか、またはバイアスすること又は信号、又はX0の平均すべきだと思います。我々は第2要素(X1)から数える。 私が間違っている場合はお知らせください。ありがとう。私が持っている enter image description here

clear all 
clc 
close all 
Fs = 1; 
T = 11 % Note this T is deliberately chosen , so that we have about 1.7 cycle of cosine singal 
t = 0:Fs:T; % T seconds 
L = length(t); % L is the length of sample sequence 
bias = 4 
signal = sin(t) + bias; 

[maxValue,indexMax] = max(abs(fft(signal-mean(signal)))); 

frequency_method1 = (indexMax-1) * Fs/(L-1); 
frequency_method2 = (indexMax-1) * Fs/L; 


number_of_cycles_method1 = frequency_method1*T 

number_of_cycles_method2 = frequency_method2*T 


subplot(2,1,1) 
plot(t,signal,'-or') ; grid on; 
legend('about 1.7 cycles of cosine signal') 
subplot(2,1,2) 
plot(abs(fft(signal-mean(signal))),'-xb'); grid on 
legend('abs of fft') 

number_of_cycles_method1 = 

    2 


number_of_cycles_method2 = 

    1.8333 
関連する問題