<?xml version="1.0" encoding="UTF-8" ?>
<rss version="0.91">
  <channel>
    <title>JQ2RVNの無線ブログ</title>
    <description>ようこそ！JQ2RVNのブログです。
PICを使っていろいろな物を作ろうと画策中です。</description>
    <link>https://jq2rvn.blog.shinobi.jp/</link>
    <language>ja</language>
    <copyright>Copyright (C) NINJATOOLS ALL RIGHTS RESERVED.</copyright>

    <item>
      <title>モービル　システム変更中</title>
      <description>夏の旅行に向けて、モービルのアンテナ系を変更してます。&lt;br /&gt;
ってか、いままで「無線全般」的なカテゴリー作ってなかったのね。&lt;br /&gt;
よくもまあ、パケット系のネタで続けたもんだわ・・・hihi&lt;br /&gt;
&lt;br /&gt;
まず、大きな変更点として・・・&lt;br /&gt;
な、なんとルーフキャリアをつけました！！&lt;br /&gt;
&lt;br /&gt;
これで大きなアンテナでも運用できるってもんよ(^^&lt;br /&gt;
&lt;br /&gt;
ってことで、HV5Sを取り付けてみました。&lt;br /&gt;
IC7000をもってながら、いままでHFとか活用してなかったもんなぁ～&lt;br /&gt;
&lt;br /&gt;
でも、ここで大問題！！&lt;br /&gt;
&lt;br /&gt;
SWRが下がらんって。。。OTL...&lt;br /&gt;
よりも深刻で、7MHzで送信しようとすると、IC7000の電源が落ちる&lt;br /&gt;
&lt;br /&gt;
ま、すったもんだの挙句、バッテリーからの配線の問題でした(^^;;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
IC-7000の電源ケーブルって、ブレード型のヒューズが付いてるんやけど、&lt;br /&gt;
長年の振動(2年くらい?)のおかげで接触が悪くなっていたみたいです。&lt;br /&gt;
&lt;br /&gt;
ちょこんと触ったら直ったので、根本的な解決はしてないけれど、&lt;br /&gt;
とりあえず、インシュロック使って、なるべく固定しておきました。&lt;br /&gt;
&lt;br /&gt;
なお、この電源ケーブルを使って、無線関連の機器をつなげてますが、&lt;br /&gt;
TT3の暴走現象(1秒おき位に送信しまくる)も、ここが原因と判明。&lt;br /&gt;
&lt;br /&gt;
出力を上げると症状が出るので、電波がまわりこんどるのかなとか&lt;br /&gt;
いろいろいたんですけれど、&lt;br /&gt;
もっと根本的なところでアウトだったわけです。&lt;br /&gt;
&lt;br /&gt;
今では20Wでビーコン出しても、全然OKになりました。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ってことは何か？四国一周の旅（2008年1月）の長時間走行で&lt;br /&gt;
電源ラインがやられたってことなのか・・・&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
なお、HV5Sはまだ調整中です。&lt;br /&gt;
7MHzはおおよそ見当がついてるけど、21MHｚと50MHｚがなんともはや・・・&lt;br /&gt;
どこに同調してるかまーったく見えない。&lt;br /&gt;
旅行までには何とかしたいですね。&lt;br /&gt;
&lt;br /&gt;
あーアンテナアナライザ。ほしくなってきた&lt;br /&gt;
&lt;br /&gt;
なお、基台系統は、HF40FXでSWRが下がったのでOKっぽいです。</description> 
      <link>https://jq2rvn.blog.shinobi.jp/%E7%84%A1%E7%B7%9A%E5%85%A8%E8%88%AC/%E3%83%A2%E3%83%BC%E3%83%93%E3%83%AB%E3%80%80%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%A4%89%E6%9B%B4%E4%B8%AD</link> 
    </item>
    <item>
      <title>要求仕様</title>
      <description>&lt;p&gt;dsPICのTNCのコーディングがおおよそ進んで&lt;br /&gt;
使用メモリーの量がおおよそ把握できてきましたから、&lt;br /&gt;
この辺で要求仕様の決定をしておきたいと思います。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
まずはKISS TNCの方&lt;br /&gt;
名称：dsKISS(仮)&lt;br /&gt;
&lt;br /&gt;
RF側・・・&lt;br /&gt;
受信は クワドラチャ検波(中心周波数1700Hz)&lt;br /&gt;
DDS発信(1200Hz/2200Hz）&lt;br /&gt;
上位プロトコル　AX25&lt;br /&gt;
&lt;br /&gt;
カッパーライン側(線でつながった方)・・・&lt;br /&gt;
UART&amp;nbsp;KISSプロトコル(コマンド番号上位4ビットでアドレス指定)&lt;br /&gt;
または&lt;br /&gt;
I2C KISS改プロトコル(I2Cでアドレス指定・コマンド番号は無視)&lt;br /&gt;
&lt;br /&gt;
アドレスは4ピン分つかって指定できるようにする&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
デジピータ・GPS制御の方&lt;br /&gt;
名称：Digi-On-KISS&lt;br /&gt;
&lt;br /&gt;
TNCとの通信方法：I2C / KISS&lt;br /&gt;
PC/GPSとの通信方法：UART&lt;br /&gt;
コントローラとの通信方法：UART&lt;br /&gt;
&lt;br /&gt;
機能　UIDIGI, Mic-E ,SmartBeaconなど&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
RMKS&lt;br /&gt;
なぜ、TNCでI2Cをサポートするか・・・&lt;br /&gt;
PIC24にはUARTは2chしかない。&lt;br /&gt;
よって、I2Cを使いたいところだけれども、通信距離を考えると&lt;br /&gt;
TNCとの通信でI2Cを使うのがよいと思われるので。&lt;br /&gt;
&lt;br /&gt;
または、コントローラとの通信をソフトウェアで行って&lt;br /&gt;
TNCとの通信をUARTにすることも考慮。&lt;br /&gt;
&lt;br /&gt;
コントローラを使うタイプと、使わないタイプで排他的にして&lt;br /&gt;
ファームウェアの書き換えで対応する方法も可能&lt;br /&gt;
(既存のTNCを利用して、デジができる）&lt;/p&gt;</description> 
      <link>https://jq2rvn.blog.shinobi.jp/%E6%96%B0%E5%9E%8Btnc/%E8%A6%81%E6%B1%82%E4%BB%95%E6%A7%98</link> 
    </item>
    <item>
      <title>KISSプロトコルとは・・・</title>
      <description>KISSプロトコル。&lt;br /&gt;
&lt;br /&gt;
少し前に発売されたTinyTrak4でもファームの入れ替えで&lt;br /&gt;
KISSプロトコルがサポートされるようになってます。&lt;br /&gt;
&lt;br /&gt;
dsPICでTNCを作るとして、その出力をどうするか？&lt;br /&gt;
つまりデータリンク層のプロトコルを何にするかって考えたとき、&lt;br /&gt;
やはり既存のものと共通化しておくべきだでしょう。&lt;br /&gt;
&lt;br /&gt;
ならば、もっともシンプルなものになると思うので&lt;br /&gt;
KISSプロトコルってことになるかな～って&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
実際にTNCをKISSモードにして確認したり、&lt;br /&gt;
Web上のドキュメントをみたりして調べた結果、&lt;br /&gt;
次のようなことがわかった。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
データは0xC0で挟まれて流れてくる。&lt;br /&gt;
AX.25の0x7eに相当するものと考えて差し支えなし。&lt;br /&gt;
&lt;br /&gt;
0xC0の次には、送信先(送信元も?)+コマンドが流れてくる。&lt;br /&gt;
これによって複数のTNCを区別したり、&lt;br /&gt;
TX DelayをKISS上から設定できたりするようだ。&lt;br /&gt;
基本は0x00で送られてくるっぽい。&lt;br /&gt;
&lt;br /&gt;
そのあとに実際のデータが続く。&lt;br /&gt;
ただし、受信したデータがズラズラそのまんま。&lt;br /&gt;
つまり、アドレス(コールサインやらデジパスやら)のところも、&lt;br /&gt;
AX.25の規約のとおり、順番やら1ビットシフトも変えずに送られてくる。&lt;br /&gt;
(e.g.) アドレスの場合'J'=0x4a は 1ビット左シフトされた0x94で流れてくる。&lt;br /&gt;
&lt;br /&gt;
CRCチェックはTNC側のお仕事。&lt;br /&gt;
受信した限りでは、CRCは付加されてこなかった。&lt;br /&gt;
Webドキュメントでは、CRC付きのものも解説されていたけれど、その区別は不明(要調査)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以上より、仕事の分担がわかりましたし、&lt;br /&gt;
非常にシンプルなフローでTNCを作れそうです。&lt;br /&gt;
したがって、これに沿ってTNCを製作していくつもりです</description> 
      <link>https://jq2rvn.blog.shinobi.jp/%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E9%80%9A%E4%BF%A1/kiss%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%A8%E3%81%AF%E3%83%BB%E3%83%BB%E3%83%BB</link> 
    </item>
    <item>
      <title>CRCの計算アルゴリズム</title>
      <description>&lt;p&gt;PICTNCのソースから、CRCアルゴリズムを解析しました。&lt;br /&gt;
わかりやすくするために16ビットの数値を8ビットで計算しているところなどは省略します。&lt;br /&gt;
&lt;br /&gt;
以下、変数・定数&lt;br /&gt;
data: 受信 or 送信するデータ(8ビット)&lt;br /&gt;
CRC: CRCの値を格納(16ビット)&lt;br /&gt;
Poly: 生成多項式(16ビット定数)&lt;br /&gt;
&lt;br /&gt;
PolyはAX.25では0x8408&lt;br /&gt;
CRCは計算前に0xFFFFで初期化します。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dataを右へ1ビットシフトします。このとき最下位のビットがCビットに出ます。&lt;br /&gt;
&amp;darr;&lt;br /&gt;
C=1ならば、CRC xor 0x0001 -&amp;gt; CRC&lt;br /&gt;
&amp;darr;&lt;br /&gt;
CRCを右1ビットシフト。同様に最下位ビットがCビットに出ます。&lt;br /&gt;
&amp;darr;&lt;br /&gt;
C=0ならば、計算終了&lt;br /&gt;
C=1ならば、CRC xor Poly&amp;nbsp; -&amp;gt; CRC&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以上で計算は終了です。&lt;br /&gt;
アセンブラならおよそ10サイクルくらいで計算できると思います&lt;/p&gt;</description> 
      <link>https://jq2rvn.blog.shinobi.jp/pictnc/crc%E3%81%AE%E8%A8%88%E7%AE%97%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0</link> 
    </item>
    <item>
      <title>クワドラチャ検波？</title>
      <description>&lt;p&gt;FM無線機のカタログなどで、よくクワドラチャ検波という言葉を見る。&lt;br /&gt;
パケット通信なんかで使っているFSKも、一種のFMなわけで&lt;br /&gt;
ならばこの方法が使えるのではないかと。。。&lt;br /&gt;
&lt;br /&gt;
調べてみると、&lt;br /&gt;
90度位相をずらした信号を掛け合わせる&lt;br /&gt;
らしい・・・&lt;br /&gt;
&lt;br /&gt;
なんともわかりずらい表現だなぁ～&lt;br /&gt;
&lt;br /&gt;
大体、単に90度位相がずれたと書いてあるけれど、&lt;br /&gt;
何に対して90度なのか？何をずらすのか？がわからん。&lt;br /&gt;
&lt;br /&gt;
ということで、FM検波用のICのデータシートを見てみた。&lt;br /&gt;
これがクワドラチャ検波なのか？と言われれば自信はない。&lt;br /&gt;
けど、うまくいったので使ってみようかと思います&lt;br /&gt;
&lt;br /&gt;
やった方法は、入力信号をf(t)とし、中心周波数の周期をTcとすると&lt;br /&gt;
f( t ) * f( t - Tc/4 )を求めるということのようだ。&lt;br /&gt;
&lt;br /&gt;
数学的な意味は・・・&lt;br /&gt;
f( t ) = sin ( &amp;omega;t )とすると&lt;br /&gt;
f( t ) * f( t - Tc/4 ) = sin( &amp;omega;t ) * sin ( &amp;omega;(t - Tc/4 ))&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
ここで三角関数の積和の公式を利用すると、&lt;br /&gt;
1/2 ( cos A+B ) - 1/2 (cos A-B)&lt;br /&gt;
つまり、周波数2倍の波と、周波数0の波(つまり直流)が出てくる。&lt;br /&gt;
&lt;br /&gt;
ここでLPFで2倍の信号をカットすると、直流のみがでてくる。&lt;br /&gt;
&lt;br /&gt;
さて、その直流の値は・・・&lt;br /&gt;
cos( A-B ) = cos ( &amp;omega;*Tc/4 )&lt;br /&gt;
&lt;br /&gt;
ここで、&amp;omega; = 2&amp;pi;f , Tc = 1 / fcだから、&lt;br /&gt;
=&amp;gt; cos ( &amp;pi; / 2&amp;nbsp;* f / fc )&lt;br /&gt;
&lt;br /&gt;
もし、f = fcならば、cos( &amp;pi;/2 ) = 0&lt;br /&gt;
f &amp;lt; fc ならば、cos( ) &amp;gt; 0　　　　　(第Ⅰ象限)&lt;br /&gt;
2fc&amp;nbsp;&amp;gt; f&amp;nbsp;&amp;gt;&amp;nbsp;fc ならば&amp;nbsp;cos( )&amp;lt;0　　(第Ⅱ象限)&lt;br /&gt;
となる。&lt;br /&gt;
&lt;br /&gt;
つまり、Bell202の場合だと中心周波数は1700Hz&lt;br /&gt;
スペース(1200Hz)が入力されているときは正。&lt;br /&gt;
マーク(2200Hz)が入力されているときは負。&lt;br /&gt;
となる。&lt;br /&gt;
&lt;br /&gt;
MPLAB SIMで、シミュレートしてみた。&lt;br /&gt;
スペース1回&amp;rarr;マーク1回&amp;rarr;スペース2回&amp;rarr;マーク2回の繰り返しです。&lt;br /&gt;
結果はdsPICworksで出しました。&lt;br /&gt;
&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://file.jq2rvn.blog.shinobi.jp/45223bfc.jpg&quot;&gt;&lt;img alt=&quot;45223bfc.jpg&quot; border=&quot;0&quot; src=&quot;http://file.jq2rvn.blog.shinobi.jp/Img/1215862994/&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
簡単な移動平均フィルタで取り除いただけなので、高調波が出ています。&lt;br /&gt;
定常な状態なら、高調波は減衰しているのでゼロクロスできません。&lt;br /&gt;
遷移状態のとき、高調波はゼロクロスしてくる可能性はありますが、&lt;br /&gt;
チャタリング対策のときと同じように何回かチェックすればいいと思います&lt;br /&gt;
&lt;/p&gt;</description> 
      <link>https://jq2rvn.blog.shinobi.jp/%E6%96%B0%E5%9E%8Btnc/%E3%82%AF%E3%83%AF%E3%83%89%E3%83%A9%E3%83%81%E3%83%A3%E6%A4%9C%E6%B3%A2%EF%BC%9F</link> 
    </item>
    <item>
      <title>A/D変換でハマる</title>
      <description>dsPICでADCのコーディングをしてて、ドつぼにはまった。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dsPICは結果を保存するバッファが16ある。&lt;br /&gt;
自動的に複数のチャンネルをスキャンしたり、&lt;br /&gt;
一定時間ごとに何点かの値が取得できて便利なんだけど・・・&lt;br /&gt;
データの入り方でハマった。&lt;br /&gt;
&lt;br /&gt;
今回は4つサンプルを採って、それをFIR &amp;amp; Decimationしようとしていた。&lt;br /&gt;
ここで何も考えず、InputSignal[i]=ReadADC12(i);としてしまった。&lt;br /&gt;
FIRDecimate()関数に渡す配列は、添え字が大きい方が古いデータとなる。&lt;br /&gt;
つまり、InputSign[0]が最新で、InputSign[3]が最古である。&lt;br /&gt;
しかし、ADCのバッファは、ADCBUF0が最古でADCBUF3が最新。&lt;br /&gt;
&lt;br /&gt;
したがって、上のように配列に転送すると、新旧が逆転する。&lt;br /&gt;
これじゃ、正常にデータが出てくるわけがない！&lt;br /&gt;
&lt;br /&gt;
結局Cで作っても良かったが、アセンブラを組んで新旧がそろうようにした。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
次のハマり。&lt;br /&gt;
MPLAB SIMで、ADCの入力をシミュレートしていた時の話・・・&lt;br /&gt;
Excelでデータを作ったが、ここが曲者である。&lt;br /&gt;
&lt;br /&gt;
DSPとの親和性を考え、ADCの数値は固定小数点で入るように設定した。&lt;br /&gt;
そして、単純にExcelでも固定小数点に変換して出力した。&lt;br /&gt;
しかし、Excelから出した値と、ADCのバッファに入っている値が違っている。&lt;br /&gt;
&lt;br /&gt;
ということで、気がついた。&lt;br /&gt;
入力する値は、ADCモジュールそのものが得た値でなければならないことを。&lt;br /&gt;
&lt;br /&gt;
ADCが12ビットの場合、次のような流れで処理される。&lt;br /&gt;
&lt;br /&gt;
ADCモジュール &amp;rarr;4ビット左シフト &amp;rarr;&amp;nbsp;+0x8000 &amp;rarr; ADCBUFｘ&lt;br /&gt;
&lt;br /&gt;
たとえば、モジュールから1が出力されたら、&lt;br /&gt;
0x0001 &amp;rarr; 0x0010 &amp;rarr; 0x8010 と変換される。&lt;br /&gt;
&lt;br /&gt;
なので用意するデータは・・・&lt;br /&gt;
=INT(2048*x+2048)&lt;br /&gt;
とExcelで行っておくだけでよい。</description> 
      <link>https://jq2rvn.blog.shinobi.jp/pic%20tips/a-d%E5%A4%89%E6%8F%9B%E3%81%A7%E3%83%8F%E3%83%9E%E3%82%8B</link> 
    </item>
    <item>
      <title>うまくいかなかったOTL...</title>
      <description>&lt;p&gt;DSPフィルタで信号の分離。&lt;br /&gt;
うまくいかなかった。。。。&lt;br /&gt;
&lt;br /&gt;
連続信号ならうまくいくけど、&lt;br /&gt;
単発の信号だとフィルタをきれいに通ってくれない。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ということで、別方法で。&lt;br /&gt;
遅延検波というのがあるようです。&lt;br /&gt;
&lt;br /&gt;
入ってきた信号と、180&amp;deg;だけ位相のずれた信号と掛け合わせる。&lt;br /&gt;
それを平均して、符号を調べると、その時のトーンがわかる。&lt;br /&gt;
&lt;br /&gt;
Excelでシミュレートした限りではうまくいったので&lt;br /&gt;
これでやってみようかと思案中でございます&lt;/p&gt;</description> 
      <link>https://jq2rvn.blog.shinobi.jp/dsp%E9%96%A2%E9%80%A3/%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9Fotl...</link> 
    </item>
    <item>
      <title>dsPIC Filter Design Tool導入</title>
      <description>フィルタの設計は面倒な計算とかもあるので、&lt;br /&gt;
Microchip社製の&lt;strong&gt;dsPIC Filter&lt;/strong&gt; Design Toolを購入しました。&lt;br /&gt;
&lt;br /&gt;
かなり簡単な操作でフィルタの設計ができます。&lt;br /&gt;
しかも、そのままC30で利用できる形でエクスポート可能。&lt;br /&gt;
&lt;br /&gt;
ただし、購入したのはLite版なので、FIRでは64タップ&lt;br /&gt;
IIRでは4セクションまでと制限があります。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://file.jq2rvn.blog.shinobi.jp/dsPICFD.gif&quot;&gt;&lt;img alt=&quot;dsPICFD&quot; border=&quot;0&quot; src=&quot;http://file.jq2rvn.blog.shinobi.jp/Img/1214649907/&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
上記のスクリーンショットは、&lt;br /&gt;
60kHzサンプリング&lt;br /&gt;
パスバンドが2400Hz、ストップバンドが6000Hz&lt;br /&gt;
通過帯リップル1db&lt;br /&gt;
阻止帯が-40dbというローパスフィルタです。&lt;br /&gt;
窓関数は方形。&lt;br /&gt;
&lt;br /&gt;
上記の6つのパラメータを入力すれば、&lt;br /&gt;
タップ数も自動的に見積もってくれて、係数を計算できます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ただし、64タップと少ないので、&lt;br /&gt;
いまいちキレるフィルタが作れないのが難点。&lt;br /&gt;
&lt;br /&gt;
その辺はほかのツールで作っておいて、&lt;br /&gt;
ひな形だけFDに任せるのもいいかもしれません</description> 
      <link>https://jq2rvn.blog.shinobi.jp/dsp%E9%96%A2%E9%80%A3/dspic%20filter%20design%20tool%E5%B0%8E%E5%85%A5</link> 
    </item>
    <item>
      <title>FIRDecimate()関数 - dsPIC</title>
      <description>MPLAB C30 の DSPライブラリについて・・・&lt;br /&gt;
あまり掲載記事のないFIRDecimate()関数の解析。&lt;br /&gt;
&lt;br /&gt;
まずはデータシートの要約。&lt;br /&gt;
&lt;br /&gt;
FIRDecimate()関数は、&lt;br /&gt;
&lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;サンプルされた値をフィルタしたのちR:1の割合で間引く関数。&lt;/font&gt;&lt;br /&gt;
&lt;/strong&gt;オーバーサンプリングしたのち、LPFを通して間引きする時に有用。&lt;br /&gt;
&lt;br /&gt;
プロトタイプは、&lt;br /&gt;
extern fractional* FIRDecimate (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int numSamps,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fractional* dstSamps,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; fractional* srcSamps,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FIRStruct* filter,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int rate&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
numSampsはサンプル数だけれども、この場合は&lt;strong&gt;&lt;u&gt;出力の個数&lt;/u&gt;&lt;/strong&gt;。&lt;br /&gt;
また、rateは間引き率。&lt;br /&gt;
&lt;br /&gt;
(e.g.) 5つのサンプルを入力し、1つの出力をする場合。&lt;br /&gt;
numSamps=1, rate=5&lt;br /&gt;
と指定する。&lt;br /&gt;
さらにこの場合、srcSampsは5要素、dstSampsは1要素の配列とする。&lt;br /&gt;
&lt;br /&gt;
(e.g.)10のサンプルを入力して、2つの出力をする場合。&lt;br /&gt;
numSamps=2, rate=5&lt;br /&gt;
secSampsは10要素、dstSampsは2要素の配列。&lt;br /&gt;
&lt;br /&gt;
注意点：&lt;br /&gt;
フィルタのタップ数Mは、&lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;rateの整数倍&lt;/font&gt;&lt;/strong&gt;でなければいけない。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
次に、ソースの解析結果よりわかったこと。(firdecim.s)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;遅延配列の値は移動させることによって最新値と書き換えている。&lt;br /&gt;
&lt;/font&gt;&lt;/strong&gt;遅延配列をd[ ]とすると、MAC計算(畳み込み)前に、&lt;br /&gt;
d[ R+1 ] &amp;lt;- d[ 0 ]&lt;br /&gt;
d[ R+2 ] &amp;lt;- d[ 1 ]&lt;br /&gt;
.....&lt;br /&gt;
d[ M ] &amp;lt;- d[ M-R-1 ]&lt;br /&gt;
という風に、R+1個分大きな処に値をコピーする。&lt;br /&gt;
その上で、d[ 0 ] &amp;lt;- x[ 0 ] .... d[ R] &amp;lt;- x[R]と、コピーをする。&lt;br /&gt;
&lt;br /&gt;
つまり通常のFIR()関数のように、FIRStruct構造体のdelayメンバを使った&lt;br /&gt;
&lt;strong&gt;モジュロアドレッシングによる計算をしていない&lt;/strong&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
したがって注意すべきことは、&lt;br /&gt;
&lt;strong&gt;&lt;font color=&quot;#ff0000&quot;&gt;FIR()関数とFIRDecimate()関数を切り替えて使えない&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;
ということ。&lt;br /&gt;
&lt;br /&gt;
FIR()で計算したときはd[ firStruct.delay ]からサンプルを入れるけどをするけれど、&lt;br /&gt;
FIRDecimate()のときはd[ 0 ]からサンプルを入れる。&lt;br /&gt;
また、畳み込みの計算開始位置も違う。&lt;br /&gt;
結果、計算がおかしくなってしまう。&lt;br /&gt;
&lt;br /&gt;
この「切り替える」というのは1つのFIRStruct構造体に対してであって、&lt;br /&gt;
2つの構造体を、一方はFIR()で、一方はFIRDecimate()で、&lt;br /&gt;
という使い方をしても、問題はない。&lt;br /&gt;
&lt;br /&gt;
普通は1つを切り替えるということはしないだろうから、&lt;br /&gt;
気にする必要はないと思われる。</description> 
      <link>https://jq2rvn.blog.shinobi.jp/dsp%E9%96%A2%E9%80%A3/firdecimate--%E9%96%A2%E6%95%B0%20-%20dspic</link> 
    </item>
    <item>
      <title>FIRの使い方 - MPLAB C30</title>
      <description>&lt;p dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;ただいま、MPLAB C30で、フィルタ作りに格闘中です。&lt;br /&gt;
&lt;br /&gt;
大まかな流れは以下のとおり&lt;br /&gt;
&lt;br /&gt;
FIR用構造体を作成&lt;br /&gt;
&amp;darr;&lt;br /&gt;
FIR構造体の初期化&lt;br /&gt;
&amp;darr;&lt;br /&gt;
FIRの実行&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
上2つは、書籍やホームページを参照しておけばOKだと思う。&lt;br /&gt;
&lt;br /&gt;
最後のFIRの実行は、そのまんまの名前のFIR()関数を使用する。&lt;br /&gt;
FIR( numSamp , &amp;amp;outSamp , &amp;amp;inSamp , &amp;amp;Filter )&lt;br /&gt;
という形式。&lt;br /&gt;
&lt;br /&gt;
ここで、numSampはサンプリングされた値の個数。&lt;br /&gt;
多くの場合は1でよいと思う。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
inSampがサンプリングされた値。&lt;br /&gt;
FIR()関数が呼び出されると、遅延配列の最古の値がinSampで書き換えられる。&lt;br /&gt;
&lt;br /&gt;
もしタップ数が5つだったとしたら&lt;br /&gt;
5 4 3 2 1&lt;br /&gt;
&amp;darr;&lt;br /&gt;
4 3 2 1 inSamp&lt;br /&gt;
というように書き換えられる。&lt;br /&gt;
&lt;br /&gt;
その上で、畳み込み計算がおこなわれて、結果がoutSampに出てくる。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
遅延配列の書き換えは、dsPICの場合便利にできていて、&lt;br /&gt;
たとえば0から4の5つの番地に書き込もうとするとき、&lt;br /&gt;
dsPICに0と4を登録しておく。&lt;br /&gt;
そうすると、ポインタをインクリメントしていくと&lt;br /&gt;
通常だと、0 1 2 3 4 5 ・・・となるが、&lt;br /&gt;
dsPICだと、0 1 2 3 4 0 1 2・・・と自動的にポインタが戻ってくれる。&lt;br /&gt;
&lt;br /&gt;
これを登録するのは、FIRStruct構造体に仕込まれていて&lt;br /&gt;
coeffsBase , coeffsEnd , delayBase , delayEnd&lt;br /&gt;
の4つの値になる。&lt;br /&gt;
(係数配列の先頭と終端、遅延配列の先頭と終端）&lt;br /&gt;
&lt;br /&gt;
この機能があるおかげで、dsPICでの畳み込みは&lt;br /&gt;
REPEAT + MAC命令で、単純&amp;amp;高速にできる。&lt;br /&gt;
(レジスタはXMODSTAT , XMODEND , Y～～)&lt;br /&gt;
&lt;br /&gt;
逆にいえば、これがなかったらPIC24と同じだなｗ&lt;br /&gt;
(ホントは40bitアキュムレータとか、ビット順序逆転とかもあるけど・・・）&lt;/p&gt;</description> 
      <link>https://jq2rvn.blog.shinobi.jp/dsp%E9%96%A2%E9%80%A3/fir%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%20-%20mplab%20c30</link> 
    </item>

  </channel>
</rss>