TMS 320C6713 D S P (2007.12)


 以前使っていた6711DSKですが、これはこれで結構な規模の浮動小数点演算ができますから、気楽にDSP遊びをするには、格好の題材なのでしょうが、サンプリングクロックを変えられないのはかなり「痛い」欠点です。サンプリング周波数が8kHzでは遊びの幅も限られてしまいます。ということで、サンプリング周波数が96kHzまで変化させられる6713DSKに乗り換えることにしました。このDSKはTIの代理店に申し込めば、入手は簡単です。そんなに高価なものではないので、いじり壊すつもりで取り組むことにしました。




6713DSKをシャーシ内に納めた状況

 まずは、基板がむき出しだと、端子等に変な力が加わって破損してはたまらないので、シャーシ内部に納めることにしました。USB接続が、ちょっといやらしいですが、なんとか収めることができました。さーて、これで、ばしばしプログラムを作る(移植する?)ぞー!と張り切っていました。大きなバリアーがすぐそこに控えているとはつゆ知らず、気分は高揚していました。

 最初に雛形プログラムの選定ですが、 C で遊ぶことを前提にすると、選択肢はあまり多くありません。6711のところで紹介した「はじめてのDSP活用大全」の雛形プログラムを選ぶのが自然な成り行きだと思われます。私もこれを使ってみることにしました。雛形プログラムは入力信号をA/Dして取り込み、そのまま何もせずにD/Aして吐き出すという「Through」プログラムで、その「間」に自作のプログラムを書きこむことになります。

 無線のアプリケーションでは、なんといっても位相特性が直線である(=遅延特性が平坦)FIRフィルタで、どれだけ大きいタップ数が処理できるかが、重要になってきます。 そこで、何処まで処理できるか、試してみるわけです。FIRフィルタの部分は、なにも考えずに単純に書くと、

        acc = 0.0;
        for (k=0; k<=ORDER; k++) acc = acc + gn[k]*x0[k];
        for (k=ORDER; k>0; k--) x0[k] = x0[k-1];

となります。これは、教科書に書かれたとおりの演算方法で、一つ目のforループでgn[]に格納されていた、FIRの係数と入力との積和をとって、二つ目のforループでデータシフトをして、次のデータを迎え入れるという操作です。

 こんな簡単なプログラムなら、間違いようがなく、実際、このコードでもちゃんと動きます。雛形プログラムの中に入れ込めば、正常動作です。 これで、いい気分になって、次数を上げていくと、あれまぁ、サンプルクロックが48kHzの時、130タップあたりから、動作がおかしくなります。以下にスペクトラムを示します。


 

130次のLPF 動作NG例  (教科書どおり、配列でデータシフト)

 (2.5kHzまで振幅=1、4kHz以上振幅=0で設計 Fs=48kHz)







100次のLPF 動作OK例
   (教科書どおり、配列でデータシフト)
 (2.5kHzまで振幅=1、4kHz以上振幅=0で設計 Fs=48kHz)


注:入力信号はホワイトノイズで、発生器の振幅レベルは0dB
これ以上レベルが上げられないため、出力レベルが低い

 こんな低い次数で動作がおかしくなるなんて、当然、当初は予想できるはずもありません。サンプリング周波数が8kHz程度なら、130タップ分の処計算ができれば(サンプル周波数=48kHzで)、その6倍の処理ができるでしょうから、いろんな処理ができそうです。一方、フィルターのシミュレーションツールを動かせばすぐに解るのですが、48kHzサンプリングでは、100次じゃ、フィルタとしても(減衰域の傾斜にもよりますが)30〜60dBくらいの帯域外減衰量しか実現できません。これでは、殆ど何の処理もできないことになります。困った・・・・・・ここで、しばし考え込んでしまいました。

 DSPは本当に面白いのですが、なかなか素人趣味として受け入れられないのは、簡単なサンプルを動かすまでは到達しても、壁にぶち当たると、周りに知ってる人が皆無なので、なかなかそこからブレイクできないことが一因として挙げられるのではないでしょうか?もちろん、ガテンオヤジが適当にアナログ回路をつぎはぎして、最後はエイヤっとスペアナで特性を追い込んでしまうという「カンと経験」でなんとかなることは無く、DSPはちゃんと理論どおりにしか動かないという、本質的な「とっつきにくさ」もありますけど。

 こんなときはいろいろな人に聞いてみるのが、解決への早道であることは、今も昔も変わりありません。掲示板とか、いろいろな場所で質問してみました。ある人は、「DSPの速度が上がらない理由が分からないなら、自助努力でいろいろ調べなさい。それで駄目なら、DSPなんぞいじるのは止めて市販のDSP無線機を買ったほうが無難だ」とまで言われるかと思えば、「こちらのURLに、FIRの高速化の事例が載ってるから試してごらん」なんて、親切に助言してくれる人まで千差万別でした。最初のコメントは、その道ではかなり有名な方でして、「自分で書いた本に対する質問なのに、こんないやらしいコメントしか返さないのは、さぞや偏屈なエンジニアなんだろうなぁ」と諦めましたが。こんなつまらないことで優越感持っても、何かいい事あるのかしら?

 なにはともあれ、掲示板で教えてもらったURLにあったソースコード↓を見てみました。

    float fast_fir(float in, float coef[], float buf[], unsigned *index, unsigned length) {
       float out;
       unsigned i;
       buf[*index]=in;
       buf[*index+length]=in;
       *index=*index+1;
       if (*index==length) *index=0;
       out=0.0;
       for (i=0; i<length; i=i+1) out=out+coef[i]*buf[*index+i];
    return out;
    }

 これは高速FIRのアルゴリズムらしいです。動作は工夫がしてあって、この動作を追っかけてみると、先のソースにあるような、「配列にほおり込まれた入力信号のデータシフト」が無く、積和のみでFIRが実現できるようです。低い次数のフィルタを考えて実際にデータをソースの動きどおりにマッピングすると、動作がよく解ります。配列のデータシフト方式を使うと速度が出ないよ と掲示板で教えてもらいましたが、単にデータシフトを止めるだけで、100次しか処理できなかったものが飛躍的に改善するのかしら?と不安は消えません。それでは、ということで、まずは400タップのFIRにチャレンジしてみることにしました。




400次BPF 高速化実施例

12kHz+/-1kHzが振幅=1
12kHz+/-1.6kHzが振幅=0

遅延特性は3.2ms/div
位相が+/-90度点でのジャンプが不連続で表示されてしまっている
ジャンクスペアナの限界か?





500次BPF 高速化実施例
12kHz+/-1kHzが振幅=1
12kHz+/-1.5kHzが振幅=0


 これは、帯域を3分割して作ったBPFで400次と500次で設計してあります。400次の方は遅延特性も併記しましたが、帯域内でまったくフラットです。これだと、アナログのメカフィルやセラフィルと異なり、遅延歪みが出ないので、音がいいと期待しても良いでしょう。振幅特性も帯域内はまったくフラットで、このように振幅、遅延のいずれもフラットな特性というのははじめて体験しましたが、これはアナログでは絶対にできない、本当にすごいことですね。

ちょっと、寄り道して、たとえば、SSBの変調を行う場合、

(1)実変調信号と実局発信号を乗算してDSBを作り、急峻な実BPFで逆サイドバンドを抑圧する(=要はアナログ方式のデジタル版)

