« RIAAフォノイコライザをIIRデジタルフィルタで実装する ②係数計算編(2022/2/26修正追記) | トップページ | RIAAフォノイコライザをIIRデジタルフィルタで実装する ④実装・評価編 »

2020年10月26日 (月)

RIAAフォノイコライザをIIRデジタルフィルタで実装する ③シミュレーション編

前回まででRIAAイコライザをIIRデジタルフィルタに実装するための係数が計算できた。
今回は計算した係数でRIAAイコライザの特性がちゃんと得られるかどうか、シミュレーションを行い確認する。

まずはEXCELによるシミュレーション結果から。

表5.双一次変換法(上)とインパルス不変変換法(下)による係数のシミュレーション(96kHz)
Bilinear_impulse96_20201026172001

これは前回のブログで紹介したものの再掲だ。96kHzサンプリングで双一次変換とインパルス不変変換それぞれの係数計算結果によるもの。
上の段が各係数、下の段が各周波数ごとの理論値からの誤差だ。振幅特性を見る限りインパルス不変変換のほうがほんの少しだが良い結果になっている。

次に、サンプリング周波数48kHzの場合。

表6.双一次変換法(上)とインパルス不変変換法(下)による係数のシミュレーション(48kHz)
Bilinear_impulse48_20201026172001

サンプリング周波数48kHzでは10kHzを超えたあたりから徐々に振幅特性に誤差が増え始め、20kHzではおよそ+2.3dBの誤差が出ている。デジタルフィルタではナイキスト周波数(サンプリング周波数の半分)に近づくほど誤差が多くなる。これを回避するにはサンプリング周波数を上げるか、補正する特性を持たせる。

こんどはネットで見つけてきた係数。Githubのフォーラムでmoc.liamtoh@0691_ptj氏が投稿したもの。

表7.Githubで見つけた係数によるシミュレーション(上:48kHz 下96kHz)
Github_moc_48_96_20201026172001  

この係数は誤差が非常に優秀で、48kHzサンプリングにおいても20kHz信号の誤差が0.035dBとなっている。係数を見るとb2が存在しているので、特性の補正用に一段追加しているようだ。
補正項を追加すればポールが増えるので位相特性も変わってくるが、そのあたりはどのように考えるのか、今後機会があれば検討してみたい。

経験的に、耳で聴いて変化がわかる最小音圧レベルはおおよそ1.5dB程度なので、2倍の余裕をみても0.8dB程度に収まっていれば問題はないのではないかと、個人的には考えている。

以上の誤差の評価はEXCELでのシミュレーションによるもの。やりかたは次のとおり。
まず、評価したい周波数(20Hz,100Hz,1kHz,10kHz,20kHz)のサイン波のデータを作成する。
今回は4800サンプル分のデータを使用した。サンプリング周波に応じてサイン波を生成する。

①A行に0~4800のセルを用意
②B行にA/サンプリング周波数(たとえば96000)→サンプリング単位時間
③C行に20Hzのサイン波を生成するとすると、SIN(2*PI()*20*B)

これを4800までのセルに順送りすれば、サンプリング周波数に応じた任意の周波数のサイン波のデータが生成される。
これらのデータを今回生成した係数を持つRIAAイコライザに通すには、
Yn ・・・式18
を上で生成したサイン波のデータに対して順次計算すればよい。
x(n)が現在の入力データ、x(n-1)がひとつ過去の入力データ、x(n-2)がふたつ過去の入力データ、y(n-1)がひとつ過去の出力データ、y(n-2)がふたつ過去の出力データで、これらについて上の式の計算を施して、現在の出力y(n)を得る。
注意することは、最初のデータを処理する時点では過去のデータがないので、初期値として過去2つ分のデータとして0を与えてやる。これはハードウェアに実装する場合にも注意が必要だ。値が不定だとエラーになったり誤動作したりする。

簡単なので各自自力で試してみてほしい。

次に、フリーソフトのAudacityをつかったシミュレーションについて説明する。

Audacityは音声編集ソフトだが、デジタルフィルタの係数を入れるとシミュレーションを行い、スペクトル表示や数値のテキスト出力ができる。たとえば上で紹介した96kHzサンプリングの双一次変換法による係数を入れると次のようなシミュレーションができる。

Audacity1
図9.Audacityによるシミュレーション スペクトル表示



Audacity2
図10.Audacityによるシミュレーション テキスト出力

 

使い方は簡単で次のとおり。

①Audacityを起動
②左下ペインでプロジェクトのサンプリング周波数を選ぶ。上記の場合は96kHzなので96000。
③ホワイトノイズを生成する。ジェネレータ→ノイズ→white、Amplitudeは0.1とする。(大きいと係数によっては飽和してしまう)
④ctrl+Aで波形を全部選択
⑤道具箱→Nyquistプロンプトで
(biquad-m s 1 -0.96777105 0 1 -1.866859545 0.86728426)
と入力。数字は係数b0,b1,b2,a1,a2をスペース区切りで入力。スペースとカッコもすべて半角。
⑥OKを押すとシミュレーションされ、波形が変わる。
⑦解析→スペクトル表示で図9のスペクトル表示ができる。
⑧スペクトル表示窓の「書き出し」を押すと、図10のテキスト出力ができる。

注意点は、②のサンプリング周波数設定と④の波形全部選択を必ずやること。
テキスト出力は周波数が整数で出てくれないところがちょっと使いにくいが、それでも非常に便利だ。
各周波数ごとのゲインの理論値は

Riaa_formura_20201017230801・・・式9

なので、この式を使えば、Audacityの出力した周波数のゲインの理論値が計算できるので、EXCELを使えばエラー表が作れる。


「RIAAフォノイコライザをIIRデジタルフィルタで実装する」プロジェクトの理論はこれでおしまいです。
おつかれさまでした。

|

« RIAAフォノイコライザをIIRデジタルフィルタで実装する ②係数計算編(2022/2/26修正追記) | トップページ | RIAAフォノイコライザをIIRデジタルフィルタで実装する ④実装・評価編 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« RIAAフォノイコライザをIIRデジタルフィルタで実装する ②係数計算編(2022/2/26修正追記) | トップページ | RIAAフォノイコライザをIIRデジタルフィルタで実装する ④実装・評価編 »