« フリーソフト - upconvfe 0.8.x のページ | トップページ | Upconv Frontend 0.8.x 説明書 »

2019年11月12日 (火)

upconv 0.8.x ソースコード公開ページ

フリーソフトの upconv 0.8.x(TEST版)を公開していますが、GPLなのでソースコード公開ページとして記載します。

upconv 0.8.x のソースコードは こちら から取得できます。

upconvのソースコードは upconv_src.zip と upconvfe_080 に分かれています。
upconv_src は変換本体です。
upconvfe_080 は変換をするプログラムを呼び出す GUI 部分です。

開発環境は windows で、msys2 (mingw64、mingw32)上で動作する gcc と embarcadero の RAD Studio (XE5 有償版)を使っています。
GUI 部分はRAD Studio の C++ Builder で作成しています。

upconv.exe は msys2 の mingw64かmingw32を開き、
upconv_src/upconv/build.shを実行するとビルドできます。

upconvfe.exeは
upconv_080の下にプロジェクトファイルがあるのでC++Builderから開き、
C++Builder からビルドできます。
C++BuilderにはC++Builder Community Editionがあります。

FFTを使用するサンプリングレートの変換方法を知りたい方は参考にどうぞ。
またupconvfe.exeのGUIの動きに興味がある方は参考にどうぞ。
(他のコマンドラインで動く変換プログラムのフロントエンドを作りたい方などの参考に)

upconv_080/Output/old_ver にはUpconv 0.0.3~のupconv_setup.exeが入っています。
それぞれのソースコードのバージョンは過去にPCがおかしくなったときに無くなってしまったのでありません。

 

 

[Upconv内部処理について]

Upconv frontend 0.8.x ですが0.7.x などから以下のところを変更しています。

変換本体がwav2raw.exe(wavから1チャンネルごとの作業用ファイル(64Bit整数)を作成するのに使用)と
upconv.exe(サンプリングレート変換)とwav2raw.exe内のrawからwavに変換するもの。
それとマルチチャンネル変換処理用のmconv.exeに分かれてました。
10年ぐらい前から作っていたもので、パラメータも多く名前も規則がないものを付けており、わかりにくいためupconv.exe1つで変換ができるように作り直しました。
0.7.xまではGUI部分も以下のように制御してました。

1.Decode(FlacやMP3など)
2.wav2raw.exeでrawファイルに変換
3.upconv.exeをwavのチャンネル数分だけ起動しサンプリングレート変換
4.3がすべて終わったらマルチチャンネル変換用にmconv.exeを起動
5.wav2raw.exeで変換後のrawファイルからwavファイルへ変更
6.Encode(Flacなど)

現行のものより前は2と5の処理がwav2raw.exeとraw2wav.exeに分かれてました。
GUI部分も処理が大変でしたが今回はupconv.exeを1つ呼び出すだけにして、複数個upconv.exeを呼び出すことで同時変換ができるようになりました。

変換パラメータが多すぎなので、パラメータファイルとしてファイルに保存しておくことで、upconv.exeに渡す引数も減らせました。

0.8.x の処理は以下のような流れになっています。

1.GUIからupconv.exeを起動
2.upconv.exe内部でrawファイルに変換
3.upconv.exe内部からwavのチャンネル数分だけupconv.exeを起動しサンプリングレート変換(変換中はupconv.exeが3つ動きます)
4.マルチチャンネル変換ならupconv.exe内部でマルチチャンネル生成の処理を実施
5.upconv.exe内部でrawファイルをwavに変換
6.upconv.exe内部でEncode(Flacなど)

変換の基本部分に問題がないかノイズが入らないかも再チェック中です。
今後はもう0.8.xのような大きな変更はないでしょう。

同時にノイズリダクション部分やHFA3の倍音生成部分もいじってます。
現行バージョンと聞き比べながら変更してますがなかなか難しいです。

0.8.4のHFA3をベースに補間処理の内容を記載します(Sig2生成)。
1.使用するパラメータを決定します
   HFA3 Freq Start = デフォルトは8000
   HFA3 Freq Len = デフォルトは3000
   HFA Analyze Step = デフォルトは0.7.7.4は77、0.8.2は273、0.8.2は203
   Start <- HFA3 Freq Start
   Offset <- 0
   Step   <- HFA Analyze Step
   HighHz <- 16kHz もしくは HFC。HFA3 Analysis Limit AdjustがあればHighHzを補正(-4であれば12kHzに制限)
2.以下を繰り返し調査し補間する信号を決定します
   HFA3 Freq Start から HFA3 Freq Lenの範囲を調査の開始点とします。
   (生成される信号の元はここになります)
   音声をFFT(DFT)してPowerを求めたものをHFA3 Feq StartからHFA3 Freq lenの範囲をずらしながら調査します。
   調査点をStart + Offset として、Step ずらしたPowerを求め、1つ前のStepのPowerとの差を調べます。
   Powerの差を元に、1/f、鋸波(nの逆数で小さくなる)、短形波(奇数倍音,nの逆数で小さくなる)、三角波(奇数倍音,n^2の逆数で小さくなる)、パルス(n番目の倍音でもパワーは同じ)、その他のうち差が小さいものを採用して差を累積していきます。
   Stepごとにずらして調べる範囲は最大でHighHzまでです。
   予想した音声信号と実際の音声Power(Start + Offset から HighHzまで)と実際の音声Powerの差が少なかったものを生成したデータとして蓄積します。

3.蓄積した予想データを元にsin波を生成してHFC以上で出力サンプリングレートの半分の音までの高域音声を求めます(周波数ごとのsin波をベースとしています)。
4.元音声をHFC以下でカットしたデータと高域の生成したデータを合成します。
5.元音声と高域のデータの音レベルをリアルタイムで再調整します(0.8.4でこの部分を見直しました)。

バージョンアップをしていくうちにSig1とSig3はあまり重要ではなくなっていきました。
バイオリンなどは倍音がありますが、マラカスや雨の音も本来は耳に聞こえないぐらいの高域まで音が入っています。
倍音がないものでも、それらしく見える場合は音生成の元となり音を高域補間します。
デジタル化やDSDでの録音時にノイズで埋もれて超高域が無くなってしまった場合でも本来あるデータに近いものが生成されるので、低域と高域の音バランスが本来のものになり、自然に聞こえるようになります。
ただし、圧縮率が高いものは入っているはずの音(周波数的に見たもの)がいきなりなくなっていたりおかしくなっていたりするので、変なデータから正しい音を復元するのは困難です。また、海苔音源(音を大きくしすぎて台形になってしまってるものや、イコライザで変に高域を持ち上げているものはきんきんしたり、音のレベルが16Bit/24Bit/32Bitを超えて音がつぶれて雑音になったりします。
VLAで音を下げるなどが必要です。

あと独学なので変なところがあるかもしれません。

バイオリンやピアノの音をWaveSpectraで見て8kHzから220Hzごとに定期的に音が出てる。これを全部プログラムで調べて、生成してみてはどうだろうというところから始まってます。
(人は見て判断できますが)

 

« フリーソフト - upconvfe 0.8.x のページ | トップページ | Upconv Frontend 0.8.x 説明書 »

コメント

コメントを書く



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




« フリーソフト - upconvfe 0.8.x のページ | トップページ | Upconv Frontend 0.8.x 説明書 »