(2)WEAVER方式

(3)ヒルベルト変換器を用いたフェーズシフトタイプ

(4)ゼロIFのDSBを複素フィルタを用いてゼロIFのSSBを生成し、複素局発を用いてIFシフトする(酔漢さんのところに詳しい


等が考えられますが、400次もあれば、実フィルタ(BPF)としては、十分な減衰量を得られます。逆に、この程度ができなければ、実用的な処理をDSPではできないということで、まずはひとつの目標でした。また、フェーズシフトタイプでも、ヒルベルト変換器として、なにも考えなければ(←低い周波数で処理してインターポーレーションするとか)、400次くらいは必要になりそうです。

ということで、一応、DSPでSSBは出来そうというのが解りましたが、では48kHzサンプリング時、6713DSKで何タップまでのFIR処理ができるのでしょうか?

 実は、簡単に○○○次のFIR なんて言っていますが、ひとつ大変なことがあるのです。三上先生の設計プログラムでは、配列の個別の値として、延々とデータが文字データでメモ帳に出力されます。これから、配列の文字を取り去り、数値だけを取り出し、実フィルタの場合は、カンマ区切りファイルとし、複素フィルタの場合は、シフトする周波数の処理をRealとImageの係数について行い、カンマ区切り文字データに変換するエクセルファイルを作りました。これがないと、手動で500次の複素フィルタ係数を2系列(Real/Image)も作ると「吐き気」がすること必定です(笑)。

 話を戻しましょう。320C6713DSKで225MHzで用いて、48kHzサンプリングで実現できたのは425タップの複素フィルタ(Real/Image)でした。実フィルタならば850タップ分です。これも以下に示すように、Optimize Option を下から二番目(=”Local”)にしてやっとでした。通常設定の”Resister”だと動作はしないようです。これから、上記の(3)、(4)のフィルタとしては、400次相当のフィルタ(二本)を割り当てられるので、(1)〜(4)の全ての方法が実験できる見通しが得られました。



425次複素BPF(Re/Im) OK例 Optimum level=Local
元LPF:1kHzまで振幅=1 1.5kHz以上で振幅=0 12kHz shifted


注:入力信号はホワイトノイズで、発生器の振幅レベルは0dB
これ以上レベルが上げられないため、出力レベルが低い

実際の帯域外減衰量は-80dB以上取れている
また、複素フィルタのため、実フィルタに比べて-6dB低くなっている




425次複素BPF(Re/Im) NG 例 Optimum level=Resister
元LPF:1kHzまで振幅=1 1.5kHz以上で振幅=0 12kHz shifted



<各種変調実験> 【2008.1.14】

 新年明けて初めてのアップになります。TRXは一応落ち着いたとはいえ、[ちまちま]いじると思いますので、まとまったらそれはそれでアップいたします。ということでDSPいじりの様子をごらんください。

 まずは、とっつきやすいように、アナログからの連想でいける、AM、FM、SSBの変調実験をやります。DSPはこのくらいの実力があるんだという指針になればと思います。最初に、実験に使ったAF信号源のスペクトラムを以下に示します。これは、以前から用いているTR一石のAFOSCで、適度にきれいで、一方、少し歪っぽい(なんのこっちゃ?)ものです。あまりに歪んでいると、処理で発生する歪がもしあった場合、なにがなにやら解らなくなるのを避ける一方、ある程度高調波があったほうが、変調の周波数特性が一目で分かるという効果を狙っています。だから、以前に作った2トーンOSCのように歪がほとんど無いものよりは有用なわけです。



実験に用いたAF-OSCのスペクトラム


次に、さっそくAM変調に行きましょう。プログラムは三上先生のプログラムそのままです。入出力を、6713DSKにアレンジしていますが、まったく簡単です。IIRでサイン波を生成して、それにAM変調の数式どおりの動作をさせます。入力のxnに変調指数mを乗算して、DCなるキャリアレベルと加え、生成したサイン波yn0と乗算しています。

//----------------- Sinusoidal wave generation ----------------------

   yn0 = a1*yn1 - yn2;             
   yn2 = yn1;                  
   yn1 = yn0;

//--------------------- AM Modulation ----------------------------

   y_AM = (m*xn + DC)*yn0;                   // modulation
   r_out = (short)y_AM & 0xFFFE;



AM変調信号スペクトラム

 これはほぼ100%変調のスペクトラムです。高調波が見えるのは、入力信号のスペクトラムがそのまま両サイドバンドに写像された様子で、DSP変調器に歪があるわけではありません。


 次はFM変調です。同様に三上先生のプログラムを借用です。p163あたりをご覧ください。サイン波生成には多項式近似、FM変調にはVCOを数式上で構成しています。(素晴らしい!)

// ---------float sin function using 5th order polynominals------------------

float floatSin(float x) {
  const float a1 = 1.57032002;
  const float a3 = -0.64211317;
  const float a5 = 0.07186085;
  float sinx, x2;

  x = (x > 1.0f) ? ( 2.0f - x) : x;
  x = (x < -1.0f) ? (-2.0f - x) : x;

  x2 = x*x;
  sinx = ((a5*x2 + a3)*x2 + a1)*x;

  return (sinx);
}

//-------------------- FM phase calculation ------------------------
  phi = phi + c0 + c1*xn;
  phi = (phi > 2.0f) ? (phi - 4.0f) : phi;

  r_out = (short)(A0*floatSin(phi)) & 0xFFFE;   // modulation output



FM変調スペクトラム

 上図で二重に見えるのは、実際のSSGから得られるスペクトラムとの比較です。1kHzのSSGの内部変調信号で2.5kHzの周波数偏移のスペクトラムに、DSPで作ったFM変調波(入力信号は上記のもので、周波数は約970Hz)を重ねてみました。高次の側帯波になると、周波数差が見えてきますが、レベルが同じなので、まぁ、ちゃんと変調が掛かっているのでしょう。もしかすると、アナログSSGの方が、誤差があって、DSP出力のほうが正しいスペクトラムなのかもしれません(笑)。

 最後はSSBです。まずはいろいろある方式のうち、一番DSPに似合わない方法を試してみます。解析信号化を行わず、実信号だけで処理します。これはアナログとの類推が利き、一番とっつきやすい方法です。高次のBPFを作ってしまい、強引にDSBの片側をそぎ落とす、一番野蛮な方法です(笑)。

//----------------- Sinusoidal wave generation ----------------------

  yn0 = a1*yn1 - yn2;
  yn2 = yn1;
  yn1 = yn0;

//--------------------- DSB Modulation ---------------------------

  y_DSB = (float)l_in*yn0;              // DSB modulation

//--------------------- FIR filtering ----------------------------

  l_out=fast_fir(y_DSB, fir_coef, fir_buf, &fir_ix, FIR_LEN);   // filtering & output

 いつものごとく、サイン波をIIRで発生させて、入力信号l_inと乗算してDSBを作り、こいつを高速FIRで構成された、500次FのBPFを通して、片側の側波帯をぶった切ります。



BPFによるSSB変調

 この500次のBPFは、中心周波数が12kHzで、3dB帯域は+/-1.2kHz(帯域は2.4kHz)で形状比は80dBダウンで比較して1.25というものです。これで、帯域内グループディレイがフラットだというのだから恐れ入ります。キャリアポイントは13.38kHz(LSBの場合)で、ここにおけるBPFの減衰量は25dB近辺になります。こいつを通すと、写真のように、なんとキャリアサプレッションは-90dB以下、サイドバンドサプレッションも-90dB以下というとんでもない特性が得られます。2.4kHzで帯域制限しているせいか、高次のスペクトラムは小さくなっています。一番原始的な方法でも、こんな特性で、経年変化がゼロというのは、すごいことですね。次はすこし高等な方法でSSBを作りますが、果たしてこれ以上の結果が得られるのでしょうか?????

<SSBの発生その2>  【2008.3.22】

 上の記事の日付をみると、なんと年初めじゃないですか。そのあとSSBの発生法を2つばかり試したのですが、インタラプトではじめたDDSが面白くなって、中断していたようです。(「ようです」なんていうくらい記憶の彼方です(笑)。) なんせ、長男が進学で京都へ出征、また、新居の引渡しと立て込んでいて、なかなかハンダごてが温まりません。このままだと、DDSの配線が一段落するまで、「埋もれてしまいそう」なDSPのデータを整理しておくことにします。

 さて、フィルター法以外には、WEAVER方式、ヒルベルト変換方式、複素フィルタ方式があるのですが、WEAVER方式は4回も乗算するので、実験としては後回しにしようと思ったようです(多分、このように言い訳を始めるとやらない可能性が高いが)。ということで、順にヒルベルト変換と複素フィルタ方式にチャレンジです。

@ヒルベルト変換による方法
 これは簡単です。すでに、C6711DSKを使って、帯域が4kHzの中で遊んでいます。これのIF周波数を12kHzに変えてやれば一丁あがりということになります。ということでブロック図は参照するに留めておきます。

 ただ、6711の時はFIRを配列シフト法という超原始的なやりかたで作っていたので、キャリア、変調信号のいずれの位相シフトも、用いた配列の中点の要素と最後の要素で90度位相差を作りだすことが可能でしたが、高速FIRのアルゴリズムだと、ちょっと頭をひねらないといけないようです。説明が面倒なのですが、ポインタ操作に気づくと0度位相(位相差無し)と90度位相の信号を作りだすことができます。


//--------------------- Carrier Phase shift &Modulation--------------------

    y_car =yn0;                       // Carrier Phase shift
    car_90=GAIN_C*fast_fir(y_car, hil_coef, hil_buf, &fir_ix_h, HIL_LEN);
    car_0=GAIN_C*hil_buf[HIL_LEN/2+fir_ix_h];

    y_audio=(float)l_in;
    mod_sig_90=GAIN_S*fast_fir(y_audio, fir_coef, fir_buf, &fir_ix, FIR_LEN);
    mod_sig_0=GAIN_S*fir_buf[FIR_LEN/2+fir_ix];

    l_out=mod_sig_0*car_0-mod_sig_90*car_90;
    r_out=mod_sig_0*car_0+mod_sig_90*car_90;


 上は変調部分のソースです。キャリアy_carを12kHzで生成して、90度と0度の位相差信号を作ります。同様に入力y_audioから90度と0度の位相差を持った信号を生成します。これらを乗算後、足し算するか引き算するかでUSB/LSBを生成します。



位相特性図

 上の図はヒルベルト変換器の動作で、位相差を見ようとしてスイープした結果です。430次のヒルベルト変換器で、帯域は0.3-23.7kHzです。振幅偏差0.00047dB 位相リップル:検出できずというのが設計値です。次数はもう少し上げることができるのですが、設計プログラムが512次までなので、これ以下の適当な値にしてあります。上図は入力スイープ信号に対して、90度位相差出力と0度位相差出力を表示させています。当然、この2本の線の縦軸の値の差が90度になっています。+/-180度のところで、折り返しているのはスペアナの位相検波器が+/-180度までの動作になっているためです。このようにまったく位相特性は直線で表されているようです。ここでは、本当のところは、スペアナの信号系のほうが、位相誤差が大きいのかもしれませんが、こんな図が書けるということの紹介に留めておきます。

 キャリアの移相はシングルトーンで帯域を持たないため、極めて簡単です。20次のFIRでやっつけました。それでも設計帯域は8-16kHz、振幅偏差:0.0000692dB、位相偏差:検出できずとなっています。このように、帯域が狭ければ、ヒルベルト変換器は簡単に演算することができます。 




LSB (ヒルベルト変換による)





USB (ヒルベルト変換による)

 上図は生成したLSB/USBの写真です。変調信号はAM/FM/SSBの各種変調実験で用いたものと同じです。キャリアサプレッションは90dBくらいは取れているようですが、サイドバンドサプレッションはここでは-80dB近辺となりました。パラメータをいじってダイナミックレンジが最良になるところまで追い込んでいませんが、こんなものかもしれません。この方式の特徴は、変調信号のF特性を損なう要素がないので、フィルター法に比べて、高域が延びています。要は変調信号の高域成分がそのまま、RF信号の側帯波の広がりになるわけです。


A複素フィルタによる方法
 アナログ人間にはちょいととっつきにくい感じですが、酔漢さんのサイトのここに詳しい解説があります。勉強と思って組んでみることにしました。処理の流れは酔漢さんのサイトを参考にしてください。複素フィルタというのは、ベースバンドでLPFを構成して複素周波数変換をすると、シフトさせる複素周波数を中心としたBPFになるというものです。直感的にはゼロIFのDSBを複素BPFで切り取って、キャリア周波数である12kHzにシフトしたように見えます。


//---------------- Carrier Phase shift & Modulation ----------------------

    y_car =yn0;                                    // Carrier Phase shift
    car_90=GAIN_C*fast_fir(y_car, hil_coef, hil_buf, &fir_ix_h, HIL_LEN);
    car_0=GAIN_C*hil_buf[HIL_LEN/2+fir_ix_h];

    y_audio=(float)l_in;
    mod_sig_re=GAIN_S*fast_fir(y_audio, fir_coef, fir_buf, &fir_ix, FIR_LEN);
    mod_sig_im=GAIN_S*fast_fir(y_audio, fir_coef_im, fir_buf_im, &fir_ix_im, FIR_LEN);

    l_out=mod_sig_re*car_90-mod_sig_im*car_0;                
    r_out=mod_sig_re*car_90+mod_sig_im*car_0;                


 プログラムはヒルベルト変換と似たような形をしています。fir_coefなる係数は、複素フィルタ用に計算してあるところが違うくらいでしょうか。この複素フィルタの係数計算にはこちらに大変御厄介になりました。改めて御礼申し上げます。48kサンプリングで400次、03-1.5kHzのLPFを複素周波数1.5kHzでBPF化しています。これのI/Q出力をIFである12kHzに変換してSSBが出来上がります。

下の図はこのようにして作ったUSB信号です。先のヒルベルト変換と同じくキャリアサプレッションは良好ですが、サイドバンドの漏れは-75dBほどあります。これは、複素フィルタの次数によるものと考えられ、もう少し高次のものにすれば無くなる可能性はありますが、2系列(I/Q)の処理ということを考えると、今の6713DSKではこの辺が限界のようです。



USB
 (複素フィルタによる)

 この結果をみると、一番原始的なフィルター法が一番良い結果が出たような気がします。もちろん、DSPの処理能力がもっと高くて、処理に制限が無ければ違った結果かもしれませんが・・・・・・。

<SSBの受信(その1)> 【2009.5.24】

 久しぶりのこのページです。変調についてはひととおりやってみたので、今度は復調にとりかかることにします。やり方は多くあるのですが、まずは、簡単なPSNタイプでやってみることにします。構成は以下のような感じです。入力信号をA/Dして、ヒルベルト変換フィルタで90度位相差をつくります。ローカルである12kHzもIIRフィルタを用いて生成し、同じくヒルベルト変換フィルタで90度位相差をつくり、それぞれ乗算、加算して、ベースバンドのフィルタを通せば終わりです。




DSPの処理構成

 この構成では復調器の前に帯域制限のためのフィルタが入っていることが受信機として必須ですが、今回は、別のアップコンバージョンTRXのインターフェース回路から信号を引っ張り出すことを考えているので、ここは省略しています。いずれ、TRXの455kHzIFフィルタで2.4kHzに帯域制限せずに、広いFM用フィルタを使って、DSPでは入力信号をFIRで群遅延が平坦な複素フィルタを通すことも考えています。

 今回の場合、入力信号は中心周波数が12kHz近辺なので、ローカルの12kHzと近いため(当たり前ですが)ヒルベルトフィルタの次数が大変少なくできます。実に20次のフィルタを二本しか使っていません。処理能力的には余裕たっぷりです。




LPFのシミュレーション

 余裕の分はそのうち入力の複素フィルタ、その他の処理に回すのですが、ここではベースバンドの帯域制限として、軽く通過域が2.5kHzの100次のFIRを追加してみました。上図はそのシミュレーション例です。

 こんな構成で感度を測ってみようと思い立ったのですが、さて、12kHzとかいう周波数で、しっかり信号強度が絞れるSSGがありません。虎の子のHP8657は20kHzくらいになると、かなり怪しい波形です。ということで、SSGを二台使って、DBMでミックスダウンすることにしました。たとえば、300MHzと300.0135MHzで、13.5kHzを得る方法です。



復調信号

 上図はそうやって得た13.5kHzの信号が1.5kHzに復調される様子です。入力レベルは7.2μVrmsです。このとき、雑音レベル(RBW=100Hz)との比は22.8dBでした。2.5kHz帯域では雑音電力が14dBアップですから、S/N=9dBとなります。ということは、あとプリアンプみたいなものをつけて、25dBくらい増幅すれば、0.5μV(S/N=10dB)の感度も実現できそうな気がしています。一方、TRXの455のIFフィルタまでは殆ど利得がないので、その補正方法を考える必要があります。


<IFフィルタの特性とSSB音質について@> 【2016.4.29】

 いやー、とんでもない昔のページにワープしてきました(大笑)。なんと、このページのトップの日付は2007年12月ですから8年前じゃないですか! よくもまぁ、進歩の激しいDSPの世界で、こんな古いブツを弄りだしたものです。

 それはおいておくとして、以前に、SSTさんやLAOさんとIFフィルタの音質について掲示板で意見交換をしたことがありました。なんでも、最近は水晶フィルタの構成法に進化があり、急峻なフィルタを正確に自作することができるようになったようです。その反面、そんなフィルタを受信機に実装した時の音質の変化については、構成するのが簡単な従来のラダーフィルタのほうが良好というレポートもあり、その原因について、喧々諤々の(群盲象をなでるような:笑)議論があったのですが、本当のところは、良くわからない・・・・という状況で終わっていました。しかし、その急峻なフィルタも、いろいろと実現方法が難しいのか、自作屋がわっしょいわっしょい追試するような盛り上がりを欠いて、程なく鎮静化してしまったのが現状と認識しています。

 私的には、昔は受信機にはパスバンドチューンを標準装備に近い形で実装していましたから、時には、XFはメイン+PBT用+イメージ除去用の3つも実装することがあり、その場合は、通過帯域の振幅−群遅延特性はけっこう乱れていますから、良い音で受信できるはずがないと諦めていました。当時は、耐妨害波特性に心を砕いていましたので、こんな構成では、いい音なんて、はなから物理的には望むべくもないからです。ところが、ここ最近のTRXの受信部は、シングルコンバージョン(真空管UPC機)だったり、ダイレクトサンプリングのTRX305だったりと、音のいいRXを実感しているので、逆に音の「悪い原因」とは一体なんなのかについては非常に興味がありました。

 しかし、それを明らかにするには、興味とは裏腹で、これまた非常な困難な作業です。IFフィルタの特性のうち、音に影響を与える要素を特定するのは、それらが独立に変更できて、定量的に比較ができなければならないからです。サンプルとなるIFフィルタも水晶のパラメータを測定・シミュレートしながら、実物を構成する(それも、実際は計算したシミュレーションを実物で忠実に再現できるわけではない)のは大変な苦労が伴います。

 さて、そんな中、この頃、とみに反応の鈍った頭をシバキ上げて、なんとか検討できないかと考えたこと(笑)は以下の通りです。

(1)伝送路の能動素子による非線形歪による音質への影響は、これ以降の検討では考えないことにする。SSBの通信は、オカルトオーディオではないので、THDは−40〜−50dBも取れていれば十分(過ぎる)とする。この非線形歪と「音質」の関係を言いだすときりがない(←オカルトオーディオと同じ)。なので、今回の対象はフィルタによる「直線歪」のみを問題にする。

(2)その場合、SSBは線形変調なので、その伝送路の通過帯域特性によって一意に「音質」が決定されると仮定する。

(3)伝送路の特性はIFフィルタの振幅・位相(あるいは位相を微分した遅延)特性が主たる要素で、空間伝送時の直線歪は無視する(というか支配的ではない=HFの狭帯域では遅延分散も生じないとする。ただし超短周期のフェージングが有る場合はこの限りではないが、一般的な状況ではないので、考慮外とする)。

(4)「振幅特性と遅延特性がどのような音質変化を生むか」は良くわからない。何故なら、アナログ回路網では振幅と遅延は互いに影響しあうので、振幅・遅延一方「だけ」の影響を「切り分けて」論じる(=実験で確かめる)のは不可能であるから。

 というところで、ぐるぐる回っていて、あまり先が見えない状況が長く続いていました。

 実は、昔、DSPを弄っていたときに、FIRフィルタの振幅遅延特性を測ったことがあったのですが、こいつは、なんと通過帯域内の振幅・遅延特性がいずれも帯域内フラットという類まれな特性を有していることは覚えていました。これを使えば、上記の疑問に答えられるような検討ができるかもしれないとは思いつつ、昔の環境を取り戻すには、時間がかかってなかなか立ち上がれませんでした。ただ、細切れ時間を使って少しずつ進めた結果、なんとか昔のカンが戻ってきました。なので、DSPを使うことで、シミュレーションではない、あくまでも実回路と同じ特性を実現して、安定的に実音声の変化を体験してみたいと思ったのです。

  <<ところでここで用語の解説をしておきましょう>>

 直線歪なる耳慣れない言葉が出てきましたが、ちょっと解説しておかないとまずいでしょうね。普段、「ひずみ」と言えば、能動素子の非線形性によって生じる高調波やIMDなどを意味していて、これに関しては、無線、それも自作をやるような人には解説の必要はありません。ところが、直線歪になると、「まったく聞いたことが無い」と仰るかたが殆どじゃないでしょうか?第一、直線なのに「歪んでいる」なんて、言葉からして論理矛盾してるじゃないか・・・・なんて(笑)。ところがどっこい、この直線歪はいたるところで発生しているのです。

 例えば、ある回路網があって、その周波数対振幅伝送特性が、周波数によって振幅応答のうねりというか「変化」する場合に、あるスペクトラムを持った信号(例えば音声信号としましょう)が、この回路網を通過すると、周波数毎に「変形」された応答を得ることになります。なので、オリジナルな入力信号とその出力信号とを比較するとき、その変形分を「歪」と考えることができます。わかりやすく例示するなら、音声を1KHzまでしか通さない回路網に入力すれば、出力信号は高域が無くなった、たいへんに籠った音になりますよね。これは元の信号に較べて「ひずんでいる」と解釈するのです。そうそう、思い出したのですが公称2.4kHzのSSBフィルタでAMを聞いてみてください。この例と殆ど同じ状況を体験できますよね。

 さて、今度は、その回路網が周波数によって遅延時間が変化する特性を有する場合は、通過する信号のある周波数成分は「遅延が少なく」またある周波数成分は「遅延が大きい」なんてことが起こります。例えば、IFフィルタでは、チェビシェフタイプだと、カットオフ周波数付近の遅延時間はセンター周波数に較べて大幅に大きくなっています。こういう特性の場合、回路網を通過した信号がどのように聞こえるか?は定量的に検討した例ってあまり無いのじゃないかと思っています。

 ここでは上記のような、周波数に対する振幅変化に起因する歪と遅延量の変化による歪を「直線歪」と呼びます。それぞれ、振幅歪、遅延歪(遅延を積分した値が位相なので、位相歪と言う場合もある)と一般的には言われています。くどいですが、アナログ回路網では、振幅特性と遅延特性は「不可分」の関係にあります。すなわち、どちらか一方を変化させると、それに伴って他方も変化してしまうのです。ですから、振幅変化がある場合の「音の変化」や遅延時間変化がある場合の「音の変化」を独立に検証することは極めて困難でした(というか事実上不可能です)。

 ここまで読んでいただいた方は、頭が痛くなったかもしれませんが、この定義の部分を共有できないと、先に進むことができないので、しつこく書いています。昔のプロのハイレベル無線資格の教本には、直線歪に関わる内容もあったと聞いていますが(私はそんな資格を持っていないので確証はありませんが・・・てへぺろ:笑)、1アマ程度の(いい加減な:笑)無線工学では、全く要求されないので、殆どの方が知りませんよね。もしかしたらアナログTV関係の資格には必要な知識だったのかもしれませんが。


 はい、脱線しそうなのですが、次は、「じゃぁ、一体どうやってそんな検討をするんだ?」という疑問に答えてみたいと思います。


   <<そこでDSPの応用です>>


 この、回路網と音質の変化って、扱うのは非常にデリケートです。オカルトオーディオで、「抵抗の種類で音が大きく変わる」・・・なんてのと同じで、アナログ回路でいろいろ検討しても、再現性や客観性は殆どないのでしょう。自作IFフィルタなんてブツの評価になれば、なおさらです。ま、自己満足の世界ですから、それでいいのだ・・・との解釈もできますが(な〜〜んて、PWZの作品は殆どがそうじゃないか!という声は、ここでは触れないで置いておきます(大笑))。

 冗談はさておき、昔にDSPを弄っていて、SSBの変調や復調で、とてつもない特性を得たことがありました。SSB変調において、キャリアサプレッションが−90dB、サイドバンドサプレッションも−80dBなんて、アナログ回路では絶対に実現できない特性が安定的に再現できるのです。これに使ったフィルタは、急峻な帯域外振幅減衰特性を持ちながら、帯域内の振幅と遅延は全くフラットという、すばらしい特性を有していました。要するに、上記に解説した「直線歪」が無いフィルタを実現できていたのです。これを思い出したので、ディジタルフィルタの作り方を工夫すれば、実際のIFフィルタの特性をしっかり安定的にシミュレートできると踏んだのです。ここでいうシミュレートとは、PC上で特性を描いて終わりじゃなくて、実際にDSPに「実音」を入力し、DSPに実装したIFフィルタを擬したディジタルフィルタを通過させて、再度、アナログに戻して、「音として」聞いてみることを目標にしています。

 まず、最初に考えたのは、SSBはリニアな変調なので、IFのSSB信号は元の音声と「相似形」だから、IFでフィルタリングする替りに、音声帯域でIFフィルタと同等な急峻なディジタルフィルタを構成して、それで簡単にやっつけてしまおう!という案です。我ながら楽にできそうだなぁと思って始めたのです。

 すなわち、

   音声信号⇒A/D⇒急峻なディジタルフィルタ⇒D/A⇒音声信号

 のプロセスです。IF帯のBPF特性をベースバンド帯というかAF帯にシフトさせて実現するのです。ここで、直線歪はディジタルフィルタで「発生させる」ので、その他の部分は音質には影響を及ぼさないようにしないといけません。ディジタルフィルタ以外の部分では非線形歪も直線歪も無視できる領域で使います。さて、この構想の中で、直線歪の影響を振幅歪と遅延歪みに分解するにはどうしたらいいでしょうか?

 こういう検討の場合、「切り分け」が重要になります。それぞれのディジタルフィルタで、どんな特性が実現できて、何を切り分けるのか考えないといけませんね。なので、候補となるフィルタの特徴を書いておきましょう。

・THROUGH:これはオリジナルの信号を一回DSPに取り込んで、そのまま掃出す。すなわちフィルタは無し。

・FIR@:通過帯域内振幅フラット、遅延フラット、帯域外減衰量は急峻なフィルタを実現する。

・FIRA:通過帯域を狭めて、疑似的にベッセル特性に近づける。帯域内は遅延フラット。帯域外減衰量は「そこそこ」。

・IIR@:楕円フィルタで帯域内振幅は比較的フラット(例えばリップルが0.5dBとか)で、遅延特性はチェビシェフのようにバリバリにピークが立つ。帯域外減衰特性は、次数(タップ数)の割にはものすごく急峻にできる。


 これらを使って、まず

(1)Throughでは、DSP処理の入出力回路による音の劣化がないことを確認する。

(2)FIRAでIFフィルタの振幅特性の劣化(高域と低域)を実現して、FIR@と比較することで、IFフィルタの振幅変化「のみ」の音に与える影響を明らかにする。

(3)IIR@で、遅延特性を劣化させて、FIR@と比較することで、「遅延特性の変化で音がどう変わるか」を明らかにする。

 という計画を立てました。この通りにコトが進めばチョー楽なのですが、思いもよらぬ原因でずっこけることになってしまいました(苦笑)。

 さて、文章ばかりで退屈になってきましたので、ここらで一休みとし、肝心の話はこれ以降に回すことにしましょう。




<IFフィルタの特性とSSBの音質についてA>
 【2016.5.2】


 ずっこけた話からのスタートです(笑)。いままで、FIR@は実際に弄った実績があるので、まずは、IIR@で遊び始めたのですが、例えば、0.3kHz〜2.4KHzの帯域のBPFを急峻に作ろうと思って、実際にプログラムしてみたのです。シミュレーションは12次で行いました。





IIRフィルタ(12次)のシミュレーション


 これを見ると、なかなかいい感じですが、なんだかHPF(低域)がちょっと振動しているなぁと思っていました。でも、まぁ、帯域内の特性が実現できていればいいかと思って、DSPに実装してみたのです。・・・・・・・ところが、全く動きません。大したことをやってるわけではないので、48kspsでは処理遅延に関しては十分余裕があるはずなのですが、動きません。

 では、ということで、次数を下げて行ったら6次まで下げると動き出しました。しかし、こんな低次のフィルタではとっても上記のような評価を行うことができないので、考え込んでしまいました。いろいろ昔の文献を漁るうちに、こんな事実が判明しました(識者には自明なのでしょうが、シロートには初めての知見です:笑)。

@サンプリング周波数に較べて、実働周波数が大きく異なる場合、IIRは収束しない場合がある。
  
(→Fs=48kHzで3kHzの動作周波数じゃぁ・・・)

A同じく単精度だと倍精度の演算に較べて発散しやすい。
  
(→事実なら面倒だなぁ!)

B直接型構成は縦続型に比べて発散しやすい。
 
 (→なんとなくわかります。一気の処理は誤差が累増しそう・・・)

ですと。うーーん、全ての条件が今回の検討に当てはまってしまいます。では、と、Aで演算を倍精度にしたら8次まで発散しなくなりましたが、まだまだこんなものでは、急峻な特性は実現できません。Bは試していませんが、直観的に@の影響が大きいと思ってしまいました。というのは、昔、複素フィルタを用いた400次×2本のFIRをセンター周波数が12kHzで実装したことがあったからです。なので、まずは、センター周波数を12kHz(48kHzサンプリングなので、ナイキスト帯域の半分ですね)でIIRをやってみることにしました。





IIRフィルタ(12次)の実特性



 と、この様に見事に急峻な特性が実現できます。おまけに単精度でも発散しません(笑)。しかし、これでは、当初想定していたAF帯(0.3〜2.4kHz)での比較評価ができなくなってしまいました。さて、どうしましょう?。察しの良い方なら、すぐに解決策が目に浮かぶと思います。何せセンターが12kHzのBPFなら、難なく実現できるのですから。ここまで書けば、すぐに分かりますよね。要は実現できるフィルタの周波数でSSB(DSB)変調しちまえばいいじゃないですか。その変調された信号を、フィルタ通して、復調すれば、目的が達せられます。

すなわち、下図のような評価系になるはずです。

AF信号⇒(A/D変換)⇒(13.5kHzのキャリアと乗算)⇒DSB⇒(IFフィルタ通過)⇒SSB⇒

(13.5kHzのキャリアと乗算=プロダクト検波)⇒(LPF通過)⇒(D/A変換)⇒AF復調信号


(内)はDSP処理 

 てな感じでしょうか? IFが12kHzのディジタルフィルタで、クリフィル(笑)の替りをさせてしまおうというものです。本来ならば、このIFフィルタ後がSSB信号なので、もう一回「受信用」IFディジタルフィルタを通さないと、実系統と同じにならないのじゃないか?という声もあるかとは思いますが、それには、SSB変調にヒルベルト変換器をつかえば、音質劣化無しにSSB信号が生成できるので、それを今回の実験用フィルタで「受信用」IFディジタルフィルタに通してるのと同じですよ!と答えればいいでしょう。要するに、SSBの音声スペクトラムにフィルタを通したら音が変化するか?が見られればいいわけですから。

さて、この動作を一連の写真で確認してみましょう。なお、DSPの実装は以下の図のようになります。




修正:LPFのFcは6kHzです。

DSPの内部動作




 この図は先に説明した処理を書いたものです。一目瞭然ではないでしょうか?この構成の動作を見るために、以下順を追って、動作を説明します。




DSPのTHROUGH特性



 THROUGHでは、DSPにA/Dして取り込んだディジタル信号をそのままD/Aしてアナログ信号に戻しています。20kHzあたりの帯域が減衰しているのは、サンプルクロックが48kHzなので、ナイキスト周波数以下の帯域制限するアンチエイリアスフィルタの特性でしょう。このあたりの特性は、本検討には影響を与えないので、特にいじるつもりはありません。





2トーン入力信号スペクトラム


 これが試しにDSP入力する信号です。1kHzと1.8kHzの2−トーン信号になります。まだ、ここまではアナログ信号です。お間違え無いように。




2-トーン信号をDSB変調


 DSPの内部でIIRフィルタを用いて発生させた13.5kHzのキャリアと入力信号を乗算してDSB信号を作ります。ここでは、DSB信号をそのままD/Aして、スペアナで見ています。なので、見ている信号はアナログですが、DSPの中では、当然ディジタル信号です(当たり前ですが:笑)。DSB変調はプログラムでは単なる乗算を1ライン書くだけですが、ご覧のようにキャリアサプレッションは80dB以上(以前の結果では90dB)が簡単に得られています。




FIR-500フィルタの振幅特性


 ディジタル信号のDSBをSSBにするためのFIRフィルタ(振幅、遅延のいずれも平坦:後述)で、タップ数はなんと500です。極めて急峻な特性ですね。これは、DSPにA/Dして入力したディジタル信号を、FIRフィルタを通過させて、D/Aして得た特性です。いちいち特性を取るのに、プログラムを書き換えなければならないので、けっこう面倒です。




FIR-500フィルタを通過したSSBスペクトラム


 上記のように、ディジタルDSB信号をディジタルFIRフィルタに通過させると、キャリアが13.5kHzのディジタルLSB信号が得られます。これをD/AしてみたのがこのアナログLSB信号です。サイドバンドサプレッションはここでは80dB(実際には90dB)を得ることができます。





プロダクト検波した復調スペクトラム



 さて、上記のディジタルLSB信号に、DSBを作るときに使った13.5kHzのディジタルキャリア信号を乗算(プロダクト検波)させて、得られたAFディジタル信号をD/Aしたのが上図です。めでたく、AFの2-トーン信号が復調されました。よく見ると、ノイズフロアが若干上昇しているのと、ナイキスト周波数付近に、折り返しの信号が若干ではありますが残っています。まぁ、こんな信号はまったく影響がありませんので、問題視しません。それより、超微小でもノイズが乗るというのは「DSPがなにか作業している感」があって、微笑ましいです(大笑)。一応、このあと、エイリアスを切るためのLPF(カットオフが6kHz)をいれたあとにD/Aしています。このLPFはあとで聞けばわかりますが、帯域が広く、遅延偏差もないため、殆ど音に色がつきません。

 上記の一連の動作を見ていると、SSBの実験系をDSPの内部に作りこんだことが解ると思います。IF周波数がサンプリングレートの関係で12kHzと極めて低いですが、起きていることはハイフレのクリフィル(笑)を用いてSSBの実験をしているのと等価になります。くどいですが、これはシミュレーションではなく、実音声をSSB伝送系に通過させて、実体験しているということになります。

 参考までにこのプロセスを書きだしてみましょう。500タップのFIRフィルタを通過させる場合です。


//----------------- Carrier generation ------------------------------
  yn0 = a1*yn1 - yn2;           // y[n] = a1*y[n-1] - y[n-2]
  yn2 = yn1;                 // y[n-2] = y[n-1]
  yn1 = yn0;                 // y[n-1] = y[n]
// yn0=OUTPUT of Generator

//--------------------- DSB Modulation ---------------------------
  y_DSB = (float)r_in*yn0;        // DSB modulation
// y_DSB=(float)r_in;            // for checking FIR direct input

//--------------------- FIR filtering --------------------------------
  x_out=fast_fir(y_DSB, fir_coef, fir_buf, &fir_ix, FIR_LEN);
// l_out=(short)x_out;

//--------------------- Q_B FIR filtering ----------------------------
// x_out=fast_fir(y_DSB, fir_QB_coef, fir_QB_buf, &fir_QB_ix, FIR_QB_LEN);
// l_out=(short)x_out;

//--------------------- IIR filtering----------------------------------
// utmp = (float)r_in;        // direct input
// utmp = y_DSB;          // DSB input
// for (m=0; m<ORDER; m++) utmp = utmp + am[m]*un[m];
// y = bm[0]*utmp;
// for (m=0; m<ORDER; m++) y = y + bm[m+1]*un[m];
// for (m=ORDER-1; m>0; m--) un[m] = un[m-1];
// un[0] = utmp;
// l_out = (short)y;         // OUT=filtered output for check

//---------------------- DSB output--------------------------------
// l_out=(short)y_DSB;//DSB output   //DSB output
// y_DSB=y_DSB*yn0;
// l_out=(short)y_DSB;       //Filter-less DSB mod-demo output

//----------------------Carrier output ------------------------------
// l_out=(short)yn0;         //carrier out

//----------------------DEM product det-----------------------------
  lpf_in=y_DSB*yn0;        //product DET for DSB signal
// lpf_in=x_out*yn0;         //product DET for FIR output
// lpf_in=y*yn0;           //product DET for IIR output
//-----------------------
  lpf_in=lpf_in*4.0;         //gain up for IIR FIR QB
// lpf_in=lpf_in*2.0;         //gain up

//-----------------------LPF(image killer) filterd------------------------
// lpf_in=(float)r_in; lpf_in=lpf_in*0.8;   //for checking FIR LPF and scaling to other BPFs
  lpf_out=fast_fir(lpf_in, fir_lpf_coef, fir_lpf_buf, &fir_lpf_ix, FIR_LPF_LEN);    // immage killer
  l_out=(short)lpf_out;            //output



 実はコメント指示「//」をオンオフすることで、フィルタを交換したり、動作検証のために、途中からディジタル信号を取り出したりしていて見苦しいですが、時間がもったいないので、自在にフィルタや、信号を取り出すポイントの切り替えをプログラムするのは止めました。何度も測定動作をするのでなければ、こんなやり方でも間違えないで動作検証ができます。この部分は、1/サンプリング周波数の時間(=20.8μs)で割り込みがかかるので、その間に処理しないといけません。FIRフィルタだけの処理ならば840タップまでは処理可能なので、上記のレベルの動作なら、何をやっても楽勝です。しかし、こんな数行のCプログラムでSSB発生、フィルタリング、復調ができるのですから、DSPって面白いですよねぇ。もちろん、定義部や、定数の設定などは省きまくりですが、なんとなく雰囲気はつかめると思います。

 さて、サンプルフィルタで、DSP内実験系(?)の動作が確認できたので、次は、IFフィルタのチューニングに移っていくことにしましょう。

 先に、比較すべきフィルタを3種類挙げました。これらについて、特性の詳細をみておくことにしましょう。

@FIR-500(振幅、遅延平坦型





FIR-500フィルタの振幅&遅延特性



 さきのDSPの動作例のところで示したこの写真は、BW=2.5〜2.6kHz(−3dB) シェイプファクター=1.3という超急峻なFIRフィルタです。500タップも取ると、こんなフィルタが普通に出来上がります。もちろんIFが12kHzという「今だに可聴域」ですが(笑)。キャリアポイントは13.5kHz(LSBを利用時)となります。この場合、−3dB点との周波数差は250Hzですから、通過帯域は0.25〜2.75kHz(−3dB)と言うことになります。

遅延特性に至っては−3dB振幅点近くでは64μSしか暴れません。殆ど平坦と考えていいと思います。

AIIR-12(振幅は0.5dBリップルあるも準平坦、遅延は鋭いピークあり





IIR-12の振幅&遅延特性


 12次(低域、高域がそれぞれ6次相当)で構成しています。−3dB幅が2.5kHzで、シェイプファクターが1.5になります。実は、この特性は、最近話題になたことのある、新しいクリフィル(笑)の構成法に則って実現したデータを参考にしてあります。そのデータでは振幅特性しかわからなかったのですが、楕円フィルタであれば、遅延特性も殆ど一致するのではないかという仮定に基づいています。一方、遅延時間差のピークは1.8mSで、ここでトリオのクリフィル(笑)を見ると、似たようなBWで遅延時間差のピークが1.7mSでしたから、実物ともよく符合することがわかります。遅延時間の特性はIF周波数とは独立で、3395kHz(クリフィル)でも、12KHz(DSPのIIRフィルタ)でも、帯域特性が似ていれば遅延時間特性も類似な値になります。


BQB-FIR-100(振幅は山形、遅延平坦型)





QB-FIR-100の振幅&遅延特性


 次に振幅特性の低域と高域を減衰させた特性を考えます。遅延特性はFIRなので平坦です。これは通過帯域と減衰領域の境界周波数を離すことで、実現できます。次数は100次として、帯域外減衰量は欲張っていません。最初は、ベッセル特性のフィルタを考えたのですが、設計手法が見当たらなかったので、こんな構成手法を採用しました。遅延が平坦なので、振幅特性の劣化による音声の変化が解ればと期待しました。

 最期にこれらのフィルタの振幅特性だけをまとめて比較できるようにしておきましょう。




3種類のフィルタ比較



 FIR-500とIIR-12はキャリアポイントにおける減衰量が−30dBと一致しました。こうして比較してみるとFIR方がIIRよりほんの若干ではありますが帯域が広いようです。QB-FIR-100は+/-1.2kHzですでに7dBくらい振幅が減衰しています。高域と低域の減衰がどんなふうに聞こえるか楽しみです。

 ここで、測定系について記述しておきます。




測定系


<原音>
 これは、著作権フリーな音声ファイルを使いました。ここからダウンロードできます。こういった、差分を見るための原音ファイルは標準音声から選んでみました。HAMの交信は年配者が多いので、しわがれ声で満ち満ちていますが(苦笑)、評価用には、生きのいい、男性アナウンサーと思しき声を使ってみました。著作権フリーなので、喋っている「内容」については、ちょっと場違いなのをご容赦ください(何せ、血眼で標準音声のサンプルファイルを探したわけではなかったので:笑)。まぁ、ハムの交信をサンプルにしても、微妙なフィルタの音声特性の差は、決して見えてこないので、ちゃんとした原音を選ばざるを得ません。原音はかなり張りのあるいい声ではないかと思います。

<再生、録音>
 DSPの入力はPCのヘッドフォン端子(ローインピーダンス)から取得し、DSPの出力はPCのLineに入力しています。音声録音ソフトは簡易的ですが、とりあえずちゃんとした録音のできる、「Moo0ボイス録音器」という手軽なものを使っています。音声ファイルを画像とコンバインして、MP4ファイルを作るにはマイクロソフトの「Movie Maker」を使っています。

 というセットアップです。これだと音響装置の影響を最小限に留めることが出来ると思います。例えば、DSPからスピーカで音をださせて、デジカメやホームビデオで撮ると、スピーカや(通常はあまり特性を考慮されていない)デジカメの録音マイクの特性が入り込んでしまって、一体、何をやってるのか解らなくなります。もともと3kHz以下の帯域しか持たないSSBの音声信号でも、「音の評価」と銘打つからには、出来る限りIFフィルタの影響「だけ」を抽出したいものです。



 ということで、これから、採取した音を聞いていきましょう。YoutubeMP4ファイルを作成してアップしてみました。以下の画像をクリックしてみてください。Youtubeに飛びます。




原音⇒Through⇒DSB変調復調時の音声



 まずは、原音と、それを測定系に通したときの音の変化を順に聞いていきます。まず原音を聞き、それをDSPのA/D→D/Aした時の音が続きます。さらには、DSB変調とプロダクト検波を行った、要するに、IFフィルタの影響を除去した音を聞いてみます。ThroughではLPFの影響が極く少しあるのか、若干帯域が狭まった音に聞こえます。しかし、このあとDSBの変調、復調を経ても、その変化はわずかです。まぁ、このあとのIFフィルタによる、音の変化を考えれば、殆ど、気にしなくていいレベルと認識しています。なので、これ以降のMP4ファイルはDSB変調・復調を実施した音を最初に置いて、そのあと、フィルタを挿入してでどう音が変わるか?という比較形式で作ってみました。なお、キャリア周波数はこれ以降のIFフィルタの中心周波数から1.5kHz離れた13.5kHzに統一しています。




DSB変調復調⇒FIR-500⇒IIR-12⇒QB-100


 これで、一気に3種の音の違いをみることが出来ます。リファレンス音であるDSB変復調時の音から、各種フィルタを通過させた音をまとめてみました。まずは、振幅・遅延のフラットなFIR−500の通過音です。これを聞くと帯域が狭まる効果を如実に経験できますね。リファレンス音に較べて、かなり狭い帯域の音になります。ただ、ハムの交信と違って、熱雑音が無いので、音声そのものが際立っているからか、帯域の狭さが強調して感じられますね。

次は振幅が準フラット、遅延のピークが大きいIIR12の音ですが、一見、FIR500とあまり変わらないような感じがしますが、良く聞くと「痩せた」音ののように聞こえます。ただし、FIR500に較べてドラスティックに変わるという感じではありません。これは意外な結果に見えますが、例えば、トリオのクリフィル(笑)はIIR-12と同じような特性なので、トリオの復調音を考慮すると、この音はめちゃ劣化しているというわけではないと考える方がいいかもしれません

さらには、QB−FIR100の音ですが、これは、明らかに低音不足の迫力の無い音になります。高域も削がれているためか声の艶が一層なくなっていますね。このようなQB-100の特性は、ラダータイプのフィルタで損失の大きなクリスタルを用いるとよく現れる特性ですね。例えば、昔のムラタのSSB用セラフィルで、似たような振幅特性のものがあり(ここまで高域と低域が減衰していない)、実際にここで使っていますが、似たような傾向の音になります。

 しかしながら、上記の差異は、特に遅延時間偏差の影響を見ようと思っていたFIR500とIIR12では、無茶苦茶大きな差が無かったので、もう少し、差異を明らかにするために、検討を続けてみたいと思います。まずは、遅延時間の影響を少し強調してみることにしました。そのために、新たなフィルタを作成してみます。





IIR-12(delay)の振幅・遅延特性



 追加したIIR12(delay)は、通過帯域を極力IIR12と同じにして、遅延時間のピークを大きくして設計しています。その分、保証減衰量を40dBと低下させていますが。この様子を以下の図に示します。以前のIIRフィルタに較べて、遅延時間のピークを3.2msと大幅に増加させました。これは、帯域外減衰量の傾きを急峻にすることで実現しています。ただし、通過帯域は殆ど変わりはありません。なので、遅延時間の乱れを音として知覚するには好適だと考えます。




DSB変調復調時⇒FIR-500⇒IIR-12(delay


 振幅、遅延特性のフラットなFIR-500に較べて聞いてみると、音が「痩せた」感じがさらに良くわかると思います。周波数域を考えると、遅延特性が劣化している300Hz〜600Hzの特性が、(男性の)音声にはより多くの影響を与えるのではないかと考えています。


 次に、振幅、遅延のフラットなFIR-500の帯域について、低域と高域を伸ばしてみます。使ったIFフィルタは以下のようなものです。





FIR-200の振幅・遅延特性


 FIR-500に較べて次数を減らして帯域を広げました。低域は100Hz、高域は3.0kHz程度まで通過するようにしてみました。




DSB変調復調時⇒FIR500⇒FIR200


 音を聞くと、FIR-500に対して明らかに低域の伸長効果がでており、また少し「つやっぽい」原音の傾向が見えています。このように、当たり前といえば当たり前ですが、帯域拡大の効果は忠実度の点では、明らかに良い影響を及ぼします。

 上記の結果からは、あまり確定したことは言えませんが、IFフィルタにおける遅延特性の劣化は、音の「痩せ」になって現れるような気がします。ただ、そのメカニズムについては良くわからないし、そもそも、「痩せ」ってなんだ?と問われても、この実験で得られたような音としか言いようがありません(笑)。しかしながら、急峻な振幅特性を実現すれば、遅延特性も劣化し(←これはアナログIFフィルタの事ですが)、通過した音声信号も確実に影響を受けるということは分かりました。

 なので、単に振幅特性だけを、超急峻に設計して、仮にそれが設計どおり実現でき、実装で特性が乱れなくても通過音が劣化しないということは有り得ないということです。

 もちろん、IFフィルタを実機に実装時の振幅、遅延特性を測るなんて、よほどの物好き(酔狂ともいう)しかやりませんので、実際のところ、設計したIFフィルタが実機でどういう特性になっているかなんて、普通は知る由もありません。おまけに、今回のように、かなり特性に気を配って評価したつもりですが、音の違いはそう大きいものでもありません。なので、少なくとも、IFフィルタの音を評価するために、HAMの交信音声を、設計したIFフィルタを実装した受信機で評価しようとしても、いろいろな誤差要因(フィルタ実装特性、録音機器の特性、交信音声の不安定さ等)が大きくて、なかなか難しいなということだけは明らかになりました。

 こんなに引っ張って、結論はその程度かい?とせせら笑われそうですが、そういう方には、是非とも、新しいアプローチ法を起案していただいて、ちゃんと実験し、IFフィルタの通過帯域特性とそれを通過した音の関係を明確にしていただきたいと思っています。いろいろ薀蓄のある方のご批判はあろうかと思いますが、何せ、シロートが初めて実行した手慰みですから、そのあたりは斟酌いただけると幸いです。ただ、不備なところがあれば、少しずつ改訂するつもりではいます。