SSブログ
前の10件 | -

IC-911DでのFT8運用におけるマイク端子入力レベルによる歪の影響 [ham]

FT8の送信実験の際に遭遇した不具合についてです。
WSJT-Xで発生させた低めの周波数のオーディオ出力をIC-911Dのマイク端子へ入れた場合、結構大きな歪が発生して高調波が出ると同時に送信出力まで下がってしまう事象が起きました。そこで、いくつか条件を変えて送信し、受信機の復調信号(オーディオ信号)を観察してみました。
詳細はhttp://www009.upp.so-net.ne.jp/gateside/body/FT8_mic_level/ft8_mic_level.htmlをみてください。

下の図 はIC-911Dのマイク端子へ過大なレベルで入力、Fake It無しの状態で送信したものを別な受信機で受信したものです。

fig05_wsjt-x_disable_Fake_It_s.jpg

次の図は上の図の条件で、Fake It有りの設定のみ変更した場合の状態で送信したものです。
スプラッタが消えています。

fig06_wsjt-x_enable_Fake_It_s.jpg

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

Raspberry Pi 3 による FT8 の運用 [ham]

1. FT8をやってみる
 少し前から流行っているデジタルモードのFT8ですが、私もようやく運用にこぎつけました。デジタルモードですのでPCに専用のアプリケーション(WSJT-X)をインストールすることになりますが、普段使っているデスクトップのPCではQtのバージョンが合わないことがわかり、どうしたものかと調べていたら、Raspberry Pi でWSJT-X を運用している諸先輩方がいらっしゃるようです。それで、ほったらかしになっていた Raspberry Pi 3 B+ が有ったのを思い出し、こっちの方が楽で面白そうだと思い、やってみました。機器の構成を以下に示します。

機器の構成.png

2. 機器の準備、運用
 FT8はWSJT-Xというソフトを操作することになるため、Raspberry Pi に WSJT-X をインストールするのですが、その前に準備が必要です。まず、変調/復調のデータはオーディオ信号なので、Raspberry Pi 3 で音声の入出力が扱えるようにしなければなりませんがRaspberry Pi 3には音声入力のためのハードウエアがありません。そこで今回はUSBオーディオ変換アダプタを使用しました。使用したアダプタは サンワサプライ(株)の MM-ADUSBTC1 で、これ自体はつなぐだけですぐ使えました。動作確認についてはhttps://ham-jq1qnv.blog.ss-blog.jp/2020-05-25-1を見てください。
 次に hamlib です。Raspberry Pi 3 からリグを操作するために hamlib とシリアルインターフェースが必要になりますが、これについてはhttps://ham-jq1qnv.blog.ss-blog.jp/2020-05-26-1を見てください。あと、FT8は時刻の精度が要求されますのでNTP等で時計の同期が取れるようにしておいてください。
 Raspberry Pi 3周りのハードウエアが準備できたら、最後にWSJT-X のインストールです。http://www.kk5jy.net/wsjtx-build/ に必要なライブラリのインストール方法など詳しく書かれていて、このページのとおりに操作したらインストールできました。
 WSJT-Xの設定や運用は webで諸先輩方が教えてくださっているので探してみてください。2020年6月23から7月11日までの運用実績は 144MHz 66QSO, 430MHz 25QSOでした。送信機は主にIC-911Dです。IC-7400でも交信していますが、後述の理由で2QSOに留まっています。

3. 周波数ドリフトの問題
 IC-911Dでしばらく運用した後、送信機を取り換えて IC-7400で運用してみたのですが周波数ドリフトが大きくてうまく行きませんでした。IC-7400でしばらくワッチして、いくつかCQを出している局が有ったので呼んでみました。しかし、相手から応答があるようなのですが、デコードしてくれません。ウォーターフォールを見てみると、どうも受信周波数がドリフトしているようなのでその様子を確認してみました。ダミーロードを取り付けた別な送信機(FT-817)でCWのトーンを連続送信し、その漏れ電波をIC-7400とつながっているWSJT-Xで受信、次にIC-7400からWSJT-XのTune機能を使って15秒送信、15秒受信を繰り返してWSJT-Xのウォーターフォールをみたところ、 15秒間の受信中に40Hz近いドリフトがあることが判りました(下図)。FT8の帯域が50Hzなので、さすがに短時間にこれだけ動くとデコードできないのでしょう。

