NavigateSafetyField's blog

ギターと写真が趣味のエンジニアのおっさんのブログ。

ブログ紹介

こんなに記事を書くつもりはなかったのですが、思ったより記事を書いてしまったので、自分のブログ紹介をしたいと思います。主に趣味での活動を記録しているブログです。 Amazonアソシエイトは試験的に参加しています。

音楽

ギターのマルチエフェクターのHEADRUSH MX5を使い倒そうと思ってブログをはじめました。 ボードに隙間があったので、飛び道具としてSourceAudio C4 Synthも購入したので、使い倒そうと思っています。
何かと困る事が多いであろう、MIDIで連携する記事も書いています。参考になれば幸いです。

エフェクター

HEADRUSH MX5

navigatesafetyfield.hatenablog.com

Source Audio C4 synth

navigatesafetyfield.hatenablog.com

MIDI連携

navigatesafetyfield.hatenablog.com

その他のエフェクター

navigatesafetyfield.hatenablog.com

演奏に挑戦

HEADRUSH MX5とSourceAudio C4 Synthを使った演奏をアップしています。
navigatesafetyfield.hatenablog.com

写真・カメラ

もう一つの趣味である、写真やカメラの事に関する記事です。
navigatesafetyfield.hatenablog.com

IT・AI・統計・信号処理

趣味の事のみ書こうと思っていたのですが、おまけで記事を書きました。仕事のおまけです。
ついでに音の画像化も始めました。 navigatesafetyfield.hatenablog.com

Blog Tips

ブログを書くにあたり思いついた事や気づいた事をまとめています。
navigatesafetyfield.hatenablog.com

終わりに

気分で書いているブログですが、よろしくお願いいたします。

English Blog

英語でもブログ書いてます。 nsf-english.hatenablog.com

直交検波による復調の説明とコード

はじめに

navigatesafetyfield.hatenablog.com

上記の記事で、趣味でコード書き始めたので一部のコードを要素に分けて公開する事にしました。

今回扱うのは、直交検波による復調のコードです。

コード

下記リンクの直下にファイルの説明、signal_processingのフォルダにソースコードが入っています。

github.com

main関数について

計測で使用する事を想定したテストケースを書きました。
実行すると、下の図のような感じで、振幅や初期位相が出力されるようになっています。

直交検波について

用途

簡単なところでは、ラジオのAMやFMの復調(電波に音声情報をのせるために使う)に使われています。
音波や電磁波を使った計測の高精度化や通信の0,1の送信(電波→0,1の信号に変換する事)に用いられています。 もう前の世代ですが、通信では3、4Gといったところの基礎的な技術です。

振幅と初期位相

波の信号→飛行時間(実質、距離)、波の信号→0,1のデータに変換するのに用いられるのですが、振幅と初期位相という言葉が出てきます。
グラフ作るの面倒なんで式だけで説明します。数式苦手な人ごめんなさい。
波の式  F(t) を、以下の式に定義します。


F(t) = A * \sin(2 \pi f t + \phi)

 A が、振幅
 f が、送信周波数
 t が、時間
 \phiが、初期位相
です。

つまり、振幅  A は、波の大きさ。
初期位相  \phi は、時刻 0 の時の位相(円で波を考えた時の角度)を表しています。

計測の高精度化の際は、初期位相までみると、反射波の時刻が、一つの波の中のどこの位置までわかるので、計測を高精度化する事ができます。

また、通信で用いる場合は、振幅  A の大きさと、初期位相  \phi に0,1を割り当てることによって情報をやり取りします。
例えば、 A = 1, \phi = 0を 0、 A = 1, \phi = \piを 1とするなどして、それを読み取ります。

直交検波について

送信した波の信号から、振幅と初期位相を取り出す処理ですが、その際決まったの周波数から復調を行います。
元の送信信号を F(t)、復調周波数を fとすると、

 I(t) = F(t) * \sin(2 \pi f t)
 Q(t) = F(t) * \cos(2 \pi f t)

 I(t) Q(t) にローパスフィルタをかける。

 Amplitude \left( t \right) = \sqrt{ \left( 2 * I \left( t \right) \right) ^2 +
 \left( 2 * Q \left( t \right) \right) ^2}
 InitPhase(t) = \arctan{ \dfrac{ Q(t) }{ I(t)} }

 Amplitude(t)が、復調された振幅。  InitPhase(t)が、復調された初期位相となります。

直交検波計算式

直交検波は、どうやって波から、振幅と初期位相を読み込むのか式で説明します。
送信する信号を以下に定義します。 計測で使用する波を想定しています。


F(t) = A * \sin(2 \pi f_s t) * \sin(2 \pi f_c t + \phi)

 A が、振幅
 f_s が、信号周波数
 \phiが、初期位相
 f_c が、搬送周波数(キャリア周波数)
 t が、時間

 A * \sin(2 \pi f_s t)の波を、 \sin(2 \pi f_c t + \phi)で変調をかけた式となっています。

これを直交検波します。
 I(t) =  A * \sin(2 \pi f_s t) * \sin(2 \pi f_c t + \phi) * \sin(2 \pi f_c t)
 Q(t) =  A * \sin(2 \pi f_s t) * \sin(2 \pi f_c t + \phi) * \cos(2 \pi f_c t)

これを、三角関数の公式を使ってうまく計算してやると。

 I(t) =  \dfrac{1}{2} * A * \sin(2 \pi f_s t) * \cos( \phi ) + noise
 Q(t) = \dfrac{1}{2} * A * \sin(2 \pi f_s t) * \sin( \phi ) + noise

となります。

ローパスをかけると  noise が消えるので、 ( noiseは、ざっくり 2 * f_cくらいの周波数です。)

 Amplitude \left( t \right) = \sqrt{ \left( 2 * I \left( t \right) \right) ^2 +
 \left( 2 * Q \left( t \right) \right) ^2}
 InitPhase(t) = \arctan{ \dfrac{ Q(t) }{ I(t)} }

を計算すれば答えがでます。
本当に、ざっくりとしか計算してないので、間違えていたら指摘してください。適当なネットのブログをあてにしてはならないよ、そこの学生さん。(見てたらの話ですが。)

終わりに

Texとかちゃんとした数式使うの久しぶりすぎて笑った。
コードも含めてですが、お作法が守れてないところが多々あると思うので、適宜修正してください。

最後に、Amazonアソシエイトで誰も買ってもらえないので、関連しそうな本のリンクを貼っておきます。 古い技術だから本があまりない気がします。

Amazonのアソシエイトとして、NavigateSafetyField's blogは適格販売により収入を得ています。

参照

ローパスフィルタの実装は、下記のブログを参考にしました。ありがとうございます。

watlab-blog.com

English blog

nsf-english.hatenablog.com