efuさんのページに、下のWTCさんの変換ツールによるサンプリングレート変換を
した場合の諸特性が掲載されています(「サンプリングレート周波数変換の特性」のところです)。
WTCさんのツールが非常に高精度であることが
よくわかりますので、一読されることをお薦めいたします。
(efuさん、WTCさん、ありがとうございましたm(__)m)
('00.5.9)
WTCさんのツールがバージョンアップされました。
ダウンロード: WCONV04A.LZH
以下は、READMEの変更履歴の抜粋です。
−−−−−−−−−− ここから −−−−−−−−−−
《wavefs44.exe》 version 0.4 サンプリング値を整数値変換するところを四捨五入に変更 関係ないデータ読み捨て処理の終了判定ミスを修正 《wavedemp.exe》 version 0.2 サンプリング値を整数値変換するところを四捨五入に変更 関係ないデータ読み捨て処理の終了判定ミスを修正 PCMデータの残り判定がおかしかったのを修正 (PCMデータ後にタグが続くとゴミがつく/サイズ不整合発生を修正)−−−−−−−−−− ここまで −−−−−−−−−−
《wavefs44.exe》 version 0.3 出力ファイル中のRIFFタグのサイズがおかしいのを修正 出力Fs=32k/48k対応 plextor managerで見えるファイルでdataチャンクに値が入らないのに対応−−−−−−−−−− ここまで −−−−−−−−−−
※主な修正内容: 《wavefs44.exe》 version 0.1 暫定公開版 version 0.2 デフォルトゲインを255/256に変更 飽和処理追加 処理経過表示追加 処理経過表示抑制オプション「q」追加 入力Fs=32kHz時のフィルタ周波数/次数見直し フィルタ周波数/次数を指定できるf/oオプションで追加 《wavedenp.exe》 version 0.1 暫定公開版 version 0.1a デフォルトゲインを1に変更−−−−−−−−−− ここまで −−−−−−−−−−
WAVファイルサンプリングレート変換「wavefs44.exe」 version 0.1
WAVファイルディエンファシス「wavedenp.exe」 version 0.1
(ともに暫定版公開)
copyright(c) 2000 by WTC
ダウンロード: WAVECONV.LZH
48kHzサンプリング/32kHzサンプリングのWAVEファイルを44.1kHzに
リサンプリングするソフト「wavefs44.exe」と, 時定数50μs/15μs
のエンファシスがかかったWAVEファイルをディエンファシスする
(エンファシスを解除する)「wavedenp.exe」です。
【用法】
《wavefs44.exe》
wavefs44 <name1> <name2> [g<gain>] [p<0..3>]
name1 : source wave file name
name2 : destination wave file name
g<gain> : amplitude parameter
p<0..3> : precision(0:low, 1:mid, 2:High, 3:UltraHigh)
例)C:\>wavefs44 infile.wav outfile.wav g1 p3
のように使います。pオプションは大きい値にするほど高い周波数の成分まで残しますが
その分処理時間がかかります。目安として入力がFs=48kHzなら, K6-2/400で再生時間比:
0:×0.4, 1:×1.5, 2:×3, 3:×4程度です。
《wavedenp.exe》
wavedenp <name1> <name2> [<gain>]
name1 : source wave file name
name2 : destination wave file name
gain : amplitude parameter("A" を指定すると引き続く値をピーク値に正規化)
例)C:\>wavedenp infile.wav outfile.wav 2 ・・・・・変換ついでにレベルを倍に
C:\>wavedenp infile.wav outfile.wav A30000・・・変換後最大値を30000に調整
のように使います。gainパラメータにAを指定すると2パス動作になり処理時間も倍程度
になります。
【技術解説】
「wavefs44.exe」は, 48kHz→44.1kHzのリサンプル処理を,
1)入力PCMデータを44.1kHzと48kHzの最小公倍数の48kHz×147でオーバサンプリングする
(補間は0を入れる)
2)ローパスフィルタで21kHz(厳密には精度パラメータで変えている)以上の成分をカット
3)データを間引いて44.1kHzに落とす
という手順で実行します。
LPFは8191次〜65535次のFIR(カイザー窓)を使用してます(次数をpオプションで制御)。
この次数をまじめに計算すると大変なのですが, 入力が147回に1回だけ非0であること,
どのみち44.1kHzに落とすので160サンプルおきに計算すればいいので実際の計算量は
ずっと少なくなります(ただし, 係数テーブル自体はとても大きいのでキャッシュが
効かず高速化が難しいかもしれません)。
32kHzも同様に最小公倍数までFsを上げ15kHz程度のLPFを通すようにしてますが, まだ
デバッグしてません。
なお, 内部計算はすべてdoubleで行っています。
「wavedenp.exe」は, 時定数50μs/15μsのエンファシスが加えられたPCMデータのエン
ファシスを解除します。エンファシスは, 50μs(すなわち3kHzちょっと超えたあたり)
から6dB/octで利得が上がり, 15μs(すなわち10kHzあたり)から平坦になるような高域
強調が加えられてます。これを元に戻します。
エンファシスは, BS(衛星放送)のデジタル音声, CS-PCM(ミュージックバード)のPCM
放送などで加えられています。従って, デジタル入力を持つサウンドカードでこれらの
ソースをそのまま取り込んだデータを普通に再生すると高域が強調された音になって
しまいます。そういう場合このソフトでディエンファシス処理してやれば通常のPCM
音源で正しく再生できるデータになります。
本プログラムではこのディエンファシスの特性を, 1次のIIRで実現しています。
一応, エンファシスフラグを立ててデジタルオーディオ機器に入力したときの再生
出力を再度DATでデジタル化したデータと, 本ソフトでディエンファシスしたデータが
同等の周波数特性になっていることは確認しました(但し48kHzのみ確認)。
計算自体は単純なので割と高速のため, 2パス処理で自動レベル調整機能も入れてみま
した。
※開発は当初gnu-win32環境でgccでやってましたが, 昔買ったVC++2.0でもコンパイル
できることがわかったので今回の実行ファイルはVC++2.0でコンパイルしてます。
だからソース自体(現時点で未公開)はlinux等のgcc環境でも利用できるでしょう。
2000.2.28 WTC(SGL01007@nifty.ne.jp)