AF PSN

PSN方式でSSBを発生させるためのAF PSNを試作した.01
PSN方式のSSBジェネレータは上図のような構成であるが,大概AF PSNの実現がネックとなる.

アナログ回路でAF PSNを実現する方法としては,ナガード型PSN,多段のオールパスフィルタ,PPSNなどが知られている.
これらは,性能が十分でなかったり,回路規模が大きい,部品定数の精度が要求される,など少々難しいところがあり,さらにアナログであるが故,環境(周囲温度など)の変化による特性の変化にも気を付ける必要がある.

そこで今回はAF PSN をディジタル信号処理で実現することにした.これは近年よく見かけるSDRと同様なものである.

まず,SSBの発生方法から確認していく.SSBの生成方法はシンプルに考えれば下図のとおりである.
02
周波数シフトは,AF PSNの後の直交変調器で行われるので,
結局AF PSNとは,AF信号の負(あるいは正)の周波数成分を除去するものである.

ならばバンドパスフィルタ(BPF)で実現できそうだが,フィルタの周波数特性は,下図の上段に示すように,正の周波数領域と負の領域で対称なものしか実現できない(実係数フィルタの場合).

03

しかしながら,フィルタの係数を複素数にすれば(複素係数フィルタ),上図下段に示すような非対称な周波数特性をもったフィルタが実現できる.

複素係数フィルタを用い,信号を複素数表現すれば,SSB生成の流れは下図のようになる.
04

今回はこの複素係数フィルタを,dsPIC33FJ64GP802 を用いディジタル信号処理で実現してみた.下図のように,複素係数フィルタの出力の実部がAF PSNの0°出力,虚部が90° 出力に相当する.
05

 

複素係数フィルタの構成は,512Tap FIR フィルタとした.
06

 

フィルタの周波数特性(設計目標)は下図のとおり.
+300Hz~+3kHzのバンドパスで,負の領域はすべて阻止する.
Fres_cmplx

 

これを逆フーリエ変換し,FIRフィルタの係数を求めた.
サンプリング周波数は,使用するdsPICの性能により 約10kHz に設定した.

フィルタ係数(実部:R0 – R511)
FirCoeff_re

フィルタ係数(虚部:Q0 – Q511)FirCoeff_im

複素係数フィルタのプログラムのソースコード  Source  code

dsPIC周辺の接続は下図のとおり.07

 

動作確認の結果を以下にまとめておく.

20180706_071500 dsPIC

入力200Hz
f0200

入力300Hz
f0300

入力1000Hz
f1000

入力2000Hz
f2000

入力2900Hz
f2900.jpg

入力3000Hz
f3000

これらの結果を見る限りは使い物になりそうな感じがする.
部品選別や調整などなしに,プログラムを書き込みさえすればこれと全く同じ結果が得られる.
あとは実際にSSBジェネレータにしたときにどのような品質の信号になるか,確認が必要だろう.