IC-7400_144MHz_Screenshot from 2020-07-05 14-06-40_1.png

IC-911Dでも同様の実験をしましたが、送信・受信を繰り返してもほとんどドリフトは無く下図の通り良好に動作しています。

IC-911D_144MHz_Screenshot from 2020-07-05 09-59-56_1.png

(IC-7400はリグの電源を入れて2,3時間経ってもこんな調子です。まぁ、こんなにひどいのは144MHzだけで、50MHzも多少ドリフトはありましたが、程度は小さく、 HFではさらに小さいドリフトだったので、HFなら、まぁ、いけるんじゃないかと思います。)

4. FT8でのALC
 以前、PSK31の運用に際してALCとIMDの関係を調べたことがあり、送信機への制限を(少しでも)超えた入力はALCの影響で歪んだ出力になると認識していましたのでFT8でも同じだろうなと思っていました。しかし、調べてみると、FT8は変調により周波数が変化するとき以外は基本シングルトーンで相互変調するための周波数成分が無いためALCについてはPSK31ほど神経質になる必要は無さそうです。デジタルオシロでRaspberry Pi 3 からのFT8のオーディオ信号を観察してみましたが、一定振幅のシングルトーンでした。ただし、過大入力で問題が出ない無い訳ではなく、マイクからの音声信号を増幅する回路に非線形があると Raspberry Pi 3 からのシングルトーンに高調波が混ざってきますので、低いトーン周波数の場合はバンド内に妨害が出ます。また、この問題を軽減するためにWSJT-X では"Fake It"という機能があります。

5. MIC入力かACC入力か・・・答えは"Fake It"でした
 WSJT-X のTune時出力(500 Hzのトーン)をIC-911Dのマイク端子につないで実験したところ、結構ひどい高調波が出ていることがわかました。入力をACC端子に変えたら高調波はかなり低くなったのでマイク入力の低周波増幅器が悪さをしているようです。次にWSJT-Xの設定を変えて Fake It を有効にしたらMIC入力であっても高調波はかなり低くなりました。実験の結果を下表に示します。

送信機への入力の違い.png

6.その他
 U/Vの空いているバンドだからできるのかもしれないのですが、CQ局を呼んだ後に別な局から呼ばれることが結構ありますね。CWやフォーンだとCQ局への妨害になるのでCQ局を呼んだ局が別な局から呼ばれることは稀ですが、FT8だとスコープ内のCQ局とは別な周波数で呼べば妨害にならないので躊躇なく呼ぶことができます。また、呼ばれた方もそれが受信履歴で色分けされた文字として表示されるので、呼ばれたことがすぐにわかりますし、気づくのが遅れても1分程度であれば応答できるというこれまでとは違った形の交信ができますので意外と効率は良いと思います。
 やっと参入したFT8ですが、現時点まだHFでの運用ができていないので自宅のHF環境を整えつつ運用に漕ぎ着けたいと思います。

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

無線機を Raspberry Pi 3 で操作する (hamlib) [ham]

無線機と Raspberry Pi 3 を USB で繋いで無線機の制御をする。

1. hamlib インストール

https://dl1gkk.com/setup-raspberry-pi-for-ham-radio/
を参考に hamlib 3.3 をインストール。
パッケージ管理をしたかったので make install ではなく、
checkinstall を使った。
しかし、以下のエラーが出てうまく行かず。

