« 2026年3月 | トップページ | 2026年7月 »

2026年6月

2026年6月29日 (月)

RIAAフォノイコライザをIIRデジタルフィルタで実装する ⑥ z-2項をシフトする理由

この記事は

RIAAフォノイコライザをIIRデジタルフィルタで実装する ①準備編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ②係数計算編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ③シミュレーション編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ④実装・評価編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ⑤Octaveによる位相検証

の続編です。

過去記事

RIAAフォノイコライザをIIRデジタルフィルタで実装する ②係数計算編

の中で、フォノイコライザのアナログ伝達関数(sドメイン)を双一次変換によってデジタルの伝達関数(zドメイン)に変換するという計算を行った。この内容をもう一度書くとこうだ。まずフォノイコライザのアナログ伝達関数は

Analog_eq    (式1)

であり、sとzの関係は

Sz  (式2)

で、ただしこれはsについて解こうとすると複素数の対数になるので、計算が困難となるため、次の式で近似する。

Sztransfer  (式3)

式1に対して、式3の変換式を代入して整理すると、フォノイコライザのデジタル伝達関数(zドメイン)が得られる。このときの計算結果から、全体にかかる定数項を省くと次の式が得られる。

Digitaleq_org   (式4)

ところが、よく使われる式は、分子のz-2項の係数をz-1項にシフトしてz-2項はネグる、すなわち

Dijitaleq_20260629162801   (式5)

という形になっていて、それがなぜだか謎だったのだ。今回はこの理由がわかったので、書いておこうと思う。
上の式のままだとどうも目がチカチカするので、もう少し実用的な形に書き直すと以下のようになる。

96kriaaorg  (式6)

96kriaa (式7)

式6は96kHzサンプリングのRIAAイコライザのデジタル伝達関数、式7は式6のz-2項をz-1にシフトして、z-2項をネグった、よく使われる形。
元記事を書いた当初、なぜこういう操作をしているのか、理由がわからなかったのだ。

ところが先日、パラメトリックWAVプレーヤーの記事を書くために調べ物をしていて、とうとう理由を見つけたのだ。
式4の分子を取り出して因数分解すると次のようになる。

Shiki8  (式8)


ここで、デジタル周波数応答を見るときの前提として

Ztos (式9)

であり、ここでのωは1サンプル進むごとに位相がどれだけ進むかを表していて、たとえばω=0(直流)では位相は進まずz=1、ナイキスト周波数の場合は、サンプリング周波数の半分なので1サンプルごとにω=180deg、つまりラジアンでπなので、

Photo_20260629160101(式10)  (オイラーの公式より、-1)
なので、

Z1
Nyquist (式11)

つまりナイキスト周波数のとき式11が成り立つ。そうすると、式8の
1z1
の部分は、ナイキスト周波数で0点ということになり、つまりナイキスト周波数ではゲインが0(伝達関数が0)になることを示している。
フォノイコライザの実装上、ナイキスト周波数で0になるという性質は不要で、しかも再生周波数にナイキスト周波数が近いと影響が出て、高域でゲインが低下することになる。なので式8のこの部分をネグって1とすると、最終的に式5になる、というのが真相のようだ。

過去記事の
RIAAフォノイコライザをIIRデジタルフィルタで実装する ⑤Octaveによる位相検証
でこの部分をネグらなかった場合とネグった場合の比較をしているが、96kHzサンプリングで、ネグらないで実装した場合、20kHzのゲインが1.4dBほど下がってしまうという結果になっている。一方、ナイキスト周波数でゼロになる部分をネグったよく見られる実装では、ゲインの偏差は+0.5dBほどだった。なので辻褄は合っている。

これはよく考えてみるととても面白い現象で、もとのアナログ伝達関数(sドメイン)で周波数を無限大に飛ばしたときにゲインが0になる、という事象が、デジタル伝達関数(zドメイン)ではナイキスト周波数でゲイン0という事象に変換されたことになる。まるで無限に広がっていた宇宙に対して、ドメイン変換したらナイキスト周波数というブラックホールが現れて、高域の周波数軸が歪んで吸い込まれてしまうような感じに見える。

実際のところ、比較記事では、ネグらなかった場合は高域ゲインが若干下がる代わりに位相は正しく、ネグった場合はゲインはごく僅かに上る程度に留まった分、位相はかなり回ってしまうという結果になっており、計算の正当性から言えば、どちらかというとネグらないほうが正しいような感じもする。しかしながら20kHzで-1.4dBという結果は聴感に影響があるため、世間では高域が下がらない方を選んでいる、というのが本当のところのようだ。

| | | コメント (0)

2026年6月27日 (土)

パラメトリックWAVプレーヤー

今回は、再生音質をパラメトリックイコライザーで調整して出力することができるパラメトリックWAVプレイヤーアプリをリリースしたので、その紹介です。

