波形botをVC++で書き直しました

2015/02/13初稿

 Rubyのメモリ管理良く分からなかったぜ!serです。

 タイトルの通り、以前Rubyで書いた波形bot@waveform_botC++で書き直しました。今まではメモリを食いまくって解析出来なかった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変換にチャレンジしていきます。