$ sudo checkinstall

        ・
        ・
        ・
   /bin/mkdir -p '/usr/local/share/doc/hamlib/html'
  /bin/mkdir: ディレクトリ `/usr/local/share/doc/hamlib' を作成できません: そのようなファイルやディレクトリはありません
  Makefile:710: ターゲット 'install-dist_htmlDATA' のレシピで失敗しました
  make[2]: *** [install-dist_htmlDATA] エラー 1
  make[2]: ディレクトリ '/home/hoge/apl/hamlib-3.3/doc' から出ます
  Makefile:783: ターゲット 'install-am' のレシピで失敗しました
  make[1]: *** [install-am] エラー 2
  make[1]: ディレクトリ '/home/hoge/apl/hamlib-3.3/doc' から出ます
  Makefile:592: ターゲット 'install-recursive' のレシピで失敗しました
  make: *** [install-recursive] エラー 1

  ****  インストールは失敗しました。パッケージの作成を中断します

  クリーンアップ..OK

  Bye.

仕方がないので下記を実行

$ sudo mkdir -p '/usr/local/share/doc/hamlib/html'

そのあと、checkinstall を実行して何とかインストールできました。
$ sudo checkinstall



2.無線機との接続(シリアルインターフェース  ICOM CI-V)


使用した USB インターフェースは下記、
http://www009.upp.so-net.ne.jp/gateside/body/ft232rl/ft232rl.html

これは Raspberry Pi 3 に繋ぐだけですぐ使えた。(ドライバのインストールは不要)

IC-911Dにつないで動作確認( 権限の関係でここでは sudo )
$ sudo rigctl -r /dev/ttyUSB0 -m 344
[sudo] hoge のパスワード:

Rig command: f
Frequency: 432420000

USB 経由で FT232 などのシリアルインターフェースを使う場合、ユーザが"root"や"pi"ではない一般のユーザだと権限の問題があり、結果的に hamlib が動作しないので、権限を付与するために下記を実行。
  $ sudo adduser 使用したいユーザ名 dialout

権限については設定がいろいろ面倒なので、結局のところ自ユーザの権限を pi に合わせて設定した。
$ sudo usermod -aG \
> adm,dialout,cdrom,sudo,audio,video,plugdev,games,\
> users,input,netdev,gpio,i2c,spi ユーザ名


(セキュリティーにこだわらないのであればユーザ"pi"で全てインストールしてしまった方が良いかもです。)

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

Raspberry Pi 3 で USBオーディオ変換アダプタを使用する [Linux]

Raspberry Pi 3 で音声の入出力が扱えるように USBオーディオ変換アダプタを使用する。
使用したアダプタは SANWA の MM-ADUSBTC1 で、これ自体は繋ぐだけですぐ使えた。

1.以下動作確認
(1)録音デバイスの確認。LXTerminalを起動して arecord コマンド実行。
  # arecord -l
  **** ハードウェアデバイス CAPTURE のリスト ****
  カード 1: Device [USB Audio Device], デバイス 0: USB Audio [USB Audio] 
    サブデバイス: 1/1
    サブデバイス #0: subdevice #0


(2)音声出力デバイスの確認。aplay コマンド実行。
  # aplay -l
  **** ハードウェアデバイス PLAYBACK のリスト ****
  カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
    サブデバイス: 7/7
    サブデバイス #0: subdevice #0
    サブデバイス #1: subdevice #1
    サブデバイス #2: subdevice #2
    サブデバイス #3: subdevice #3
    サブデバイス #4: subdevice #4
    サブデバイス #5: subdevice #5
    サブデバイス #6: subdevice #6
  カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 IEC958/HDMI [bcm2835 IEC958/HDMI]
    サブデバイス: 1/1
    サブデバイス #0: subdevice #0
  カード 0: ALSA [bcm2835 ALSA], デバイス 2: bcm2835 IEC958/HDMI1 [bcm2835 IEC958/HDMI1]
    サブデバイス: 1/1
    サブデバイス #0: subdevice #0
  カード 1: Device [USB Audio Device], デバイス 0: USB Audio [USB Audio]  
    サブデバイス: 1/1
    サブデバイス #0: subdevice #0

(3)録音のテスト(Cntl-Cで録音終了)
  # arecord -D plughw:1,0 -d 10 -f cd test.wav
  録音中 WAVE 'test.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ
 
(4)再生のテスト
  # aplay -D plughw:1,0 test.wav
  再生中 WAVE 'test.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ

  注)aplay arecord とも "-D plughw:1,0" でデバイスを指定する必要がる。


2.ユーザの権限
 ユーザが root や pi ではない一般のユーザだと権限の問題があり aplay,arecord が動作しないので、一般ユーザで音声入出力を扱いたい場合は権限を付与する必要がある。下記を実行。
  $ sudo adduser 使用したいユーザ名 audio

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

Raspberry Pi 3 のキーボード設定 (英語配列になってしまうトラブル) [Linux]

約2年前に買った Raspberry Pi 3
ほったらかしになっていたのでいじってみた。
すんなり行かない部分があったのでメモ。

キーボードの設定(英語配列になってしまうトラブル)


使用したキーボードは NBL102UBK1 というおそらく廉価版の普通のキーボード


対処方法は下記。
シェルで下記を実行
$ sudo raspi-config

図01〜図07で設定。

01.png
図01


02.png
図02


03.png
図03


04.png
図04


05.png
図05


06.png
図06


07.png
図07


次に、デスクトップからパネルに表示されているキーボーのアイコンを右クリック(図A1)

A1_s.png
図A1


「入力メソッドの設定」のウィンドウが開くので、
そのウィンドウの下側に「+」のボタンがあるのでクリックし、
入力メソッドを追加する(この場合「日本語(OADG 109A」図A2)

A2.png
図A2



経緯
当初 図03を図91の如く「標準105キー」で設定したのだが、
JISの配列にならず、記号"|"が打てなかった。
試しに「Logitec 標準キーボード」にしたらうまく行った。

91.png
図91

Raspbian のバージョンは下記


Description:    Raspbian GNU/Linux 9.11 (stretch)
Release:    9.11


追記:2020-05-25

英語配列と言っても、UK配列とUS配列があるようで、この違いも認識しておく必要があるみたいです。


nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

Vine 6.5 に Canon PIXUS TS6330 のドライバをインストールする [Linux]

プリンターが壊れちゃったので買い換えた。複合機のCanon TS6330
なので、Vine Linux 6.5 にプリンターとスキャナーのドライバーをインストールした。

1.ドライバーのダウンロード
  Canon の web ページから下記 Linux ソースファイルをダウンロード。
      cnijfilter2-source-5.90-1.tar.gz
      scangearmp2-source-3.90-1.tar.gz
  (Ubuntu 向けとか Fedora 用の rpm もあるけど、ここではソースファイルを使う)

2.ドライバーのインストール
(1)プリンタードライバー
  cnijfilter2-source-5.90-1.tar.gz を適当なディレクトリに置いて下記実行。

      $  rpmbuild -tb cnijfilter2-source-5.90-1.tar.gz --with build_common_package

  /home/hoge/rpm/RPMS/x86_64 に cnijfilter2-5.90-1.x86_64.rpm ができるので
  /home/hoge/rpm/RPMS/x86_64へ移動して以下を実行

      $  sudo rpm -ivh cnijfilter2-5.90-1.x86_64.rpm

  前のバージョンは common とプリンターのモデルごとのドライバーのrpmが生成されたので、
  common とモデルに合ったドライバーを複数インストールする必要が有ったが、
  このバージョンは cnijfilter2-5.90-1 の一つだけのようだ。


(2)スキャナードライバー
  scangearmp2-source-3.90-1.tar.gz を適当なディレクトリに置いて下記実行。

       $  rpmbuild -tb scangearmp2-source-3.90-1.tar.gz  --with build_common_package

  プリンターと同様に/home/hoge/rpm/RPMS/x86_64 に移動して
  scangearmp2-3.90-1.x86_64.rpmができているので以下を実行

       $  sudo rpm -ivh scangearmp2-3.90-1.x86_64.rpm

  プリンターは Wi-Fi ルーター経由で今のところ特に問題無く動作しているのだが、
  スキャナーの方はうまく行っていない。
  USB接続での scangearmp2 は動作確認できたのだが、LAN 経由だとうまく行かない。
  xsane との連携もできないし、Linux の PC でスキャンするのは諦めるか・・・
  スマホで操作できるから、わざわざ PC でスキャナーを操作すること自体あまり無さそうだし・・
  と言う事でスキャナーの方は放おっておくことになりそう。^^;


nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

しばらくブログの更新をサボっていた件 [Linux]

2017年3月以降ブロクの更新をサボっていた。
webに書き込むネタがなくなってしまったからだ。
と言うのも、
2017年の5月頃からポケモンGoをやり始めた。
新調したタブレットになんの気なしにポケモンGoをインストールしたことが災いした。
タブレットを買うことになったきっかけは、
帰省した際、妹がタブレットを持ってきていたのでちょっと触らせてもらったんだけど、
自分も欲しくなっちゃって買った。
それまでタブレットはiPadかWindowsのものしか無いと思い込んでいて(何たる情弱orz)、
android のタブレットがあることを知らなかった。
もっともこの時はガラ携を使っていたので android も良くは知らなかった。
ただ、android が linux だと言う事は知っていたので親近感はあったし、
妹のタブレットの android の日本語入力システムが wnn だったことに驚き
感動してコレ欲しい!となりました。
wnn は linux を始めた頃ちょっと使ったこともありなんか懐かしかった。
ここで会えるとは思わなかった。
帰省先から戻ってからも、タブレットほしいの思いは変わらず、
「家内はパソコンを使わないので、これがあるとnet検索もできるよな!」とか
都合のいい理由も考えついたりして、ほどなく購入したわけです。
無線の移動運用でも使えるように SIM が挿せる奴がいいと思ってそのモデルを買いました。
しかし、それが運の尽きでした。
こうしてこのタブレットはポケモンGo専用となりましたとさ・・・
その後、スマホに変え、2018年7月頃からはingressもやり始めて、
結局それらに時間を取られて、webに書き込むネタがなくなってしまって、
と言うのが真相です。
この度、ingress の Sojourner のメダルが Onyx になったので、
まぁ、ここらあたりが一段落か。また無線と Make に戻るかなぁ。
とか思い始めています。

ポケモンGo や ingress は娯楽でしか無いんだよなぁ・・・
ただ、これをきっかけに、祠や地蔵や庚申塔とかに興味が沸き始めてはいるんだよなぁ・・・


nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

NHK-FM きらクラ! 「ご自愛☆ステッカー」いただきました。 [ham]

来ました。前回の放送からその週のうちに届きましたので早かったですね。
ドンのコーナーに応募して、チャイコフスキーのアンダンテ・カンタービレを正解で読んでもらえました。
実は2月にもドンに応募して一度投稿を読んでいただいたのですが、
その時はニアピンで、ニアピン競争にも負けてステッカーはもらえませんでした。
でも、ふかわさんが"わたしもそう思った"といってくださったことや
その投稿に書いた絶滅した鳥ドードーの話で盛り上がっていただいたので、
それはそれでいいかと思うことにしました。(くやしいけど)
まぁ、結局、今回ステッカーをいただけたので今はもう満足してしまっています。hihi

ブログのカテゴリー(ham)が合ってないって?
そんなことはないですよ。なにせラジオネームを"QNV"で投稿していますから。
ラジオも無線ですし。


回転体アンバランス振動の模型を作ってみた [工作]

いろいろ思うところがあって、回転体アンバランス振動の模型を作ってみることにしました。
錘を模型のモータで振り回して振動させ、それを加速度センサーで測って、
不釣合いの振動ベクトルを計算して、モード円を画いてみると言うものです。

装置の製作から、振動ベクトルの計算、結果表示と、ひととおり出来上がったのでwebページに纏めました。今回は、機械工作、電子工作、プログラミングとメイカー臭を撒き散らしたものになっています。(残念ながら裁縫は無い)

 http://www009.upp.so-net.ne.jp/gateside/body/rotor_model/rotor_model.html

実験の様子の動画(YouTube: https://youtu.be/83qR7vTQLZk)

加速度センサを買ったのは2012年10月と、ずいぶん前で、その頃から構想はあったようなのですが、
しばらくほったらかしにしていて、2015年の春ごろから部品を少しずつそろえ始めてようやく完成しました。

この装置は実用的な何かではありませんが、
ここで取り上げているセンサー類と計測器、分析器を使って、
たとえば自転車等のホイールバランスに使えそうかなと思います。


TBS1052B + octave 4.0.1 ( + Vine linux 6.3 ) [Linux]

Vine linux でもOctave が3.6.4 から4.0.1 へアップグレードされましたね。
パッケージを作ってくださった方に感謝します。
FFT結果を判りやすく表示させるために findpeaks の関数を使いたかったのですが、
旧版ではサポートされておらず、あきらめいていました。
が、今回、新しいバージョンがリリースされ、findpeaksも使えるようになったので、
早速アップグレードした次第です。
FFTについては前の記事でTBS1052B用のoctaveスクリプトを作っていて、
これは新バージョンでもそのまま動作しましたが、
Octave を起動するためのbashスクリプトはそのままでは動きませんでした。
そういった訳で、ほんの少し引っかかった部分があったのでメモします。
3.6.4では octave の起動オプションに --eval とスクリプトファイル指定の併用が可能でしたが、
4.0 .1ではどうもだめっぽい。
bash のスクリプトで取得したデータのファイル名を octave に渡す必要があるため、
--eval オプションの方でデータのファイル名とoctave スクリプトの両方をを渡す形にしました。
そのための スクリプトは下記。スクリプト中の filename は TBS1052B で測定してUSB に保存した
波形データ(CSVファイル)で、octfft.m(後述の octave スクリプトファイル)の中で使用しています。

#!/bin/sh
# TBS 1052B のデータを FFT して表示
OCTDIR="/home/hoge/octave"
csvfile=$(zenity --file-selection --title "TBS 1052B FFT Analysis" --text "send CSV file ")
octcmd="filename='$csvfile' ; cd $OCTDIR ; octfft"
/usr/bin/octave-cli --eval "$octcmd" --persist

Octave スクリプトのパスの設定をしてやるともう少しスマートになると思いますが、
動いているのでまぁいいかと妥協しています。

折角なので findpeaks を使ってピークの表示をしてみました。
表示例は下記。
octave-fft.png
octave スクリプト octfft.m は以下です。

#  USB に保存した TBS1052B の csv データを読み込んで
#  FFT 解析、表示させる octave スクリプト

  TBS1052Bdata=dlmread( filename ,',');
  Timeseri=[TBS1052Bdata(:,4) TBS1052Bdata(:,5)];

# 情報
    infofile=fopen( filename, 'r')
    TBS1052Binfo=fgetl(infofile);
    for i= 1:20
       infostr=fgetl(infofile);
       TBS1052Binfo=[TBS1052Binfo; infostr];
    endfor
    fclose(infofile)
    sourcech=strsplit(TBS1052Binfo( 7,:),",")
    verut   =strsplit(TBS1052Binfo( 8,:),",")
    verscl  =strsplit(TBS1052Binfo( 9,:),",")
    veroff  =strsplit(TBS1052Binfo(10,:),",")
    horut   =strsplit(TBS1052Binfo(11,:),",")
    horscl  =strsplit(TBS1052Binfo(12,:),",")
    ptfmt   =strsplit(TBS1052Binfo(13,:),",")
    y0      =strsplit(TBS1052Binfo(14,:),",")
    prbatt  =strsplit(TBS1052Binfo(15,:),",")
    mdlnum  =strsplit(TBS1052Binfo(16,:),",")
    selnum  =strsplit(TBS1052Binfo(17,:),",")
    firmver =strsplit(TBS1052Binfo(18,:),",")

    source_ch       =sourcech{[2]}
    vertical_unit   =verut{[2]}
    vertical_scale  =verscl{[2]}
    vertical_offset =veroff{[2]}
    horizontal_unit =horut{[2]}
    horizontal_scale=horscl{[2]}
    pt_fmt          =ptfmt{[2]}
    yzero           =y0{[2]}
    probe_atten     =prbatt{[2]}
    model_num       =mdlnum{[2]}
    serial_num      =selnum{[2]}
    firmware_ver    =firmver{[2]}


# サンプリング数(Record Length) 2列の1行目
  num_of_smpl=TBS1052Bdata(1,2)
# サンプリング周期(Sample Interval) 2列の2行目
  smpl_period=TBS1052Bdata(2,2)
# サンプリング長
  smpl_len=TBS1052Bdata(1,2)*TBS1052Bdata(2,2)
# FFT
  FFTcomplex=fft( Timeseri(:,2))/num_of_smpl ;
# ゼロシフト(直流分を周波数範囲の中央にもってくる)
  ZsFFTcomplex=fftshift( FFTcomplex ) ;
# 周波数軸設定
  Ax_freq=linspace(-num_of_smpl/2/(smpl_period*num_of_smpl), (num_of_smpl/2-1)/(smpl_period*num_of_smpl), num_of_smpl);
# 周波数軸を含むFFT行列
  AxFFTcomplex=[Ax_freq.' ZsFFTcomplex];
# 等価振幅と位相のFFT行列
  AxFFTamph=[  AxFFTcomplex((num_of_smpl/2+1):num_of_smpl,1) abs( AxFFTcomplex((num_of_smpl/2+1):num_of_smpl,2))*2 angle( AxFFTcomplex((num_of_smpl/2+1):num_of_smpl,2))*360/(2*pi)];
  AxFFTamph(1,:)=[ AxFFTcomplex((num_of_smpl/2+1),1) abs( AxFFTcomplex((num_of_smpl/2+1),2)) angle( AxFFTcomplex((num_of_smpl/2+1),2))*360/(2*pi)];
# 最大値

  sorAxFFT=sort( AxFFTamph(:,2), "descend")
  indxsf = find( AxFFTamph(:,2) >= sorAxFFT(5) )
  max_list = AxFFTamph(indxsf,:)

# ピーク

  [pksam idxpk] = findpeaks(AxFFTamph(:,2));
  peak_list = [pksam idxpk]
  [peakls idxpks]  = sort( peak_list(:,1), "descend")
  peaksize=size(idxpks)

  for i=1:5
     if ( i <= peaksize(1) )
        peak_list5(i,:) = AxFFTamph(peak_list(idxpks(i),2),:)
     else
        peak_list5(i,:) =  [0.0 0.0 0.0]
     endif
  endfor

# グラフ

  figure('Position',[100,100,560,630])

  subplot(4,1,1)
  plot(Timeseri(:,1),Timeseri(:,2))
  axis([min(Timeseri(:,1)), max(Timeseri(:,1)), -max(abs(Timeseri(:,2)))*1.1, max(abs(Timeseri(:,2)))*1.1])
  title(filename)
  ylabel(strcat( 'amp ','[',vertical_unit,']'))
  xlabel(strcat( 'time ','[',horizontal_unit,']'))


  subplot(4,1,2)
  plot(AxFFTamph(:,1),AxFFTamph(:,2),AxFFTamph(idxpk,1),AxFFTamph(idxpk,2),'.m');
  ylabel( strcat( 'amp ','[',vertical_unit,']'))
  hx=xlabel( strcat( 'freq ','[1/',horizontal_unit,']'))
  axis([ min(AxFFTamph(:,1)), max(AxFFTamph(:,1))])

  ph=subplot(4,1,3)
  plot(AxFFTamph(:,1),AxFFTamph(:,3));
  set(ph,"ytick",[-180 -90 0 90 180])
  ylabel('phase [deg]')
  xlabel( strcat( 'freq ','[1/',horizontal_unit,']'))
  axis([ min(AxFFTamph(:,1)), max(AxFFTamph(:,1))   ,-180,180])
  #bottom_title(strcat( 'number of smple :',sprintf("%d",num_of_smpl)),'sampling period:',sprintf("%e ",smpl_period),"sec")

  subplot(4,1,4)
  plot(1)
  axis([0, 1, 0, 1])
  text( 0, 0.9, [model_num " " firmware_ver  " S/N " serial_num  ;"Record Length "  sprintf("%d [samples] %1.3e [sec] ",num_of_smpl,smpl_len) ; "Sample Interval "  sprintf("%1.3e [sec]",smpl_period)])
  #text( 0, 0.5, [model_num " " firmware_ver ; "S/N " serial_num ;"Record Length "  num_of_smpl " Sample Interval "  smpl_period])
  #xlabel( [model_num "  " firmware_ver ; serial_num] )
  #text( 0, 0.2, [ "freq           Amp            Pha"; sprintf("%1.4e  %1.4e  %1.4e", max_list(1,1), max_list(1,2), max_list(1,3)); sprintf("%1.4e  %1.4e  %1.4e", max_list(2,1), max_list(2,2), max_list(2,3)) ])
  text( 0, 0.1, [ "peak list" ; "freq          Amp           Pha"; sprintf("%1.4e  %1.4e  %3.3f", peak_list5(1,1), peak_list5(1,2) , peak_list5(1,3)); \
                                                                   sprintf("%1.4e  %1.4e  %3.3f", peak_list5(2,1), peak_list5(2,2) , peak_list5(2,3)); \
                                                                   sprintf("%1.4e  %1.4e  %3.3f", peak_list5(3,1), peak_list5(3,2) , peak_list5(3,3)); \
                                                                   sprintf("%1.4e  %1.4e  %3.3f", peak_list5(4,1), peak_list5(4,2) , peak_list5(4,3)); \
                                                                   sprintf("%1.4e  %1.4e  %3.3f", peak_list5(5,1), peak_list5(5,2) , peak_list5(5,3))])

  axis("off")

あとは窓関数の機能を盛り込めば 1ch の FFTアナライザとして一通りの機能をもったものになります。
ここまで来るとカーソルで値を読み取る機能も欲しいですが、
それはちょっとめんどくさそう・・・


前の10件 | -

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。