BOOTHにて公開しています!

最新版 ダウンロード
更新履歴
3.0.2 randomモードで再生ボタンを押した場合の一曲目もランダム化しました。
3.0.3 一部のサウンドデバイスで、WASAPIモードでの再生できなかった不具合を対策しました。
3.0.4 プレイリストを一括消去するDel All、および複数選択による一括削除を追加しました。

これはWAVファイルのデジタルデータを直接IIR(Biquad)フィルタにかけて、音質調整をして出力することができるWAVプレイヤーで、結論を先にいうと、周波数特性の改善だけではなく、同時に位相特性も改善されて、定位感が大幅に改善します!びっくり(@_@)

きっかけはオーディオ仲間の I さんからの電話でした。いわく、
「おもしろいDACの製作記事を見つけたから作ってみたらなかなかよかったよー(^-^)」

そのおもしろいDACとは、この記事で紹介されているRaspberry Pi PICOを使ったものです。
この作者は、スピーカー単体特性を苦労して改善するよりも、ソースのイコライジングで特性を補うほうが合理的なのではないか?というアプローチをしていて、そのひとつの答えとして、PICO2を使って、8段のパラメトリックイコライザを内蔵したDACを開発し、最終的にスピーカーから出力される音の周波数特性を改善するということを実現しています。
ぼくも実際に作ってみましたが、なるほどとてもよくできていて、安価でコンパクトでしかも効果的です。すばらしい!(^-^)!

ぼくもこれをシステムに組み込んで使おうかとも考えたのですが、いくつか気になる点がありました。
・DACチップ一体で作っているため、DACチップの置き換えなどができず、たとえばSSDACを使おうとするとSSDACに組み込まなければいけない。
・PICOのベースクロックはUSBの48MHzに合わせて作ってあるため12MHzであり、たとえばCD系(44.1kHz)の11.2896MHzのクロックはどうしても割り切れない系のPLLに頼らざるを得ない。

それならPCのアプリとして作れば、フィルタの段数も増やせそうだし、出力をUSBのDACにすれば選べるし、そのほうがよさそうだな……
と考えて、とりあえずC#を使ってコンソールでWAVを再生する実験をして、そのあとBiquadフィルタを実装して通す実験をしたところうまくいったので、それならカタチにしよう!と思って、コツコツと作り始めました。

カタチとしては、パラメトリックフィルタを内蔵したWAV専用のプレーヤーアプリで、対応フォーマットは44.1kHz、48kHz、88.2kHz、96kHzのWAV、出力は接続しているUSBサウンドデバイスが選択できて、WASAPI出力も選べるようにしました。
内臓のフィルタは、パラメトリック(ピーキング)フィルタが左右独立で30段、ローシェルフ、ハイシェルフフィルタが左右独立で各一段、それに係数を任意に設定できるBiquadフィルタを左右独立で5段としました。またダイレクトリッピングしたアナログレコードを再生できるように、フォノイコライザも内蔵し、フォノイコライザの特性はRIAA、NAB、Colombia/LP、Decca、AES(2種)、Old RCA(4種)と、合計10種類で、ほぼすべての特性をカバーしています。
(このうち、パラメトリック16段、Low Shelf、High Shelf、Biquad3段、RIAAフォノイコは無料でお使いいただけます。 )

アプリのUIはこんな感じです。

Photo_20260627143001
図1.Parametric Wav Playerの外観

上側にある小さな窓がプレーヤー本体で、後ろに写っている大窓がフィルタ設定画面です。

このアプリは、単にちょっと凝ったトーンコントロールと、任意設定できるデジタルフィルタを内蔵したプレーヤーだと考えて、面白がって音質をあれこれいじって再生するという使い方が手軽にできますが、作者の目的は、視聴位置での周波数特性を改善することにあります。

実際に自室のシステムで試してみたので、以下に紹介します。


今回の目的は、部屋の視聴位置でのスピーカーの周波数特性を改善することです。
大きな方針としては、視聴位置に測定用のマイクを設置して、スピーカーからホワイトノイズを出力したときに、マイクで拾った信号をFFTで観察して、フラットになるようにフィルタを設定する、ということです。
FFTはWaveSpectra を使う方針ですが、WavSpectraは低域が正確に測れないので、先にREWUMIK-1を使って、視聴位置での音場特性を測ります。

まず、普段使用しているスピーカーですが、Auratone5CとVictorのSX-100を直列にして、無帰還アンプで鳴らしています。スピーカーはどちらも12.5Cmフルレンジユニットが使われています(写真1)。

Sp_system
写真1.使用しているスピーカーシステム

これをUMIK-1とREWで、視聴位置で測定した結果を図2に示します。

