rpmfreqmap​のサンプル数が大きい​理由が理解できません

rpmfreqmapの設定を周波数分解能を1Hz、オーバーラップを0%にして使用してみたところ、予想よりもサンプル数の時間長さが1.5倍大きくなっていました。1Hzなので1秒になると考えていたのですが、1.5秒取り出してFFTしているように見えます。
fs = 600;
t1 = 5;
t = 0:1/fs:t1;
f0 = 10;
f1 = 40;
rpm = 60*linspace(f0,f1,length(t));
o1 = 1;
o2 = 0.5;
o3 = 4;
o4 = 6;
ph = 2*pi*cumtrapz(rpm/60)/fs;
x = [1 1 2 1]*cos([o1 o2 o3 o4]'*ph);
rpmfreqmap(x,fs,rpm, 1, 'OverlapPercent', 0)
[map,freq,rpm,time,res] = rpmfreqmap(x,fs,rpm, 1, 'OverlapPercent', 0);
ヘルプに記載の5秒間の波形データを分析したものです。実行するとtimeの要素数が3個でおよそ1.5秒間隔になっています。
5秒間のデータなので、timeの要素数が5個で1秒間隔になると考えていました。予想と異なる結果で、理由が理解できません。これは何が起きているのでしょうか?

 Accepted Answer

Hernia Baby
Hernia Baby on 26 Aug 2022

0 votes

おそらく 不確定性原理 によるものだと思います。

6 Comments

Genki Uebayashi
Genki Uebayashi on 26 Aug 2022
ありがとうございます。不確定性原理の説明読んできました。周波数マップが周波数方向にぼやけて見えるのは、不確定性原理によるものなんですね。
しかしながらこの質問で私が理解できないのは時間軸方向についての問題です。rpmfreqmapの中を見ると意図的に時間幅を変えているようなのですが、どうしてなのか理解できません。
Hernia Baby
Hernia Baby on 26 Aug 2022
すみません、不確定性原理を出した理由は周波数分解能と時間分解能がトレードオフの関係にあるためと考えたからです。ですので、周波数分解能を確保するために時間分解能は粗くなったのかなと思っています。今回のものが本当にそうなのかはデータを見る必要がありますので、しばらくお待ちください。
Hernia Baby
Hernia Baby on 27 Aug 2022
> 1Hzなので1秒になると考えていたのですが、1.5秒取り出してFFTしているように見えます。
もしかすると周波数分解能と時間分解能が混在していると考えました。
これらはイコールではなく、トレードオフの関係にあります。
つまり です。
Wikipediaにあるイメージがわかりやすいかもしれません。
試しに周波数分解能を1.5Hzにしてみてください。
おそらく時間分解能がその分細かくなっているはずです。
意図的に変えているのはそのためで、数学的なルールになります。
Genki Uebayashi
Genki Uebayashi on 29 Aug 2022
> もしかすると周波数分解能と時間分解能が混在していると考えました。
はい。トレードオフになる点については理解できていると思います。
今考えてることをもう少し詳しく書き出してみました。
⊿fを1Hzにした場合、FFTに使用するサンプリング点数(時間窓)は 1 秒間分(0秒~1秒)。波形から1秒分切り出されてFFTされ、オーバーラップ0%なので次は1秒後の1秒間(1秒~2秒)。が切り出されてFFT…。
となるので、結果は1秒間隔で時間軸方向は5個出てくるはず。と考えています。
時間分解能⊿t = サンプリング点数 / サンプリング周波数
周波数分解能⊿f = サンプリング周波数 / サンプリング点数
⊿f = 1Hz の場合、サンプリング周波数 = サンプリング点数 なので⊿tは1秒。
このように考えており、結果と合わず悩んでいます。
Hernia Baby
Hernia Baby on 29 Aug 2022
Edited: Hernia Baby on 29 Aug 2022
不確定性において窓関数の影響を考慮してないためだと思います。
rpmfreqmapのデフォルトはハン窓( hann )です。
箱型ウィンドウをオプションに設定して見てみましょう。
fs = 600; t1 = 5; t = 0:1/fs:t1;
f0 = 10; f1 = 40;
rpm = 60*linspace(f0,f1,length(t));
o1 = 1; o2 = 0.5; o3 = 4; o4 = 6;
ph = 2*pi*cumtrapz(rpm/60)/fs;
x = [1 1 2 1]*cos([o1 o2 o3 o4]'*ph);
ここで rectwin の設定をします。
[~,~,~,time,~] = rpmfreqmap(x,fs,rpm, 1, 'OverlapPercent', 0,'Window','rectwin')
time = 5×1
0.5000 1.5000 2.5000 3.5000 4.5000
ここでtimeは切り取った時間の中心をとります。
差分をとり、時間を足していきましょう。
times = cumsum([1;diff(time)])'
times = 1×5
1 2 3 4 5
@Genki Uebayashiさんの考えているものになりました。
Genki Uebayashi
Genki Uebayashi on 30 Aug 2022
ありがとうございます。考えていた通りの動きです。
> 不確定性において窓関数の影響を考慮してないためだと思います。
理解できない原因はこれのようです。窓関数について勉強不足ということがわかりました。自分でどここが理解できていないのかも分かっていなかったのでとても助かりました。

Sign in to comment.

More Answers (0)

Products

Release

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!