JA7TDO 三浦さんが配布されているソフトウェアラジオのキットsoft66を組み立てました。実はもう、しばらく前(確か5月)に送っていただいたのですが、ちょうど色々と忙しく半田ごてを握る時間が取れませんでした。やっと昨日組み立てて、簡単な動作チェックをしたところです。なんとなく夏休みの宿題を一つ終わらせたようなそんな感じがしています。これからもう少し詳しく動作の様子を調べていこうと思っております。
2000年頃に、サウンドカードを使ってSSBの変復調ができるのではないかと思って実験をしていたのですが、その後あまり進展もなく、実際にそのプログラムを使ってオンエアしたりすることもありませんでした。それが、昨年の夏頃からまたぼちぼち電波を出すようになって、ローカル局の方などからレポートをいただきながら、少しずつプログラムや設備に手を入れてきました。以前のものと核となる部分ではほとんど違いはないのですが、ここら辺で一旦内容をホームページの方にまとめてみましたので、良かったら見てみてください。
SDR-1000やSoftRock、そしてそれらを利用する素晴らしいソフトが次々開発されている現在では、機能的には見るべきものはほとんどありませんが、簡単なプログラムでもSSBを作ったりすることができるという意味で何かの参考になれば幸いです。感想、ご批判等ありましたらコメント欄やメールで連絡をいただければと思います。
今まで、自作のSSB変復調プログラムはIF=12kHzで固定でした。これは、サンプリング周波数のちょうど1/4になっていて、ベースバンドとの周波数変換のときの局発を実現するのに真面目に正弦波をつくる必要がなく、実質乗算も行なわなくて良いので実装上も処理速度上もメリットがあったからです(ソフトウェアで行なうメリゴ方式みたいになります)。
しかしFT-747は最小ステップが25Hzのため、局発が動かせないと、正確には相手にゼロイン出来ないですし、そもそも12kHz以外のIFに対応できた方が組み合わせるハードウェアの自由度もあがります。そこで、IF周波数をある程度自由に選べてかつ運用時にも微調整可能なようにプログラムを作り換えています。そのためには、ちゃんとした正弦波をIQのペアで出力するような関数が必要になります。週末の深夜にオリンピックの中継を見ながら、やはり昔つくったプログラムをちょこちょこ直して組み込んで、朝方にはなんとか動いて気分良く寝たのですが、夕方3.5MHzをワッチしていると最初はいいのですが、数十分くらいするとだんだん出力が大きくなってきて、しまいにはサチってしまうことに気づきました。変更したのは局発のところだけなので、きっと正弦波の振幅が誤差の蓄積で大きくなっているのだろうなと思って調べてみたら、やはりそのようです。試しに関数内部で使っている変数の精度をfloatからdoubleにしたところ、1時間くらい動かしていても問題はなさそうになりました。本質的には、誤差がある程度出てきたら振幅をリセットするとかしないといけない気がするのですが...
ちなみにそこの部分は以下のようなコードになっています。世の中、どんなやりかたで処理しているのでしょうかね。
しかしFT-747は最小ステップが25Hzのため、局発が動かせないと、正確には相手にゼロイン出来ないですし、そもそも12kHz以外のIFに対応できた方が組み合わせるハードウェアの自由度もあがります。そこで、IF周波数をある程度自由に選べてかつ運用時にも微調整可能なようにプログラムを作り換えています。そのためには、ちゃんとした正弦波をIQのペアで出力するような関数が必要になります。週末の深夜にオリンピックの中継を見ながら、やはり昔つくったプログラムをちょこちょこ直して組み込んで、朝方にはなんとか動いて気分良く寝たのですが、夕方3.5MHzをワッチしていると最初はいいのですが、数十分くらいするとだんだん出力が大きくなってきて、しまいにはサチってしまうことに気づきました。変更したのは局発のところだけなので、きっと正弦波の振幅が誤差の蓄積で大きくなっているのだろうなと思って調べてみたら、やはりそのようです。試しに関数内部で使っている変数の精度をfloatからdoubleにしたところ、1時間くらい動かしていても問題はなさそうになりました。本質的には、誤差がある程度出てきたら振幅をリセットするとかしないといけない気がするのですが...
ちなみにそこの部分は以下のようなコードになっています。世の中、どんなやりかたで処理しているのでしょうかね。
/* * complex sine wave generator */ #ifndef SINGEN_H #define SINGEN_H #include <math.h> class SinGen { private: int sr; float f; double a, b, c, d; double angle, wd; public: SinGen(float freq, int sample_rate) { sr = sample_rate; f = freq; a = 1.0; b = 0.0; angle = 0.0; wd = 2 * PI * f / sr; c = cos(wd); d = sin(wd); } void set_freq(float freq) { f = freq; wd = 2 * PI * f / sr; c = cos(wd); d = sin(wd); } void get_sample_n(float *i, float *q, int n) { double a_next, b_next; for (int j = 0; j < n; j++) { a_next = a * c - b * d; b_next = a * d + b * c; i[j] = a_next; q[j] = b_next; a = a_next; b = b_next; //angle += wd; } } }; #endif
コメント欄ですでにanchorさんから情報いただいたように、SoftRockv5の主要部分であるQSDボードは400セットの行き先が決まったようです。私自身はどうしようかと迷っていたのですが、あっと言う間に売切れてしまいました。JAからも注文された方がいらっしゃるようなので、そのうちWeb上などでレポートが出てくるかも知れません。楽しみですね。
今週もまたイコライザその他FT-747+DSPで遊んでいました。まずはピーキングフィルタのセンターを2800Hz(ゲイン6dB)に変更してみたところ、確かに高域が目立つようになりましたが、ちょっとギラついた感じがしたので、ゲインを3dBに下げたりしていたのですが、なんかバランスが良くありません。おかしなことに(?)高域をあげたことによって却って低域が目立つような感じがするのです。これなら元の何もいじってないときの方が良かったような… と、そこでCQ誌2月号のJA1RPK川名さんによるSSBの音作りの記事を見ていたら「高域をのばそうとして2600Hzを上げたらやせた音になったので逆に140Hzを下げたらちょうど良くなった」という記述があるのを発見しました。私の場合はやせた感じになったわけではないのですが、低域を少し落した方がいいかもと思って140Hzあたりを中心に3dBほど下げるフィルタを入れてみたら、悪くない感じです。自分でモニターしている限りは、その140Hzを下げるフィルタと先の2800Hz/+3dBのフィルタと両方入れた辺りがちょうどいいかなと今のところ思っています。今週はQSOはしなかったので、来週でも実際に他の局に聞いてもらってレポートを頂戴しようと思っています。おっ、しかし来週はハムフェアですね。
そういうわけで日曜日は昼頃起きて軽く食事をしたあと14MHzをワッチしたのですが、コンディションもいまひとつなのか、あまり出ている局がいません。試しに CQを出してみると、先週QSOした(比較的)ローカルの局がコールしてくれました。早速イコライザをon/offして聞き比べていただいたところ、「多少効果は感じるが、まだ高域の伸びが足りない」というようなレポートをいただきました。それと、ピークの周波数は2KHzではなく、もうちょっと上の方、2.4~2.8kHzくらいにした方がいいかも知れないということと、8.215MHzで通している747内蔵のAMフィルタの肩の特性にも注意した方が良いというお話でした。
その日の夜に簡単にAMフィルタの特性を計ってみたのですが、帯域幅としては3dB落ちで+-3100Hz以上はありそうなのでまあ十分なのですが、帯域内に3dB程度のリップルがあることがわかりました。ピークは上下とも中心から1kHzのところで、フィルタのセンター(DSPで送信のときはここが0Hz)に比べて+3dBです。そこから2kHzに向かって下がっていき、2kHzのところがほぼボトムでセンターと同じレベル、そこからすぐに2dBほど上がって、そのあと3.1kHzくらいまでフラット、3.2kHzでセンターと同じレベルに落ち、そのあとはフィルターの裾に入っていきます。
さて、どうしたものか...IFTを回してみたりすると、もうちょっとフラットに出来るのかも知れないのですが、ちょっと自信がありません。とりあえずはイコライザの方をいじってどの程度変わるのかやってみようかと思っています。
その日の夜に簡単にAMフィルタの特性を計ってみたのですが、帯域幅としては3dB落ちで+-3100Hz以上はありそうなのでまあ十分なのですが、帯域内に3dB程度のリップルがあることがわかりました。ピークは上下とも中心から1kHzのところで、フィルタのセンター(DSPで送信のときはここが0Hz)に比べて+3dBです。そこから2kHzに向かって下がっていき、2kHzのところがほぼボトムでセンターと同じレベル、そこからすぐに2dBほど上がって、そのあと3.1kHzくらいまでフラット、3.2kHzでセンターと同じレベルに落ち、そのあとはフィルターの裾に入っていきます。
さて、どうしたものか...IFTを回してみたりすると、もうちょっとフラットに出来るのかも知れないのですが、ちょっと自信がありません。とりあえずはイコライザの方をいじってどの程度変わるのかやってみようかと思っています。
先週QSOしていただいた方のレポートや、自分でモニターした感じから、高域をもうちょっと持ち上げる必要があるかなと思い、簡単なイコライザのプログラムをSSBジェネレータのプログラムに組み込んでみました。平日は仕事(と遊び)が忙しくてなかなかやる時間がなかったのですが、土曜日の夜中にふと思い立ってプログラムの改造を始めました。
実装は、C MAGAZINE2003年3月号の小川要氏による特集記事「ソフトウェアオーディオマニアのススメ」を参考に、Robert Bristow-Johnson氏のCookbookの式をもとにしたEQ用バイクワッドフィルタを実装してみました。この公式を使うと、ローブースト、ハイブースト、ノッチ、ピーキングなど、いわゆるイコライザに必要なフィルタを簡単に設計することができます。
上記の記事では多バンドのイコライザの例なども紹介されているのですが、今回はとりあえず高域を持ち上げてみようということで、ピーキングフィルタのみを実装して組み込みました。ピークの周波数は2.0kHzで、ゲインは6dBです。最初はオーディオフィルタだけのプログラムを作成し、マイクからの音を通して再生したところ、高域が持ち上がってなんとなくそれらしく聞こえます(実はデバッグ途中で間違って発振状態?になってしまい、ヘッドフォンでモニターしていた私は飛び上がりそうになったりしましたが)。次にそれをSSBジェネレータのプログラムに組込んで、送信音を自分でモニターしてみました。やはりそれなりに効果はありそうです。
もうひとつ、これまでの私のプログラムでのサウンドデータの処理は、普通にread()して信号処理してwrite()するという構成だったのですが、今回これを機にportaudioを使ってcallback関数の中で信号処理を行なうように変更しました。
この二つのことをやっていたらほとんど朝で、蝉の鳴き声を聞きながらベッドにもぐり込むことになってしまいました。
実装は、C MAGAZINE2003年3月号の小川要氏による特集記事「ソフトウェアオーディオマニアのススメ」を参考に、Robert Bristow-Johnson氏のCookbookの式をもとにしたEQ用バイクワッドフィルタを実装してみました。この公式を使うと、ローブースト、ハイブースト、ノッチ、ピーキングなど、いわゆるイコライザに必要なフィルタを簡単に設計することができます。
上記の記事では多バンドのイコライザの例なども紹介されているのですが、今回はとりあえず高域を持ち上げてみようということで、ピーキングフィルタのみを実装して組み込みました。ピークの周波数は2.0kHzで、ゲインは6dBです。最初はオーディオフィルタだけのプログラムを作成し、マイクからの音を通して再生したところ、高域が持ち上がってなんとなくそれらしく聞こえます(実はデバッグ途中で間違って発振状態?になってしまい、ヘッドフォンでモニターしていた私は飛び上がりそうになったりしましたが)。次にそれをSSBジェネレータのプログラムに組込んで、送信音を自分でモニターしてみました。やはりそれなりに効果はありそうです。
もうひとつ、これまでの私のプログラムでのサウンドデータの処理は、普通にread()して信号処理してwrite()するという構成だったのですが、今回これを機にportaudioを使ってcallback関数の中で信号処理を行なうように変更しました。
この二つのことをやっていたらほとんど朝で、蝉の鳴き声を聞きながらベッドにもぐり込むことになってしまいました。
普段バンドをそれなりに聞いてはいるのですが、滅多とオンエアすることはありません。とりあえずまともに電波の出る機械がFT-747改しかないので、ここのところそれをセットアップして「ワンツースリー」などとやってモニターしたりしていたのですが、どうもどんな音がしているのか今ひとつ良くわからず、これは実際にQSOしてレポートをもらうしかないなと思い、この週末は恐る恐る電波を出してみました。土曜日の深夜に21MHzで2局、日曜日の昼間に14MHzで2局お相手していただきました。みなさん「特に問題はない。普通の変調ですよ」ということで安心しました。最後にQSOしたのは割と近くの局で、IC-7800にベリンガーのコンプレッサー等を接続していい感じで聞こえている方だったので少し突っ込んで話をさせていただいたのですが、自分で思っていた通り私の送信音はちょっと低域が勝ち気味だとのレポートをもらいました。だいぶ前に特性を計ったときには3dB落ちの帯域が150-3000Hzくらいだったので、それだけだと高域も十分出てもいいはずなのですが、マイクや喋り方も関係があるかも知れません。そもそもソフトウェアで変調しているので、イコライザやコンプレッサもプログラムに組み込めばいいのですよね。わかってはいるのですが、勉強不足とやる気の不足でまだ実現していません。今度は「おっ、いい音ですね」と言われるようにしたいものです。
簡単なハードで…と構想だけは書きましたが、週末も全然ハンダゴテを握らず何も進みませんでした。でも世の中にはすでに似たようなことをやっている人がいて、たとえばPU1JTEによる40m spectrometerというのがあります。で、このハードと彼の自作のスペアナのソフトウェアを使ってリアルタイムに彼の地ブラジルの7MHzの40kHz幅ほどの様子をブラウザ上に表示しているのがこちらのページ。
ところで、このEdsonという人は多分元々ブラジルの人なんでしょうが、WやJAのコールも持っています。で、なんとなく見覚えがあるなと思ったら以前に私のホームページでの実験にコメントのメールをくれた人でした。そのときはJAに今いるからチャンスがあったら会おうと言ってくれたのですが、会わずじまいになっています。
ところで、このEdsonという人は多分元々ブラジルの人なんでしょうが、WやJAのコールも持っています。で、なんとなく見覚えがあるなと思ったら以前に私のホームページでの実験にコメントのメールをくれた人でした。そのときはJAに今いるからチャンスがあったら会おうと言ってくれたのですが、会わずじまいになっています。