(FFTに頼らずに)信号から主な周波数/周期を抽出する簡単な方法はありますか?
私の要件では、これはメイン周波数 (たとえば 3Hz) の値またはターゲット周波数の強さを表す値のいずれかになります。たとえば、次の 1 次元信号では、サンプリング レートが 50ms であると仮定すると、周波数は約 4Hz です。
これをプログラムでデータからどのように抽出できますか?
10 2 1 2 8 10 8 2 1 1 8 10 7 1 1 2 7 10 5 1
(FFTに頼らずに)信号から主な周波数/周期を抽出する簡単な方法はありますか?
私の要件では、これはメイン周波数 (たとえば 3Hz) の値またはターゲット周波数の強さを表す値のいずれかになります。たとえば、次の 1 次元信号では、サンプリング レートが 50ms であると仮定すると、周波数は約 4Hz です。
これをプログラムでデータからどのように抽出できますか?
10 2 1 2 8 10 8 2 1 1 8 10 7 1 1 2 7 10 5 1
自己相関を使用してください!
%using Matlab
%convert sample rate to hertz
fs = 1/(50/1000) % result = 20hz
vector = [10 2 1 2 8 10 8 2 1 1 8 10 7 1 1 2 7 10 5 1];
R = xcorr(vector);
[pks,locs]=findpeaks(R);
%result in hertz
fs./(diff(locs))
ans =
3.3333 4.0000 3.3333 3.3333 4.0000 3.3333
max(fs./diff(locs))
ans =
4
信号に自己相関を適用します。Web には、自己相関を実行するためのさまざまな言語のソース コードが多数あります。これは疑似コードです。
TotalSamples = length(signal)
for z=1:TotalSamples
sum = 0;
for i=1:TotalSamples
sum = sum + (signal(i)*signal(i + pos));
end
Xcorre(z) = Xcorre(z) + sum;
end
自己相関の結果からすべてのローカル ピークを見つける
ローカル ピーク間の差を計算するlocs[k+1] - locs[k]
フレーム レートをローカル ピークの差で割る
周波数は最大値です