波形botをVC++で書き直しました
2015/02/13初稿
Rubyのメモリ管理良く分からなかったぜ!serです。
タイトルの通り、以前Rubyで書いた波形bot@waveform_botをC++で書き直しました。今まではメモリを食いまくって解析出来なかった6分以上のファイルも出来るようになりましたし、DSDも解析出来るようになりました。ただ、数がPCMに比べてDSDは少ないので、あがることはめったにないとは思います。
書き始めた時からRubyじゃ厳しそうだよなぁと思いつつ、1年越しにやり遂げました!
概要は以下の通り。ブロマガにまとめたRuby版と仕様が変わった点は太字にしました。
・波形botの概要
1時間に1回、自分が持っているランダムに抽出されたある1曲についての曲情報を、波形,RMS値,スペクトログラムの画像とともにつぶやく
・曲情報の概要
ライブラリを”おおむね” /アーティスト名/アルバム名/曲名.wavで作っているので、そこからアーティスト名、アルバム名、曲名及びwaveフォーマットをアーティスト名:xx,アルバム名:xx,曲名:xx,ビット深度/サンプリングレートの順で表記
※あくまで”おおむね”なので例外の場合もあり、曲名やアルバム名が抜けたりする
※アルバム名をつぶやくと140字の制限に引っかかることが多いので、つぶやきにはアルバム名を含めていない。画像ファイルには載せてある。
・画像ファイルの概要-波形
・画像ファイルには曲情報をタイトルとし、波形(赤と青)、RMS値(黒線)をグラフにして表している。
・赤がLch、青がRch(普通はbLueで青がLch、Redで赤がRchのことが多いので注意)
・波形とRMS値は縦軸に大きさ、横軸に時間を取って表示している
・波形の音量の大きさはリニア表示
・RMS値の大きさはdB表示
・RMS値はおおよそ30msで平均を取っている
例1:ある曲をWavelab7で表示した波形
例2:ある曲を波形botで表示した波形
例3:1kHz,0dbから-96dbのサインスイープをWavelab7で表示した波形
例4:1kHz,0dbから-96dbのサインスイープを波形botで表示した波形
・画像ファイルの概要-スペクトログラム
・X軸が時間、Y軸が対数表示の周波数を表示したスペクトログラム
・周波数のレベルによって黒からオレンジへと変異する
・サンプルデータは単純なLR合成値(そのため、LRで位相が反転していると、スペクトログラムには反映されない)
・FFTのサンプル数は16384*Fs/(44.1|48)
(例:44.1/48kHz時は16384、88.2/96kHz時は32768)
・FFTは4096*Fs/(44.1|48)サンプル毎に実行
(例:44.1/48kHz時は4096、88.2/96kHz時は8192)
・音量の小さい曲だと見づらいため、ノーマライズしている
・7項ブラックマンハリス窓を採用
・サンプリングレートによってY軸の目盛りが変化するので注意。下から大目盛りが10,100,1000,10000(Hz)を表す。
例1:44.1kHzの場合の1kHz
例2:88.2kHzの場合の1kHz
例3:88.2kHzの場合の20kHzから20Hzのサインスイープ
例4:88.2kHzの場合の44.1kHzから20Hzのサインスイープ
・DSDの解析
・0dBFS=+6dBSACDとして計算
・IIRフィルタ→1/8間引き→IIRフィルタ→1/4間引きをし、Fs/32にして上記波形,スペクトログラムの表示を行っている
(例:DSD64の場合は88.2kHz、DSD128は176.4kHz)
・フィルタ設計にはDigital Filter Design Servicesを用いた。
http://momiji.i.ishikawa-nct.ac.jp/
例1:DSD128の44.1kHzから20Hzまでの0dBSACDサインスイープ
(0dBSACDのため、波形は半分の位置になる)
以上。ソースコード載せようとしたらブロマガにエラー吐かれた。欲しい人は言ってください。
・おまけ
DSDから波形を取り出すということは、PCM変換と同義なので、これからはDSD-PCM変換、そしてPCM-DSD変換にチャレンジしていきます。
Rubyのメモリ管理良く分からなかったぜ!serです。
タイトルの通り、以前Rubyで書いた波形bot@waveform_botをC++で書き直しました。今まではメモリを食いまくって解析出来なかった6分以上のファイルも出来るようになりましたし、DSDも解析出来るようになりました。ただ、数がPCMに比べてDSDは少ないので、あがることはめったにないとは思います。
書き始めた時からRubyじゃ厳しそうだよなぁと思いつつ、1年越しにやり遂げました!
概要は以下の通り。ブロマガにまとめたRuby版と仕様が変わった点は太字にしました。
・波形botの概要
1時間に1回、自分が持っているランダムに抽出されたある1曲についての曲情報を、波形,RMS値,スペクトログラムの画像とともにつぶやく
・曲情報の概要
ライブラリを”おおむね” /アーティスト名/アルバム名/曲名.wavで作っているので、そこからアーティスト名、アルバム名、曲名及びwaveフォーマットをアーティスト名:xx,アルバム名:xx,曲名:xx,ビット深度/サンプリングレートの順で表記
※あくまで”おおむね”なので例外の場合もあり、曲名やアルバム名が抜けたりする
※アルバム名をつぶやくと140字の制限に引っかかることが多いので、つぶやきにはアルバム名を含めていない。画像ファイルには載せてある。
・画像ファイルの概要-波形
・画像ファイルには曲情報をタイトルとし、波形(赤と青)、RMS値(黒線)をグラフにして表している。
・赤がLch、青がRch(普通はbLueで青がLch、Redで赤がRchのことが多いので注意)
・波形とRMS値は縦軸に大きさ、横軸に時間を取って表示している
・波形の音量の大きさはリニア表示
・RMS値の大きさはdB表示
・RMS値はおおよそ30msで平均を取っている
例1:ある曲をWavelab7で表示した波形
例2:ある曲を波形botで表示した波形
例3:1kHz,0dbから-96dbのサインスイープをWavelab7で表示した波形
例4:1kHz,0dbから-96dbのサインスイープを波形botで表示した波形
・画像ファイルの概要-スペクトログラム
・X軸が時間、Y軸が対数表示の周波数を表示したスペクトログラム
・周波数のレベルによって黒からオレンジへと変異する
・サンプルデータは単純なLR合成値(そのため、LRで位相が反転していると、スペクトログラムには反映されない)
・FFTのサンプル数は16384*Fs/(44.1|48)
(例:44.1/48kHz時は16384、88.2/96kHz時は32768)
・FFTは4096*Fs/(44.1|48)サンプル毎に実行
(例:44.1/48kHz時は4096、88.2/96kHz時は8192)
・音量の小さい曲だと見づらいため、ノーマライズしている
・7項ブラックマンハリス窓を採用
・サンプリングレートによってY軸の目盛りが変化するので注意。下から大目盛りが10,100,1000,10000(Hz)を表す。
例1:44.1kHzの場合の1kHz
例2:88.2kHzの場合の1kHz
例3:88.2kHzの場合の20kHzから20Hzのサインスイープ
例4:88.2kHzの場合の44.1kHzから20Hzのサインスイープ
・DSDの解析
・0dBFS=+6dBSACDとして計算
・IIRフィルタ→1/8間引き→IIRフィルタ→1/4間引きをし、Fs/32にして上記波形,スペクトログラムの表示を行っている
(例:DSD64の場合は88.2kHz、DSD128は176.4kHz)
・フィルタ設計にはDigital Filter Design Servicesを用いた。
http://momiji.i.ishikawa-nct.ac.jp/
例1:DSD128の44.1kHzから20Hzまでの0dBSACDサインスイープ
(0dBSACDのため、波形は半分の位置になる)
以上。ソースコード載せようとしたらブロマガにエラー吐かれた。欲しい人は言ってください。
・おまけ
DSDから波形を取り出すということは、PCM変換と同義なので、これからはDSD-PCM変換、そしてPCM-DSD変換にチャレンジしていきます。