SRC(スキャンレートコンバーター)の精度を上げる。田舎に引っ込んで土地は余っているから、広くて天井高けりゃ良かろうと、オーディオ部屋を建てたのは数年前。36畳で高さは平均5mぐらいなので、容積は300立米ほど。16畳~小屋裏はそのまま。高さ方向は五角形になる。一階と二階にスピーカーを置く。二階の方が遙かに良い響きになるので。一階はウーハーのみになった。ベイマの45cmPA用。日記SRC(スキャンレートコンバーター)の精度を上げる。Tweet2017年05月23日SRC(スキャン・レート・コンバーター)を、24bit精度でも耐えられるように作り直した。最初は、たしかDSDの88.2kを96kに上げるために作ったはず。標準の状態だと、PCに88.2kは送れないのでそのために変換したんだと思う。元が元なので、そんなに精度は高くなかった。本来の24bit精度であれば、八本ぐらい出ている余計なスペクトルは出ない。大本の6.3kHzのスペクトルが一本出るだけ。これでもノイズ電力としては-110dBFSの少し下なので、SNとしては110dBぐらいあって、16bit精度であれば何の問題もない。現実の使用環境で、100dBを超えるSNはまず有り得ないから、実用上これで十分。それでももっと精度を出す気になったのは、この余計な八本のスペクトルの来歴を確かめるため。これは結構長い旅をしてここまで来ている。その長い旅は多くの場合無視できるけれど、ADCを使っているような環境(例えばデジタルチャンデバの使用)では、知らず知らず足をすくわれている可能性が高い。88.2kを96kに上げる場合、アルゴリズムは一つしかないと思う。88.2*160=14112kHzにアップサンプリングしてから、14112kHz/147=96なので147に一回の割で間引く。元の88.2Kサンプリングを理想的なDACでアナログに戻し、それを理想的なADCを使って、96KHzで再サンプリングする。理想的なDACやADCは存在しないし、既にデジタル化されたデータであるから、そのままデジタル処理し、アナログで再サンプルしたのと同じ結果を出そうというのがSRC。これはデジタル的な計算なので、精度さえ良ければSRCでの劣化はない。単純に、変換後のスペクトルに余計なものが含まれていなければ良し、という話。FPGAマガジンの11にも、同じSRCの記事があった。これは主に、Cで書いたSRCのプログラムを、高位合成でHDLに変換し、最終的にはFPGAのハードウエアに落とし込むという記事。Cでプログラムを書くと、ハードウエア化が出来ますよ、という今は主流になりつつある方法論。純粋オーディオではないので、16bit精度で計算していた。プログラム自体は、32bit精度でも特に問題はない。アップサンプリングや、間引きの過程で必要になるデジタルフィルターの係数が問題。この係数の計算は、ネットで探すとそれなりにはフリーソフトがある。詳しく探していないけれど、それなり以上の物はないと思う。アップサンプリングや間引きの過程では、余計なスペクトルを綺麗に取っておかないと、余計なスペクトルがノイズとして残ってしまう。係数を32bitにするのは難しくないけれど、思っているような肩特性と遮断帯域での減衰量をそこそこ制御できるような計算ソフトは中々ない。ない場合、買うか作るか。オーディオは、ないので作る。デジタルフィルターも作るしかない。値段の問題でなく、必要なものは自分で作る方が確実、木工職人が、必要な刃物や治具を自作するようなもの。それが必要な特殊用途に一番詳しいのは本人なんだから、自作が一番という当たり前の話。幸せが金で買えないというのは、さて、それに近いのか遠いのか。幸せの形が皆違うというのであれば、そう。デジタルフィルター設計に重要なのは、肩特性と遮断帯域での減衰量。チャンネルデバイダー必須のオーディオ用であれば特に。欲しい周波数特性を書いたなら、そのために必要な係数を計算してくれるのが良い。フリーソフトはそうなっていない。カットオフ周波数は決められるけれど、肩特性は急峻にする事しか考えていない。デジタルフィルターの係数と周波数特性との間には、密接な関係がある。当たり前ではあるけれど、幸運な事にこれはほぼ一対一で対応する。デジタルフィルターの係数というのは、実は時間軸での電圧波形と同じ。それは昔の偉い人が苦労して考えた理論なので、後世の人は結果を使わせて貰う。電圧波形をフーリエ変換すると周波数特性になる。周波数特性をフーリエ逆変換すると電圧波形になる。必要な周波数特性を書いたなら、それをフーリエ逆変換して電圧波形にすると、デジタルフィルターの係数が出てくる。これは直線位相のFIRになる。音声用としては、位相が変化しない特性は好ましいので、これで問題ない。ネットで調べるとあれこれと数式が出て来るけれど、何が目的なのかサッパリ分からん。必要なのは、肩特性と遮断帯域での減衰量を含んだ周波数特性を実現するための、デジタルフィルターの係数。それは難しい事言う必要など全然なくて、目的の周波数特性をフーリエ逆変換すれば良い。これは、そのままでは4096次までに制約されるけれど、エクセルで簡単に実現できる。C列に周波数特性を入れる。この例はバンドパスフィルターで、2.2kから3kが通過帯域。低い方は、40db/octで高い方は60db/octで落ちるような設定。実際に出てきた係数を元にした周波数特性でも、そこそこ合っている。1024次でもこのぐらいにはなる。遮断帯域での減衰量は、これまた昔の偉い人が考えてくれた結果を使う。ベッセル関数というので重み付をするらしい。α=6とα=6.6の二つを表示してる。赤のα=6.6にすると、-160dBぐらい落ちるので、十分な数字。青のα=6だと、24bit精度のSRC用には少し厳しい感じ。この辺りは少しばかり試行錯誤が必要。周波数特性も、低い方では密度が疎になるので少し難しくなる。状況次第で、次数を増やしたりサンプリング周波数を変えたりもする。係数が決まれば後は計算。ソフト的な計算しかしないのであれば、160倍に上げてから147で間引くのが良いと思う。処理が一度だけなので誤差が出る可能性が低い。次数は上がるけれども、ソフト的には問題がない。処理時間次第で、二つぐらいに分けた方が良い可能性はある。FPGAのハード的な計算ならば、一度で上げるのは無理。八倍のオーバーサンプリングは良く使う回路で、既に実績があるのでまず八倍。その後に20/147。普段使う八倍オーバーサンプリングは、α=6の赤ぐらいの特性。SRC用でも問題はないけれど、青のα=7の係数にする。20倍オーバーサンプリングは些か問題。昔のDSD用は赤の特性。1MHzを超えた所でも、-120dBぐらいしか落ちない。ここをもっと落とさないと、余計なスペクトルが残る。青の特性ならば問題なし。この特性は、500kHを超えた辺りぐらいでないと遮断性能が悪いが、その前の八倍オーバーサンプリングとの合わせ技になるので問題はない。八倍オーバーサンプリングの高調波は、(88.2x8)±6.3、2x(88.2x8)±6.3、3x(88.2x8)±6.3、4x(88.2x8)±6.3、・・・・・の所にしか出ない。20倍オーバーサンプリングが500kHを超えた辺りから上を担当するので、一番下の705.6±6.3でも十分にレベルが落ちる。実際の所、DSD用の余計な八本のスペクトルは、昔のフィルターでは500kHを超えた辺りの遮断性能に問題があったので、出ていた。計算してみると、昔の余計な八本のスペクトルは、ここから来ている。10.6MHzあたり500kHを超えた辺りから、更に40dB近く落とすようにしたので、これらは全て消えてこうなった。24bit精度として問題のない特性。こんな高い周波数であっても、サンプリングする過程では、低い可聴周波数に落ちてくる。通常のアナログ信号のサンプリングも同じ。帯域制限はするにしても、こんなRFの周波数は何処からでも入ってくる。ないという環境はとても稀。出てしまうのは間違いないとして、どのぐらいのレベルであるかが分かれ目。デジタル処理であれば完全に落とせる。デジタルのチャンネルデバイダーは、大抵の場合アナログで入力する。96kHzぐらいのサンプリングだと、96kHz毎に周波数変換するのでとても不利。サンプリング周波数が高い程、適切なデジタル処理でこの手のノイズの影響を受けなくなる。32bitのDACというのは全くもって意味不明ながら、ADCの場合、色の白いは七難隠すで、レートの高いは七難隠す。言っても、DACはアナログの出力をしてしまうので、やはりRFの影響は受ける。ラズベリーpiのブルートゥース付きは、アナログの電線がそのコネクターの近くにあると、かなりのノイズが聞こえるとか。今の電子機器は、素の性能ならば特に問題はない。全部つないだ時にどうなっているかが問題。それはユーザーしか分からないし、メーカーは分かっていても言わない。結果として、何をしても音が変わる状況になって、それは商売として好ましい。デジタルフィルターの係数を少し変えて、24bit精度でも問題のないSRCが完成。係数自体は32bitになった。FPGAの掛算器は24x18bit。今でも24bitx24bitには、二個必要。24bitx32bitでも同じく二個。係数用のROMの容量が少し増えるだけ。以前の状態でも実用的には問題なし。ほんの少しの回路変更で余計なスペクトルが消えるので、やって損はなし。ADCは思わぬ所からノイズを拾うのだと分かった。SRCの効能は、デジタルのチャンネルデバイダーが簡単になる事。場合、44.1kと96kのサンプリング周波数は必要になる。自動的に、チャンネルデバイダーの係数も二セット必要。計算自体はエクセルがするし、ROMの容量もタカはしれている。言っても、何か変更した時には両方の確認が必要。48kなんかがあると、もう大変。SRCで、再生時には全てを96kに統一した方が間違いは減る。SRCの意味合いは、デジタルフィルターの個数を減らせること。クリスタルも一種類で済む。細かい話ながら、これは結構ボディブローのように効いてくる。いうデジタル処理は嫌われる傾向にある。人は見た目が全てで、音も然りみたい。今のDACは、ほとんどがΣΔなので、デジタル処理の音しか聞いていない。6bitで、DSDなら1bit。それをデジタル処理で、実質20bitぐらいの分解能にしている。理論的にはこれで良かろうという事で聴いてみたら、確かに宜しいので、6bit程度が主流。物理現象は、数字として一致していればその来歴は関係ない。6bitや24bitは、仮の姿。元の44.1kが96kに変わっても、数字として同じであれば同じもの。アナログのアンプも、入力と出力は、種と実以上に血は薄い。出力とは、入力の電圧をなぞって電源の電圧を変化させ、同じ電圧を作っているだけ。同じ時間軸で電圧が変化しているならば、両者は同じものである、という話。物理現象とは、そういう割り切りで成り立っている。ΣΔのDACを使いつつ、デジタルのボリュームが嫌というのは、弓矢は良いが鉄砲は卑怯だ、という感じなのかなあ。←前回の日記レス一覧yamamoto2002さん、こんにちは。情報を有難うございます。これはアプリケーションではなくて、関数のライブラリーのようなものだと思うのですが、これを使って必要な特性の係数を計算するプログラムを作るとなると、エクセルの方が簡単でないでしょうか。それとも何か簡単な方法があるのでしょうか。16:04yamamoto2002さん、こんにちは。コンパイルの必要があるかと思ったのですが、コマンドの使い方を覚えるだけで簡単でした。他にも色々な技術計算用の関数があって、とても役に立ちそうです。知らない間に時代は進んで行ってます。私の知る限りのデジタルフィルター設計の本で、Scilabを使って説明しているものはありません。不必要に難解な数式を並べているものが大半です。結局の所、今は何処かに良い物はあるけれど、中々辿りつけません。これからのネット社会では、検索技術が最も重要になっていくのでしょう。14:23如月さん、こんばんは。Scilabも良いですがOctaveも良いですよと宣伝(私はOctave派なので)。3wayや4wayのチャンデバの係数を計算したり任意の周波数特性の直線位相フィルタや最小位相フィルタを計算するスクリプトなどを作って使っています。17:56assiさん、こんばんは。コメント有難うございます。私が作るプログラムは、ARMマイコンでのCとかアセンブラが大半で、WindowsやLinux用の経験はなく開発環境もありません。しても高級言語方面には苦手意識があります。新しく細かい書式を覚えるのは嫌だなあ、という感じなので、エクセルで済ましています。一つの言い訳としては、ブラックボックスを極力減らしたいというのがあります。OSはAPI経由となりますので、ファイルのフォーマット状態や実際の処理内容は分かりません。再生ソフトでの音の違い、音源をHDDに置くかSSDに置くかでの違い、等と言われると、OSが絡んでいるともう追跡は不可能です。オーディオの場合、音声データをSDカードから読み出せば良いだけですので、私は簡単にFPGAとARMだけで済ませます。利便性は少し落ちますけれど、自分用としてはそれで問題ありません。いえ、SDカードはブラックボックスで、その前のコンパクトフラッシュから結構泣かされました。目的は同じでも、ソフトとハードの組み合わせは色々あって、面白いなと思います。レコードと真空管、というのだってあります。オーディオは、その幅がとても広い感じです。20:23yamamoto2002さん、こんにちは。