AF PSN」への20件のフィードバック

  1. 西野 和幸 2018年8月23日 / 7:54 午後

    初めまして、西野と申します。
    素晴らしい実験をされているなと思い、自分なりに
    再現しようと、ソースファイルをダウンロードして
    XC16 ver1.26でコンパイルしましたが、以下のエラーが出て解決できません。
    build/default/production/main.o(.text+0x10e): In function `__DAC1LInterrupt’:
    : undefined reference to `_VectorDotProduct’
    build/default/production/main.o(.text+0x122): In function `__DAC1LInterrupt’:
    : undefined reference to `_VectorDotProduct’
    アドバイスをいただけると助かります。
    よろしくお願いいたします。

    いいね

  2. uebo 2018年8月24日 / 12:20 午前

    西野様,初めまして.
    ご興味を持っていただきましてありがとうございます.

    リンク時に VectorDotProduct という関数が見つからないようなので,
    この関数を含むライブラリがリンクできていないのだと思います.

    プロジェクトに,ライブラリ libdsp-elf.a を追加してください.
    XC16をデフォルトでインストールされているのでしたら,
    c:/Program Files (x86)/Microchip/xc16/v1.26/lib/ の中にあると思います.

    いいね

  3. 西野 和幸 2018年8月24日 / 6:23 午前

    アドバイスありがとうございました。

    プロジェクトにライブラリを追加しましたら、問題なくビルドできました。
    注文中のICチップが届きましたらインストールして試験してみます。

    ところで、このAF-PSNと入出力が逆の動作で I(0°),Q(90°) ⇒ AFの
    実験はされましたか?

    複数のCRを並べることなく、dsPICの処理で、スタンドアロンな
    トランシーバを簡単に実現出来ないものか考えています。

    FPGAで実現している方もおりますが、ハードルが高いので
    私にとっては、単独動作のこちらの方法の方が魅力を感じます。

    今後ともよろしくお願いいたします。

    いいね

  4. uebo 2018年8月26日 / 11:40 午後

    逆動作ですが,このPICでは少々工夫が必要かと判断しており思案中です.

    課題は,

    1.受信信号はダイナミックレンジが広く,12bitAD変換では実用上bit数が不足かもしれない
    2.AD(12bit時)のサンプルホールドが1個なので,IQ同時変換ができない(位相がずれる)

    2はFIRフィルタの係数を,位相シフト分も含めたものにすればよいのですが,
    1は難題です.
    AGCを掛ければよいのでしょうが,過渡的にも全く同じ動作をする2つ(IQ)のAGC回路を
    実現するのはほぼ無理でしょう.
    別に24bit等のAD変換器を付ければよいのですが.

    このPIC単体で受信処理するには,PSN方式でない方がよいかもしれません.

    いいね

  5. 西野 和幸 2018年8月27日 / 10:53 午後

    コメントありがとうございました。

    勉強不足なのでdsPIC33Fの仕様を調べていたのですが、

    ① 10 ビットADC コンフィグレーションでは、
      最大で4 つのサンプル/ ホールド チャンネル(CH0~ CH3) を使用できる。

    ② 12 ビットADC コンフィグレーションでは、
      1 つのサンプル/ホールド チャンネル(CH0)しか使用できない。

    課題 1
    SDRの用途で、ダイレクトスイッチングによりIQを同時に取り込むには、12ビットでは
    ダイナミックレンジの点で、もの足りないのは同感です。
    これを考慮しようとすると16~24ビットの外付けADCが必要となりますね。

    dsPIC33Fの1チップでこの動作を実現できるのは、課題1と2の両方を妥協しないと不可能。

    ダイナミックレンジは60dB程度で妥協し、ADCは10ビットの2CH同時入力の設定なら
    可能ということでしょうか。

    SDRではなく、従来方式受信機でAGCの機能があるIF出力をスイッチングでIQを取り出し
    その後 dsPIC33Fで処理する程度なら十分実用になりそうに思います。

    ちなみに、従来の短波帯受信機では、フェージング対策のため、かなり高利得の回路をAGCで
    制御しているためS/Nは60dB以上確保するのはかなり難しかったです。

    最近は、関心が薄れていますが、AMモードの受信で、LSB側或いはUSB側の混信を避ける
    ために、同期検波とdsPICのAF-PSNを使用することで従来簡単に製作できなかった
    側波帯切替が、容易に実現可能になりそうです。

    理想から乖離し、妥協の産物になるかもしれませんが、1チップのdsPICで復調用の
    AF-PSNが構成できるという検証になると思います。

    いいね

  6. 財部 健(たからべ けん) 2018年11月23日 / 4:15 午後

    はじめまして TAKAKENと申します。dsPICを用いたAF-PSNは素晴らしいですね。
    早速 追試させていただきました。 

    結果、目的の入力周波数ではうまく出力され、フィルタの切れ味も素晴らしいものでした。 
    調子に乗ってオシロで出力を見ながらどんどん入力周波数を高くしていくと7~8Khz位で出力に2~3Khz台の信号が観測され、以降入力周波数を上げていくと周期的に同じような信号が観測されました。入力電圧とこの信号電圧は比例していてどこかで飽和したり歪んで発生したようではないみたいです。

    これはいわゆるエイリアシング(あるいはその手のもの?)なのでしょうか?
    それとも私が何かどこかでとんでもない間違いをしているのでしょうか?

    エイリアジングなら”安心して?”入力段のオペアンプをLPF特性にすればすむだけ・・・
    要はヤバイ周波数は入力せず前段でカットしてしまう、、、と思っているのですが、、、、
    ご教授いただけたら幸い、、お願いいたします。      還暦浅学爺

    いいね

  7. 財部 健(たからべ けん) 2018年11月26日 / 11:14 午前

    TAKAKENです。  自己レスで大変恐縮ですが、貴説明文を見返していたら、

    ”これを逆フーリエ変換し,FIRフィルタの係数を求めた.
    サンプリング周波数は,使用するdsPICの性能により 約10kHz に設定した.”

    とありました。いかに浅学な私でもサンプリング定義を持ち出すまでもなく、
    サンプリングの半分の約5KHz以上の入力はエイリアジング発生、、、と理解できました。

    お騒がせして申し訳ありません。
    これで”安心して”前段LPFで切ります。 爺のだみ声では不要、、とも思いますが、
    マア精神衛生上の観点から切っときます。
                                   還暦浅学爺

    いいね

  8. 阪部 武彦 2018年12月28日 / 2:25 午後

    西野様、初めまして、アナログのAFPSNを使ってSSBを運用しているものです。PCに頼らずにDSPICでワンチップでAFPSNに興味をもっております。ただしPICは初めてですが、コンパイラーの処理まではXC16ではどうにかできるようになりましたが、H filter.hが無い旨のエラーメッセージで止まております。H filter.hをHerder filesに入れておりますが、main.c:18:22: fatal error: H_filter.h: No such file or directoryから前に進みません。簡単なビギナーの質問で非常にお恥ずかしい限りですが、どうかアドバイス宜しくお願い致します。

    いいね

  9. 阪部 武彦 2018年12月29日 / 7:36 午後

    上保様、初めまして、阪部と申します。前回はH filter.hの関係で苦労しましたが、旧知の西野様からのアドバイスで本件は乗り越えましたが、DACの関係するところ全部がerrorになってしまいました。下記の如くなerrorレポートです。
    bproject/main.c:103:5: error: ‘DAC1STATbits’ undeclared (first use in this function)
    nbproject/main.c:103:5: note: each undeclared identifier is reported only once for each function it appears in
    nbproject/main.c:107:5: error: ‘DAC1CONbits’ undeclared (first use in this function)
    nbproject/main.c:109:5: error: ‘DAC1DFLT’ undeclared (first use in this function)
    nbproject/main.c:110:5: error: ‘DAC1LDAT’ undeclared (first use in this function)
    nbproject/main.c:111:5: error: ‘DAC1RDAT’ undeclared (first use in this function)
    nbproject/main.c:113:13: error: ‘IFS4BITS’ has no member named ‘DAC1LIF’
    nbproject/main.c:114:13: error: ‘IFS4BITS’ has no member named ‘DAC1RIF’
    nbproject/main.c:115:13: error: ‘IEC4BITS’ has no member named ‘DAC1LIE’
    nbproject/main.c:116:13: error: ‘IEC4BITS’ has no member named                                        の如くこのトラブルから抜けることができません。
    西野様へのアドバイスにありましたlibdsp-elf.aの関係を処置しましても、改善されませんでした。改善策ありましたら、アドバイス宜しくお願い致します。
                                     相模原市 阪部

    いいね

  10. 上保 2019年1月2日 / 5:19 午後

    阪部様

    こちらで不具合を再現できないので予想になりますが,
    開発環境の設定の問題と思われます.
    プロジェクトを新たに作り直すとよいかもしれません.

    上保

    いいね

  11. 阪部 武彦 2019年1月4日 / 10:14 午前

    上保様、阪部です。アドバイス有難うございます。プロジェクトを再度構築いたします。有難うございました。

    阪部

    いいね

  12. 阪部 武彦 2019年1月6日 / 8:38 午後

    上保様、阪部です。プロジェクトの再構築と、西野さんへのアドバイスlibdsp-elf.aをプロジェクトのライブラリーへの追加で問題なくコンパイラー出来ました。アドバイス有難うございました。

    いいね

  13. ピンバック: SSBジェネレータAF PSN
  14. Engin Turan 2023年3月29日 / 7:41 午前

    Hello sir, your nice project AFPSN TX Compiled problem .this file Calc_Coeff_of_CPLXBPF.m where add,example Library,source,linker etc. etc .
    I couldn’t find where to add this file. I extracted HEX file without this file, but I don’t know if it will work correctly, help please love 73.

    いいね: 1人

  15. uebo 2023年3月29日 / 5:58 午後

    Calc_Coeff_of_CPLXBPF.m is a script that runs on GNU Octave and generates H_filter.h. So Calc_Coeff_of_CPLXBPF.m is not needed for generating HEX file.

    いいね

  16. Engin Turan 2023年3月30日 / 6:17 午前

    Thank you very much for your return, I’m a fan.

    いいね

コメントを残す