センサーからのデータがあり、その周波数を見つける必要があります。進むべき道のように見えますfft()
が、MATLAB ドキュメントは周波数のグラフを取得する方法のみを示しており、そこから何をすべきかわかりません。
私のデータは次のようになります。
センサーからのデータがあり、その周波数を見つける必要があります。進むべき道のように見えますfft()
が、MATLAB ドキュメントは周波数のグラフを取得する方法のみを示しており、そこから何をすべきかわかりません。
私のデータは次のようになります。
1 つの方法は、実際に fft を使用することです。fft は信号の周波数表現を提供するため、最大値を探す必要があります。また、fft は複素信号であるため、最初に絶対値を取得する必要があります。インデックスは、最大エネルギーを持つ正規化された周波数に対応します。最後に、信号にオフセットがある場合は、示されているものと同様に、fft を取得する前にそのオフセットを取り除き、DC コンポーネントを表す原点で最大値を取得しないようにする必要があります。
私が説明したすべてを1行にまとめると、次のようになります。
[maxValue,indexMax] = max(abs(fft(signal-mean(signal))));
ここで、indexMax は最大 fft 値が見つかるインデックスです。
注: indexMax から対象の実際の周波数に到達するには、fft の長さ L (信号の長さと同じ) とサンプリング周波数 Fs を知る必要があります。信号周波数は次のようになります。
frequency = indexMax * Fs / L;
または、信号に応じて高速でかなりうまく機能し、信号の自己相関を取ります。
autocorrelation = xcorr(signal);
自己相関の中心点の後に発生する最初の最大値を見つけます。(自己相関は、その最大値が中央にある対称になります。) その最大値を見つけることによって、シフトされた信号が多かれ少なかれそれ自体に似ている最初の場所を見つけます。つまり、信号の周期を見つけます。周期の倍数でシフトされた信号は常にそれ自体のように見えるため、見つけた最大値が実際に信号の周期に対応し、その倍数の 1 つに対応していないことを確認する必要があります。
信号のノイズのため、絶対最大値は、周期自体ではなく、周期の倍数で発生する可能性が非常に高くなります。したがって、そのノイズを考慮するには、自己相関の絶対最大値 (自己相関 (長さ (自己相関)/2+1)) を取得し、自己相関が最初の最大値の 95% よりも大きい場所を見つけます。信号の後半の時間. 95%、99%、または他の数値は、ノイズが信号をどれだけ破壊するかによって異なります.
更新:信号の「周波数」とは、ピッチまたは基本高調波、または最もエネルギーの高い周波数を意味していると思いましたが、それを見たいと思います。周波数によって信号の周波数表現を意味する場合、最初の概算では、FFT の abs をプロットして、エネルギーがどこにあるかを把握します。
plot(abs(fft));
abs がある理由、または fft のフェーズを表していないために失われている関連情報を理解したい場合は、DFT 変換についてもう少し読んで、得られるものを正確に理解することをお勧めします。
そうあるべきだと思う
(indexMax-1) * Fs / L
abs(fft(x)) の最初の要素は、直流 (DC)、バイアス、信号の平均、または X0 です。2 番目の要素 (X1) から数えます。私が間違っている場合はお知らせください。ありがとう。
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