Rew

図2.視聴位置での音圧周波数特性(赤線)


これは想像していたよりだいぶひどい特性です(^-^;
以前、Auratone5Cは軸上10センチの位置で特性を測ったことがあって、その結果は図3のようでした。


Image
図3.Auratone5Cの軸上10センチでの音圧周波数特性


この特性を見る限りでは、低域が物足りないものの、全体としては素直で悪くないものでしたが、2mほど離れた今回の視聴点ではずいぶん特性が変っています。
さて、それでは図2の、REWで示された視聴点の特性から、まず低域のローシェルフフィルタと、高域のハイシェルフフィルタの設定を仮決めしておきます。ローシェルフ、ハイシェルフフィルタは図4、図5に示すような特性のフィルタです。この例ではカットオフ周波数Fcに対して、Gain15dB、Q=0.8を設定した場合を示しています。


Lowshelf000 Highshelf000
図4.ローシェルフフィルタ            図5.ハイシェルフフィルタ


つまりカットオフ周波数から下のゲインを調整するのがローシェルフで、上のゲインを調整するのがハイシェルフフィルタです。
さきほどのREWの測定結果から、ローシェルフとハイシェルフのフィルタ特性を次のように仮決めしました。

Low Shelf:Fc=75Hz、Gain=15dB、Q=0.7
High Shelf:Fc=14kHz、Gain=12dB、Q=1.0

まずこの設定でフィルタをかけて調整を進めていきます。

本アプリでのフィルタをかけた状態でスピーカーの音場特性を測るには、UMIK-1とWaveSpectraを使います。REWは内蔵音源を使う測定なので、本アプリを使った測定はできないからです。
ホワイトノイズを録音したWAVファイルを用意して、それを本アプリで再生し、視聴位置にUMIK-1を設置してここで集音した信号をWaveSpectra で観測します。

まずは、フィルタを一切かけない状態での初期状態の特性を図6に示します。


20260626ws000
図6.初期状態の視聴位置でのスピーカー音圧特性


これは先程のREWで測定した図2の特性とおおむね一致しています。

ここに先ほど決めたローシェルフ/ハイシェルフフィルタの設定をアプリに入力して、フィルタOnして測定したものを図7に示します。


20260626ws001lshson110mark
図7.ローシェルフ/ハイシェルフフィルタをOnにした音圧特性


これで高域が改善しているのがわかります。
次に、この図で○印をつけた110Hz付近にディップがあるので、これをParametricフィルタで改善します。設定は次の通り。

Fc=110Hz、BW=0.2、PeakGain=8dB

説明が前後しますが、Parametricフィルタ(Peaking Filter)の特性を図8に示します。この例では、中心周波数Fcに対して、PeakGain=15dB、BW=1.0を設定しています。


Peaking001
図8.Parametric(Peaking)フィルタの特性

Parammetricフィルタは、特定の周波数のゲインを増減するフィルタなので、ここでは110Hz を狙って8dB 上げる設定をしています。
このフィルタをOnして測った特性を図9に示します。

20260626ws002_110hzon992mark
図9.110Hzの改善結果と、992Hzのピーク


これで先程の110Hzのディップが解消しました。次に992Hz付近にピークがあるので、これをつぶします。

Fc=992Hz、BW=0.2、PeakGain=ー8dB

これで、特性は次のようになりました。

20260626ws003_992hzonmark
図10.992Hzの改善


このようにして、全体にわたってディップとピークを地道につぶしていきます。
だいたい満足なところまで行った結果を図11に示します。

20260626ws004_20k
図11.全帯域改善


これで目立つ凹凸を消すことができましたが、10kHz以上が少し下がっています。これを次のように改善します。

Fc=20kHz、BW=0.5、PeakGain=9dB

すると次のような特性が得られました。


20260626ws005_last
図12.最終調整結果


もう一度最初の無調整の図6を再掲しますが、大幅に改善していることがわかります。

20260626ws000
図6.初期状態の視聴位置でのスピーカー音圧特性(再掲)


さてこれでいよいよ実際に音楽を聞いてみます。
当然ながら低域と高域は改善されているので、低域の厚みと高域のヌケ感が改善されることは予想できますがはたして……


(@_@;


まさにこんな感じの印象でした!
低域と高域のレベルが改善されたのは当然なのであまり驚かなかったのですが、それでは何に驚いたかというと、定位感が大幅に改善したことに驚いたのです。
長いことオーディオをやっていますが、これほどの改善効果を体験するのは非常にめずらしく、思い返してみれば50年近く前に、カセットデッキのアジマス調整をしたときに、霧が晴れるように音質が改善したあの時の感動に匹敵するほどの衝撃です。

音圧の周波数特性を改善したことで、なぜ定位感が改善したのか?
これは考えてみれば当然かもしれないのですが、音圧の変化と位相特性は最小位相の範囲内では表裏一体であり、音圧特性を改善すれば位相特性も同時に改善するということです。これはたとえば、フォノイコライザの補正カーブは必ず一意に位相特性を伴い、逆特性で戻せば位相特性もフラットに戻る、というのと同じことです。
しかしこれはゲインと位相が常に一意に変化する最小位相系に限った現象であって、たとえば壁からの反射による影響や、スピーカーからの距離の差によるような非最小位相系は改善されません。それでも今回は目を見張るほどの改善がありました。

以上のように、今回は想像をはるかに超える効果を得ることができました。
みなさんにもぜひ体験していただきたいと思いますし、マルチシステムを使っておられる場合はどのような効果が得られるのか、ということにも興味があります。
本ソフトはトップにリンクした通り、BOOTHからダウンロードでき、詳しい操作説明はマニュアルが同梱されていますので、興味のある方は参照してください。

マニュアルだけここに貼っておきます。

ダウンロード - parametricplayermanual.pdf



【20260628追記】
このアプリに搭載したフォノイコライザについて解説しておこうと思います。
じつはこのアプリに搭載されたフォノイコライザは、ちょっとした目玉だと思っています。というのは、現存するであろうほぼすべてのイコライザ特性を網羅しているからです。
フォノイコライザのIIRデジタルフィルタへの実装については、過去記事で書いていますので、参照してください。

【参考記事】
RIAAフォノイコライザをIIRデジタルフィルタで実装する ①準備編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ②係数計算編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ③シミュレーション編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ④実装・評価編
RIAAフォノイコライザをIIRデジタルフィルタで実装する ⑤Octaveによる位相検証
RIAAフォノイコライザをIIRデジタルフィルタで実装する ⑥ z-2項をシフトする理由

さて、今回はもっとも普及しているRIAA規格を始めとして、現存する規格を網羅して合計10種類のフォノイコライザの規格をカバーしています。このアプリに搭載しているフォノイコライザの規格と、その時定数は次の表1に示すとおりです。

表1.搭載したフォノイコライザの時定数
Eq_constant

RIAA以外の規格については、時期によって数値が変ったりするものもあり、判然としない場合もあります。
たとえばNAB規格は、最初期にはT1=2242として発表されましたが、後にColombia/LPとの互換性を考慮してT1=1592に変更されたと言われています。このあたりが、NABとColombia/LPが混同されたり、「ほとんど近い」と言われる理由のようです。
AESについては、高域時定数T3に諸説あり、オリジナルの規格はT3=63.6とする説が有力ですが、後にRIAAとの統合プロセスを考慮し、T3=75として扱っているイコライザーも存在したようです。
old RCAの規格についてはさらにややこしく、RCAがLP製造を開始した最初期の規格はT2=265、T3=63.6だったと言われています。しかし一部の文献や、のちのヴィンテージ機器では、T2=199、T3=75としているものが存在します。T2=265、T3=75や、T2=199、T3=63.6という組み合わせについては文献がありませんが、念のため搭載しました。

これらの定数に対して、Biquadフィルタに実装する公式は次のとおりとなっています。時定数T1~T3は上述の通り、Fsはサンプリング周波数です。これはフォノイコライザの伝達関数を双一次変換(BLT)でデジタルに変換したものです。


Dijitaleq_20260629162801  (式1)


このソフトで実際に信号を処理した場合の理論値と実測値の結果を表2に示します。Fsは96kHzで測定しています。
なお、理論値については次の式2によって求められ、表2の数値はいずれも1kHzのゲインを0に正規化しています。

Gainfomula  (式2)

表2.フォノイコライザ各規格の実測値(Fs=96kHz)
Eq_actualvalue

測定は正弦波を入力し、20Hzでサウンドカードの最大出力がクリップしない値(約5Vp-p)に設定し、そこから同じ入力条件のまま
周波数を徐々に上げて、20kHzまでについて、デジタルオシロのカーソル機能で振幅(p-p)を計測しました。
20Hzで5Vp-pでも20kHzではおよそ40dB下がって50mVほどになるため、ノイズの影響や読み取り精度を考慮すると16kHzや20kHzの
測定精度はやや低いです。
また過去の記事でも検証しましたが、式1の計算では、サンプリング周波数が下がるほど高域のゲイン特性が若干上がる傾向が出ます。
そのためか、いずれも周波数が高い方で誤差がプラス方向にやや高めに出ています。
しかしながらいずれも1dB以内の誤差におさまっているので、まあまあなのではないでしょうか。


参考サイト
簡単なデジタルフィルタの実装

Audio-EQ-Cookbook

 

| | | コメント (0)

« 2026年3月 | トップページ | 2026年7月 »