プログラムの実装等

プログラムの実装

最初はCでしかもベタベタに書いた方が実行速度が速くなるかなと 思ってやっていたが、そんなことよりとりあえずはちゃんと 動くようにしなくては、ということでフィルタのプログラムを まとめたりしていた。そのうち、あれ? これってオブジェクト指向に してクラスとかにしてまとめた方がいいような、という気がしてきたので C++に移行してFIRフィルタやヒルベルト変換器のクラスをつくってみた。 実はC++はほとんど良く知らないのであんまりうまく書けていないと思う。 でももっというと実はこの復調プログラム、コードの量はものすごく 少ないのである。実質200行くらいだと思う。 また、フィルタは今のところFIRフィルタしか試していない。

decimatioの前のフィルタは、0-4kHzのLPFで、6kHzのところで 設計した帯域外減衰の-60dBになる。係数の数(タップ数)は89である (設計の例)。 ヒルベルト変換器はタップ数127である

それからalsaのサウンドドライバのAPIもいまひとつよく わかっていないので、適切な処理が出来ていない部分があると思う。 APIのドキュメントもあるにはあるのだが、古くて今のバージョンと かなり違っているようだ(ごく最近version0.5対応のドキュメントが alsaのページに現れた)。

2000.Apr.27 Javaへの移植
ユーザインタフェースを何とかしたいなあと思ってJavaと 組み合わせることを考えていたが、java.sun.comを見たら 最近は Java Sound APIというのがあって、それを使うと 全部Javaでできそうな気がしてきた(ただしLinuxではまだ動かない)。

2000.May.3
一応Javaでも動きました。なんかチューニングがとりずらいと 思ったらディレイが1秒くらいあるような感じ。遅れが増えていく わけでもないようだ。とにかくWindows環境でも変調が出来るように なった。

現状のSound APIでは録音と再生で同じフォーマットでしか デバイスをオープンできない。なのでdecimationはしないか、 decimationしてヒルベルト変換等の計算量を減らしてから、 もう一度interpolationするとかしないといけない。

次はGUIか? と言っても当面はモード、フィルタ切替えボタン くらいかな。せめてレベルメータくらいつけたいもの。

2000.May.22
GUIつくりはじめました。と言ってもまだこんなのですが Hi. 勉強中です、ハイ。

Jun 21 LinuxでもJava
Linux版のJDKも1.3betaが出たので早速ダウンロードして 検波プログラムをコンパイルしてみた。速度がちょっと心配だったが、 なんとか間に合いそう。

と思ったのだが、やっぱりだめ、うまく行かない。capture用と playback用のlineを両方オープンしようとするとLineUnavailableExceptionが 出てしまう。ううむ...

Java版を公開しようと思うと色々直したくなってきて直してます。 もうちょっとということろでバグが取れません。 それから、IBM版のJDKだとLinuxでもうまく動くような気がしたが、 気のせいだったのか動かない。SUNのもあいかわらず駄目みたいである。

Javaでのソースコード

2000.Nov.5
SSBジェネレータ/ディテクタのソースです。全然ちゃんとしてませんが、 興味のある方は見て下さい。ソースプログラムは、 の5つです。 Java版では、サウンドカードの入力と出力のサンプリング周波数を 同じにしないといけないので、サンプリング周波数は入出力とも 48kHzとし、一旦12kHzに落してフィルタを通した後、もう一度 48kHzに戻して出力しています。サンプリング周波数を 下げるのにDecimatorクラス、上げるのにInterpolatorクラスを 用います。decimationの前やinterpolationの後に 必要となるフィルタの処理もそこに組み込んであります。

メインのフィルタの帯域は、ジェネレータ/ディテクタとも300-3000Hzで 設計してあります。

Linuxでは...今のところ動きません。

動かし方

Windowsで動かすための簡単に手順を書きます。必要なものは、 です。まずはJava開発環境をインストールしましょう。java.sun.comから ダウンロードしてきてインストールします。インストールは簡単です。 別にSUNのJDKにこだわる必要はないです。多分他のベンダの開発環境でも 動くと思います。

次にこのDSP関連のプログラムを置くディレクトリ、たとえば'c:\dsp' というディレクトリをつくります。 さらにその下に'src'と'classes'というディレクトリを つくり、'src'ディレクトリの中に上の4つのソースをコピーします。 それから、CLASSPATHという変数に今つくった'classes'ディレクトリを 追加します。

set CLASSPATH=%CLASSPATH%;c:\dsp\classes;
そしてコンパイル。
cd c:\dsp\src
javac -d c:\dsp\classes *.java
これで準備は出来ました。実行は、ジェネレータが
java ji3gab.dsp.Generator 1
ディテクタ(検波器)が
java ji3gab.dsp.Detector 1
です。いずれも最後の'1'というのはプログラムに対する引数で、 これでモードを決めます。0がAM(Detectorのみ)、1がLSB、2がUSBです。

あとはWindowsのオーディプロパティでMic(あるいはLine in)の 録音レベル、Wave出力、Master出力のレベルを調整します。 これで12kHzのSSB信号が得られるはずです。

注: ここに公開しているプログラムはまったくの無保証です。 このプログラムを使用することによって生じたいかなる不利益についても 作者は一切の責任を負いません。御自分の責任のもとで 利用してください。

Windows版プログラム

2001.Mar.13
Windowsでのプログラミングの経験はほとんどなかったのですが、 最近少し触る機会がありました。 それとBorlandからフリーのコンパイラ(コマンドライン版BCC5.5.1)が 提供されていることがわかったので、それを使って DSPの実験プログラムをWindows でとりあえず動くように書き直してみました。

Wave関係のコードについてはatsu氏の「ソフトウェアDSP」のプログラムを 参考にしました()。

今回はコンソールアプリケーションとして作ってありますが、 atsu氏のプログラムを少し変更して、SSB変復調の処理を組み込んで Windowsアプリケーションを作った方が素直かも知れません。 今のところ作者はこのWindows版を発展させていく予定はありません。

プログラムはそれほどきちんとしたものではなく、色々と手抜きが あります。

dsp.lzhをダウンロードして解凍すると、 READMEファイル、srcディレクトリ、binディレクトリが できます。binの下に実行ファイルがあるので、それをコマンドプロンプトから 実行することができます。
コマンドプロンプトに対して復調プログラムの場合は、

detector 1
変調プログラムの場合は、
generator 1
というように入力します。いずれも最後の'1'というのはプログラムに対する 引数で、これでモードを決めます。0がAM(detectorのみ)、1がLSB、2がUSBで す(引数を省略するとdetectorはAM、generatorはLSBになる)。

あとはWindowsのオーディプロパティでMic(あるいはLine in)の録音レベル、 Wave出力、Master出力等のレベルを調整します。

なお、detector.exeとgenerator.exeは適当なディレクトリにコピーして 使うことができます。

何かキーを押すとプログラムは終了します。

注: ここに公開しているプログラムはまったくの無保証です。 このプログラムを使用することによって生じたいかなる不利益についても 作者は一切の責任を負いません。御自分の責任のもとで 利用してください。


Goto Top