バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回からIFFTに活躍してもらうべく超簡易的なバンドパスフィルタにチャレンジ。
その前に周波数分布関数のローテーションを行う。
FFTで得られる周波数分布関数の後半にいる複素共役を負の周波数帯に持ってきた方が扱いやすい。
まずはMATLABでローテーションを実施する。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
MATLABのベクトルローテーション関数
で、今回は周波数分布関数をローテーションさせて、複素共役を負の周波数帯には位置するって事になると思うのだけど、
MATLABでベクトルのローテーションとかできるんだっけ?
最悪はfor文で回せば良いとは思うけど。
あるよ。
circshiftって関数。
ベクトルだけでなく、行列でも使用可能で、
ローテーションさせる次元の指示もできるようだ。
まぁここにちょっと罠がわるわけなのだけど。
circshiftの罠
関数があるならそれ使っちゃえばOKだね。
簡単に実験してみよう。
>> A = [1, 2, 3, 4, 5]
A =
1 2 3 4 5
>> B=circshift(A,3)
B =
1 2 3 4 5
>>
あ、あれ?
ローテーションどころかシフトもしてない・・・。
だから罠があるっていったじゃん。
何?
なんかよくわからん仕様があるのか?!
circshiftはデフォルトの次元が1で、
つまり列方向のローテーションになるんだよね。
そして、太郎くんが作成したベクトルは行ベクトル。
列がローテーションされただけで、行には影響しなかったってことだ。
circshiftのローテーションルール
で、結局どうすれば良いの?
まぁ最初から列ベクトルにしておくってのが手っ取り早いかな。
>> A = [1, 2, 3, 4, 5]'
A =
1
2
3
4
5
>> Y = circshift(A,3)
Y =
3
4
5
1
2
これだと行ベクトルにはできないってことになっちゃうけど・・・。
行ベクトルに対してやるならこんな感じになるな。
>> A = [1, 2, 3, 4, 5]
A =
1 2 3 4 5
>> Y = circshift(A,[0,3])
Y =
3 4 5 1 2
なんか、引数にベクトルが・・・。
[0,3]の内訳は、それぞれの次元のローテーションさせたい数だな。
[0,3]の場合だと、
列方向に0、行方向に3。
ってことになる。
あー、そういう使い方になるのか。
なんとなくわかった。
(まさか、circshiftだけで1回分になるとは・・・。)
まとめ
まとめだよ
- MATLABでベクトルローテーションをさせたい場合はcircshift関数を使えばOK。
- ただし、次元指定の罠がある。
- デフォルト次元が列方向なので、行ベクトルに対して行うとローテーションされない。
- (実際には列方向にローテーションはされてると思う)
- [0,3]のように列行それぞれにローテーション数を指定する。
- ただし、次元指定の罠がある。
バックナンバーはこちら。
コメント